From 569a78e0fbcc1738a8511dd839757899d8ebd9c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Fri, 29 Apr 2022 15:45:41 +0800 Subject: [PATCH 001/126] make s3 as extension --- components/file/s3/aws/oss.go | 53 ++++- components/go.mod | 9 +- components/go.sum | 66 +++--- demo/file/client.go | 29 +-- demo/go.mod | 4 + demo/go.sum | 15 +- spec/proto/extension/v1/s3.pb.go | 378 +++++++++++++++++++++++++++++++ 7 files changed, 499 insertions(+), 55 deletions(-) create mode 100644 spec/proto/extension/v1/s3.pb.go diff --git a/components/file/s3/aws/oss.go b/components/file/s3/aws/oss.go index ff8c4d896b..a42b276574 100644 --- a/components/file/s3/aws/oss.go +++ b/components/file/s3/aws/oss.go @@ -21,6 +21,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/aws/aws-sdk-go-v2/feature/s3/manager" "io" "strings" @@ -36,6 +37,7 @@ const ( endpointKey = "endpoint" bucketKey = "bucket" defaultCredentialsSource = "provider" + fileLength = "length" ) var ( @@ -94,6 +96,19 @@ func (am *AwsOssMetaData) isAwsMetaValid() bool { // createOssClient by input meta info. func (a *AwsOss) createOssClient(meta *AwsOssMetaData) (*s3.Client, error) { + customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) { + if region == meta.Region { + return aws.Endpoint{ + PartitionID: "aliyun", + URL: "https://" + meta.EndPoint, + SigningRegion: meta.Region, + HostnameImmutable: true, + }, nil + } + // returning EndpointNotFoundError will allow the service to fallback to it's default resolution + return aws.Endpoint{}, &aws.EndpointNotFoundError{} + }) + optFunc := []func(options *aws_config.LoadOptions) error{ aws_config.WithRegion(meta.Region), aws_config.WithCredentialsProvider(credentials.StaticCredentialsProvider{ @@ -102,7 +117,9 @@ func (a *AwsOss) createOssClient(meta *AwsOssMetaData) (*s3.Client, error) { Source: defaultCredentialsSource, }, }), + aws_config.WithEndpointResolverWithOptions(customResolver), } + cfg, err := aws_config.LoadDefaultConfig(context.TODO(), optFunc...) if err != nil { return nil, err @@ -112,6 +129,7 @@ func (a *AwsOss) createOssClient(meta *AwsOssMetaData) (*s3.Client, error) { // Put file to aws oss. func (a *AwsOss) Put(ctx context.Context, st *file.PutFileStu) error { + //var bodySize int64 bucket, err := loss.GetBucketName(st.FileName) if err != nil { return fmt.Errorf("awsoss put file[%s] fail,err: %s", st.FileName, err.Error()) @@ -120,16 +138,35 @@ func (a *AwsOss) Put(ctx context.Context, st *file.PutFileStu) error { if err != nil { return fmt.Errorf("awsoss put file[%s] fail,err: %s", st.FileName, err.Error()) } - input := &s3.PutObjectInput{ - Bucket: &bucket, - Key: &key, - Body: st.DataStream, - } + //if fileLen, ok := st.Metadata[fileLength]; !ok { + // return errors.New("please specific the file lenth in metadata with length key") + //} else { + // bodySize, err = strconv.ParseInt(fileLen, 10, 64) + // if err != nil { + // return errors.New("wrong value of length") + // } + //} + + //input := &s3.PutObjectInput{ + // Bucket: &bucket, + // Key: &key, + // Body: st.DataStream, + // ContentLength: bodySize, + //} client, err := a.selectClient(st.Metadata) if err != nil { return err } - _, err = client.PutObject(context.TODO(), input, nil) + uploader := manager.NewUploader(client) + _, err = uploader.Upload(context.TODO(), &s3.PutObjectInput{ + Bucket: &bucket, + Key: &key, + Body: st.DataStream, + }) + + //_, err = client.PutObject(context.TODO(), input, s3.WithAPIOptions( + // v4.SwapComputePayloadSHA256ForUnsignedPayloadMiddleware, + //)) if err != nil { return err } @@ -171,7 +208,7 @@ func (a *AwsOss) Get(ctx context.Context, st *file.GetFileStu) (io.ReadCloser, e if err != nil { return nil, err } - ob, err := client.GetObject(context.TODO(), input, nil) + ob, err := client.GetObject(context.TODO(), input) if err != nil { return nil, err } @@ -195,7 +232,7 @@ func (a *AwsOss) List(ctx context.Context, st *file.ListRequest) (*file.ListResp if err != nil { return nil, fmt.Errorf("list bucket[%s] fail, err: %s", st.DirectoryName, err.Error()) } - out, err := client.ListObjects(context.TODO(), input, nil) + out, err := client.ListObjects(context.TODO(), input) if err != nil { return nil, fmt.Errorf("list bucket[%s] fail, err: %s", st.DirectoryName, err.Error()) } diff --git a/components/go.mod b/components/go.mod index 4d52b353d1..6e5b599164 100644 --- a/components/go.mod +++ b/components/go.mod @@ -6,10 +6,11 @@ require ( github.com/alicebob/miniredis/v2 v2.16.0 github.com/aliyun/aliyun-oss-go-sdk v2.1.8+incompatible github.com/apache/dubbo-go-hessian2 v1.7.0 - github.com/aws/aws-sdk-go-v2 v1.9.1 - github.com/aws/aws-sdk-go-v2/config v1.8.2 - github.com/aws/aws-sdk-go-v2/credentials v1.4.2 - github.com/aws/aws-sdk-go-v2/service/s3 v1.16.0 + github.com/aws/aws-sdk-go-v2 v1.16.3 + github.com/aws/aws-sdk-go-v2/config v1.15.4 + github.com/aws/aws-sdk-go-v2/credentials v1.12.0 + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.6 + github.com/aws/aws-sdk-go-v2/service/s3 v1.26.6 github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f // indirect github.com/go-redis/redis/v8 v8.8.0 github.com/go-zookeeper/zk v1.0.2 diff --git a/components/go.sum b/components/go.sum index cb0e47f59b..93428f5f7f 100644 --- a/components/go.sum +++ b/components/go.sum @@ -89,30 +89,42 @@ github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6l github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/aws/aws-sdk-go-v2 v1.9.1 h1:ZbovGV/qo40nrOJ4q8G33AGICzaPI45FHQWJ9650pF4= -github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= -github.com/aws/aws-sdk-go-v2/config v1.8.2 h1:Dqy4ySXFmulRmZhfynm/5CD4Y6aXiTVhDtXLIuUe/r0= -github.com/aws/aws-sdk-go-v2/config v1.8.2/go.mod h1:r0bkX9NyuCuf28qVcsEMtpAQibT7gA1Q0gzkjvgJdLU= -github.com/aws/aws-sdk-go-v2/credentials v1.4.2 h1:8kVE4Og6wlhVrMGiORQ3p9gRj2exjzhFRB+QzWBUa5Q= -github.com/aws/aws-sdk-go-v2/credentials v1.4.2/go.mod h1:9Sp6u121/f0NnvHyhG7dgoYeUTEFC2vsvJqJ6wXpkaI= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.5.1 h1:Nm+BxqBtT0r+AnD6byGMCGT4Km0QwHBy8mAYptNPXY4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.5.1/go.mod h1:W1ldHfsgeGlKpJ4xZMKZUI6Wmp6EAstU7PxnhbXWWrI= -github.com/aws/aws-sdk-go-v2/internal/ini v1.2.3 h1:NnXJXUz7oihrSlPKEM0yZ19b+7GQ47MX/LluLlEyE/Y= -github.com/aws/aws-sdk-go-v2/internal/ini v1.2.3/go.mod h1:EES9ToeC3h063zCFDdqWGnARExNdULPaBvARm1FLwxA= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.3.0 h1:gceOysEWNNwLd6cki65IMBZ4WAM0MwgBQq2n7kejoT8= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.3.0/go.mod h1:v8ygadNyATSm6elwJ/4gzJwcFhri9RqS8skgHKiwXPU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.1 h1:APEjhKZLFlNVLATnA/TJyA+w1r/xd5r5ACWBDZ9aIvc= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.1/go.mod h1:Ve+eJOx9UWaT/lMVebnFhDhO49fSLVedHoA82+Rqme0= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.7.1 h1:YEz2KMyqK2zyG3uOa0l2xBc/H6NUVJir8FhwHQHF3rc= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.7.1/go.mod h1:yg4EN/BKoc7+DLhNOxxdvoO3+iyW2FuynvaKqLcLDUM= -github.com/aws/aws-sdk-go-v2/service/s3 v1.16.0 h1:dt1JQFj/135ozwGIWeCM3aQ8N/kB3Xu3Uu4r9zuOIyc= -github.com/aws/aws-sdk-go-v2/service/s3 v1.16.0/go.mod h1:Tk23mCmfL3wb3tNIeMk/0diUZ0W4R6uZtjYKguMLW2s= -github.com/aws/aws-sdk-go-v2/service/sso v1.4.1 h1:RfgQyv3bFT2Js6XokcrNtTjQ6wAVBRpoCgTFsypihHA= -github.com/aws/aws-sdk-go-v2/service/sso v1.4.1/go.mod h1:ycPdbJZlM0BLhuBnd80WX9PucWPG88qps/2jl9HugXs= -github.com/aws/aws-sdk-go-v2/service/sts v1.7.1 h1:7ce9ugapSgBapwLhg7AJTqKW5U92VRX3vX65k2tsB+g= -github.com/aws/aws-sdk-go-v2/service/sts v1.7.1/go.mod h1:r1i8QwKPzwByXqZb3POQfBs7jozrdnHz8PVbsvyx73w= -github.com/aws/smithy-go v1.8.0 h1:AEwwwXQZtUwP5Mz506FeXXrKBe0jA8gVM+1gEcSRooc= -github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aws/aws-sdk-go-v2 v1.16.3 h1:0W1TSJ7O6OzwuEvIXAtJGvOeQ0SGAhcpxPN2/NK5EhM= +github.com/aws/aws-sdk-go-v2 v1.16.3/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1 h1:SdK4Ppk5IzLs64ZMvr6MrSficMtjY2oS0WOORXTlxwU= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= +github.com/aws/aws-sdk-go-v2/config v1.15.4 h1:P4mesY1hYUxru4f9SU0XxNKXmzfxsD0FtMIPRBjkH7Q= +github.com/aws/aws-sdk-go-v2/config v1.15.4/go.mod h1:ZijHHh0xd/A+ZY53az0qzC5tT46kt4JVCePf2NX9Lk4= +github.com/aws/aws-sdk-go-v2/credentials v1.12.0 h1:4R/NqlcRFSkR0wxOhgHi+agGpbEr5qMCjn7VqUIJY+E= +github.com/aws/aws-sdk-go-v2/credentials v1.12.0/go.mod h1:9YWk7VW+eyKsoIL6/CljkTrNVWBSK9pkqOPUuijid4A= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.4 h1:FP8gquGeGHHdfY6G5llaMQDF+HAf20VKc8opRwmjf04= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.4/go.mod h1:u/s5/Z+ohUQOPXl00m2yJVyioWDECsbpXTQlaqSlufc= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.6 h1:6Q/ITRl/PoOAcbLkT3EOpch/6w9n/YNN6a/v+dfuBY8= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.6/go.mod h1:sj1vB2ZjQ1PQOWc89SyhEJs838UIpDcsa3HylyczQO0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.10 h1:uFWgo6mGJI1n17nbcvSc6fxVuR3xLNqvXt12JCnEcT8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.10/go.mod h1:F+EZtuIwjlv35kRJPyBGcsA4f7bnSoz15zOQ2lJq1Z4= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.4 h1:cnsvEKSoHN4oAN7spMMr0zhEW2MHnhAVpmqQg8E6UcM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.4/go.mod h1:8glyUqVIM4AmeenIsPo0oVh3+NUwnsQml2OFupfQW+0= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.11 h1:6cZRymlLEIlDTEB0+5+An6Zj1CKt6rSE69tOmFeu1nk= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.11/go.mod h1:0MR+sS1b/yxsfAPvAESrw8NfwUoxMinDyw6EYR9BS2U= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.1 h1:C21IDZCm9Yu5xqjb3fKmxDoYvJXtw1DNlOmLZEIlY1M= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.1/go.mod h1:l/BbcfqDCT3hePawhy4ZRtewjtdkl6GWtd9/U+1penQ= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1 h1:T4pFel53bkHjL2mMo+4DKE6r6AuoZnM0fg7k1/ratr4= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.4 h1:HXy33+dHXT6WYvnAtIvcQ7Zh4ppeAccz8ofi5bzsQ/A= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.4/go.mod h1:S8TVP66AAkMMdYYCNZGvrdEq9YRm+qLXjio4FqRnrEE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.4 h1:b16QW0XWl0jWjLABFc1A+uh145Oqv+xDcObNk0iQgUk= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.4/go.mod h1:uKkN7qmSIsNJVyMtxNQoCEYMvFEXbOg9fwCJPdfp2u8= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.4 h1:RE/DlZLYrz1OOmq8F28IXHLksuuvlpzUbvJ+SESCZBI= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.4/go.mod h1:oudbsSdDtazNj47z1ut1n37re9hDsKpk2ZI3v7KSxq0= +github.com/aws/aws-sdk-go-v2/service/s3 v1.26.6 h1:RyI53C9+8xxZ3zrllJwzZjI6/FePzxNv3pvh59Ir0aE= +github.com/aws/aws-sdk-go-v2/service/s3 v1.26.6/go.mod h1:FMXuMpmEOLQUDnQLMjsJ2jJGN7jpji1pQ59Kii+IM4U= +github.com/aws/aws-sdk-go-v2/service/sso v1.11.4 h1:Uw5wBybFQ1UeA9ts0Y07gbv0ncZnIAyw858tDW0NP2o= +github.com/aws/aws-sdk-go-v2/service/sso v1.11.4/go.mod h1:cPDwJwsP4Kff9mldCXAmddjJL6JGQqtA3Mzer2zyr88= +github.com/aws/aws-sdk-go-v2/service/sts v1.16.4 h1:+xtV90n3abQmgzk1pS++FdxZTrPEDgQng6e4/56WR2A= +github.com/aws/aws-sdk-go-v2/service/sts v1.16.4/go.mod h1:lfSYenAXtavyX2A1LsViglqlG9eEFYxNryTZS5rn3QE= +github.com/aws/smithy-go v1.11.2 h1:eG/N+CcUMAvsdffgMvjMKwfyDzIkjM6pfxMJ8Mzc6mE= +github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f h1:ZNv7On9kyUzm7fvRZumSyy/IUiSC7AzL0I1jKKtwooA= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= github.com/benbjohnson/clock v1.0.3 h1:vkLuvpK4fmtSCuo60+yC63p7y0BmQ8gm5ZXGuBCJyXg= @@ -341,8 +353,8 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= @@ -455,7 +467,9 @@ github.com/jcmturner/rpc/v2 v2.0.2/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJk github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag= github.com/jinzhu/copier v0.3.2/go.mod h1:24xnZezI2Yqac9J61UC6/dG/k76ttpq0DdJI3QmUvro= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= diff --git a/demo/file/client.go b/demo/file/client.go index d34ceacc99..211552b01c 100644 --- a/demo/file/client.go +++ b/demo/file/client.go @@ -4,7 +4,9 @@ import ( "context" "fmt" "log" + s3 "mosn.io/layotto/spec/proto/extension/v1" "os" + "strconv" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" @@ -19,15 +21,15 @@ import ( ) func TestGet(fileName string) { - conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) + conn, err := grpc.Dial("127.0.0.1:11004", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return } - c := runtimev1pb.NewRuntimeClient(conn) - req := &runtimev1pb.GetFileRequest{StoreName: "minioOSS", Name: fileName} - cli, err := c.GetFile(context.Background(), req) + c := s3.NewS3OutBindingClient(conn) + req := &s3.GetObjectInput{Bucket: "antsys-wenxuwan", Key: fileName} + cli, err := c.GetObject(context.Background(), req) if err != nil { fmt.Printf("get file error: %+v", err) return @@ -39,13 +41,13 @@ func TestGet(fileName string) { fmt.Errorf("recv file failed") break } - pic = append(pic, resp.Data...) + pic = append(pic, resp.Body...) } fmt.Println(string(pic)) } func TestPut(fileName string, value string) { - conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) + conn, err := grpc.Dial("127.0.0.1:11004", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return @@ -53,13 +55,14 @@ func TestPut(fileName string, value string) { meta := make(map[string]string) meta["storageType"] = "Standard" c := runtimev1pb.NewRuntimeClient(conn) - req := &runtimev1pb.PutFileRequest{StoreName: "minioOSS", Name: fileName, Metadata: meta} + req := &runtimev1pb.PutFileRequest{StoreName: "awsOSS", Name: fileName, Metadata: meta} stream, err := c.PutFile(context.TODO()) if err != nil { fmt.Printf("put file failed:%+v", err) return } req.Data = []byte(value) + meta["length"] = strconv.Itoa(len(value)) stream.Send(req) _, err = stream.CloseAndRecv() if err != nil { @@ -68,7 +71,7 @@ func TestPut(fileName string, value string) { } func TestList(bucketName string) { - conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) + conn, err := grpc.Dial("127.0.0.1:11004", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return @@ -78,7 +81,7 @@ func TestList(bucketName string) { c := runtimev1pb.NewRuntimeClient(conn) marker := "" for { - req := &runtimev1pb.FileRequest{StoreName: "minioOSS", Name: bucketName, Metadata: meta} + req := &runtimev1pb.FileRequest{StoreName: "awsOSS", Name: bucketName, Metadata: meta} listReq := &runtimev1pb.ListFileRequest{Request: req, PageSize: 2, Marker: marker} resp, err := c.ListFile(context.Background(), listReq) if err != nil { @@ -97,7 +100,7 @@ func TestList(bucketName string) { } func TestDel(fileName string) { - conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) + conn, err := grpc.Dial("127.0.0.1:11004", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return @@ -105,7 +108,7 @@ func TestDel(fileName string) { meta := make(map[string]string) meta["storageType"] = "Standard" c := runtimev1pb.NewRuntimeClient(conn) - req := &runtimev1pb.FileRequest{StoreName: "minioOSS", Name: fileName, Metadata: meta} + req := &runtimev1pb.FileRequest{StoreName: "awsOSS", Name: fileName, Metadata: meta} listReq := &runtimev1pb.DelFileRequest{Request: req} _, err = c.DelFile(context.Background(), listReq) if err != nil { @@ -116,7 +119,7 @@ func TestDel(fileName string) { } func TestStat(fileName string) { - conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) + conn, err := grpc.Dial("127.0.0.1:11004", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return @@ -124,7 +127,7 @@ func TestStat(fileName string) { meta := make(map[string]string) meta["storageType"] = "Standard" c := runtimev1pb.NewRuntimeClient(conn) - req := &runtimev1pb.FileRequest{StoreName: "minioOSS", Name: fileName, Metadata: meta} + req := &runtimev1pb.FileRequest{StoreName: "awsOSS", Name: fileName, Metadata: meta} statReq := &runtimev1pb.GetFileMetaRequest{Request: req} data, err := c.GetFileMeta(context.Background(), statReq) //here use grpc error code check file exist or not. diff --git a/demo/go.mod b/demo/go.mod index 109a79ee5a..253f07280d 100644 --- a/demo/go.mod +++ b/demo/go.mod @@ -7,8 +7,12 @@ require ( github.com/google/uuid v1.2.0 github.com/minio/minio-go/v7 v7.0.15 github.com/tetratelabs/proxy-wasm-go-sdk v0.14.1-0.20210922004205-46e3ac3a25fe + golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 // indirect + golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect google.golang.org/grpc v1.37.0 google.golang.org/protobuf v1.26.0-rc.1 + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect mosn.io/layotto/sdk/go-sdk v0.0.0-20211020084508-6f5ee3cfeba0 mosn.io/layotto/spec v0.0.0-20211020084508-6f5ee3cfeba0 ) diff --git a/demo/go.sum b/demo/go.sum index 1bbc5afdef..9b76f0de32 100644 --- a/demo/go.sum +++ b/demo/go.sum @@ -102,8 +102,9 @@ golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -113,9 +114,13 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae h1:Ih9Yo4hSPImZOpfGuA4bR/ORKTAbhZo2AbWNRCnevdo= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -125,8 +130,9 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -157,7 +163,8 @@ gopkg.in/ini.v1 v1.57.0 h1:9unxIsFcTt4I55uWluz+UmL95q4kdJ0buvQ1ZIqVQww= gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/spec/proto/extension/v1/s3.pb.go b/spec/proto/extension/v1/s3.pb.go new file mode 100644 index 0000000000..461a7f2424 --- /dev/null +++ b/spec/proto/extension/v1/s3.pb.go @@ -0,0 +1,378 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.23.0 +// protoc v3.19.1 +// source: s3.proto + +package s3 + +import ( + context "context" + proto "github.com/golang/protobuf/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + _ "google.golang.org/protobuf/types/known/anypb" + _ "google.golang.org/protobuf/types/known/emptypb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type GetObjectInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + ChecksumMode string `protobuf:"bytes,3,opt,name=checksum_mode,json=checksumMode,proto3" json:"checksum_mode,omitempty"` + PartNumber string `protobuf:"bytes,4,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` +} + +func (x *GetObjectInput) Reset() { + *x = GetObjectInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetObjectInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetObjectInput) ProtoMessage() {} + +func (x *GetObjectInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[0] + 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 GetObjectInput.ProtoReflect.Descriptor instead. +func (*GetObjectInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{0} +} + +func (x *GetObjectInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *GetObjectInput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *GetObjectInput) GetChecksumMode() string { + if x != nil { + return x.ChecksumMode + } + return "" +} + +func (x *GetObjectInput) GetPartNumber() string { + if x != nil { + return x.PartNumber + } + return "" +} + +type GetObjectOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AcceptRanges string `protobuf:"bytes,1,opt,name=accept_ranges,json=acceptRanges,proto3" json:"accept_ranges,omitempty"` + Body []byte `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"` +} + +func (x *GetObjectOutput) Reset() { + *x = GetObjectOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetObjectOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetObjectOutput) ProtoMessage() {} + +func (x *GetObjectOutput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[1] + 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 GetObjectOutput.ProtoReflect.Descriptor instead. +func (*GetObjectOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{1} +} + +func (x *GetObjectOutput) GetAcceptRanges() string { + if x != nil { + return x.AcceptRanges + } + return "" +} + +func (x *GetObjectOutput) GetBody() []byte { + if x != nil { + return x.Body + } + return nil +} + +var File_s3_proto protoreflect.FileDescriptor + +var file_s3_proto_rawDesc = []byte{ + 0x0a, 0x08, 0x73, 0x33, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x6d, 0x6f, 0x73, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 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, 0x1a, 0x19, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, + 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x80, 0x01, 0x0a, 0x0e, 0x47, 0x65, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 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, 0x23, 0x0a, 0x0d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, + 0x75, 0x6d, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, + 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x4a, 0x0a, 0x0f, + 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, + 0x23, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x52, 0x61, + 0x6e, 0x67, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x32, 0x6e, 0x0a, 0x0c, 0x53, 0x33, 0x4f, 0x75, + 0x74, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x5e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x6d, + 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x30, 0x01, 0x42, 0x3e, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x6c, + 0x61, 0x62, 0x2e, 0x61, 0x6c, 0x69, 0x70, 0x61, 0x79, 0x2d, 0x69, 0x6e, 0x63, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x61, 0x6e, 0x74, 0x2d, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x6c, 0x61, 0x79, 0x6f, 0x74, + 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_s3_proto_rawDescOnce sync.Once + file_s3_proto_rawDescData = file_s3_proto_rawDesc +) + +func file_s3_proto_rawDescGZIP() []byte { + file_s3_proto_rawDescOnce.Do(func() { + file_s3_proto_rawDescData = protoimpl.X.CompressGZIP(file_s3_proto_rawDescData) + }) + return file_s3_proto_rawDescData +} + +var file_s3_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_s3_proto_goTypes = []interface{}{ + (*GetObjectInput)(nil), // 0: mosn.proto.runtime.v1.GetObjectInput + (*GetObjectOutput)(nil), // 1: mosn.proto.runtime.v1.GetObjectOutput +} +var file_s3_proto_depIdxs = []int32{ + 0, // 0: mosn.proto.runtime.v1.S3OutBinding.GetObject:input_type -> mosn.proto.runtime.v1.GetObjectInput + 1, // 1: mosn.proto.runtime.v1.S3OutBinding.GetObject:output_type -> mosn.proto.runtime.v1.GetObjectOutput + 1, // [1:2] is the sub-list for method output_type + 0, // [0:1] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_s3_proto_init() } +func file_s3_proto_init() { + if File_s3_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_s3_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetObjectInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetObjectOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_s3_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_s3_proto_goTypes, + DependencyIndexes: file_s3_proto_depIdxs, + MessageInfos: file_s3_proto_msgTypes, + }.Build() + File_s3_proto = out.File + file_s3_proto_rawDesc = nil + file_s3_proto_goTypes = nil + file_s3_proto_depIdxs = nil +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConnInterface + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion6 + +// S3OutBindingClient is the client API for S3OutBinding service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type S3OutBindingClient interface { + GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (S3OutBinding_GetObjectClient, error) +} + +type s3OutBindingClient struct { + cc grpc.ClientConnInterface +} + +func NewS3OutBindingClient(cc grpc.ClientConnInterface) S3OutBindingClient { + return &s3OutBindingClient{cc} +} + +func (c *s3OutBindingClient) GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (S3OutBinding_GetObjectClient, error) { + stream, err := c.cc.NewStream(ctx, &_S3OutBinding_serviceDesc.Streams[0], "/mosn.proto.runtime.v1.S3OutBinding/GetObject", opts...) + if err != nil { + return nil, err + } + x := &s3OutBindingGetObjectClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type S3OutBinding_GetObjectClient interface { + Recv() (*GetObjectOutput, error) + grpc.ClientStream +} + +type s3OutBindingGetObjectClient struct { + grpc.ClientStream +} + +func (x *s3OutBindingGetObjectClient) Recv() (*GetObjectOutput, error) { + m := new(GetObjectOutput) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// S3OutBindingServer is the server API for S3OutBinding service. +type S3OutBindingServer interface { + GetObject(*GetObjectInput, S3OutBinding_GetObjectServer) error +} + +// UnimplementedS3OutBindingServer can be embedded to have forward compatible implementations. +type UnimplementedS3OutBindingServer struct { +} + +func (*UnimplementedS3OutBindingServer) GetObject(*GetObjectInput, S3OutBinding_GetObjectServer) error { + return status.Errorf(codes.Unimplemented, "method GetObject not implemented") +} + +func RegisterS3OutBindingServer(s *grpc.Server, srv S3OutBindingServer) { + s.RegisterService(&_S3OutBinding_serviceDesc, srv) +} + +func _S3OutBinding_GetObject_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(GetObjectInput) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(S3OutBindingServer).GetObject(m, &s3OutBindingGetObjectServer{stream}) +} + +type S3OutBinding_GetObjectServer interface { + Send(*GetObjectOutput) error + grpc.ServerStream +} + +type s3OutBindingGetObjectServer struct { + grpc.ServerStream +} + +func (x *s3OutBindingGetObjectServer) Send(m *GetObjectOutput) error { + return x.ServerStream.SendMsg(m) +} + +var _S3OutBinding_serviceDesc = grpc.ServiceDesc{ + ServiceName: "mosn.proto.runtime.v1.S3OutBinding", + HandlerType: (*S3OutBindingServer)(nil), + Methods: []grpc.MethodDesc{}, + Streams: []grpc.StreamDesc{ + { + StreamName: "GetObject", + Handler: _S3OutBinding_GetObject_Handler, + ServerStreams: true, + }, + }, + Metadata: "s3.proto", +} From 4d9f05a9fc9cf68a8e5e07268d2e6dd2b1a1657d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 9 May 2022 20:59:02 +0800 Subject: [PATCH 002/126] add pug and get interface --- cmd/layotto/main.go | 3 + cmd/layotto_multiple_api/main.go | 5 + configs/config_in_memory.json | 8 + pkg/grpc/extension/s3/s3.go | 51 +++ spec/proto/extension/v1/s3.pb.go | 567 +++++++++++++++++++++++++++---- spec/proto/extension/v1/s3.proto | 54 +++ 6 files changed, 617 insertions(+), 71 deletions(-) create mode 100644 pkg/grpc/extension/s3/s3.go create mode 100644 spec/proto/extension/v1/s3.proto diff --git a/cmd/layotto/main.go b/cmd/layotto/main.go index 91d2d1c372..ecdc5822bc 100644 --- a/cmd/layotto/main.go +++ b/cmd/layotto/main.go @@ -166,6 +166,8 @@ import ( _ "mosn.io/layotto/diagnostics/exporter_iml" lprotocol "mosn.io/layotto/diagnostics/protocol" lsky "mosn.io/layotto/diagnostics/skywalking" + + s3ext "mosn.io/layotto/pkg/grpc/extension/s3" ) // loggerForDaprComp is constructed for reusing dapr's components. @@ -216,6 +218,7 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp // register your gRPC API here runtime.WithGrpcAPI( default_api.NewGrpcAPI, + s3ext.NewS3Server, ), // Hello runtime.WithHelloFactory( diff --git a/cmd/layotto_multiple_api/main.go b/cmd/layotto_multiple_api/main.go index 6bbcb5312d..d26c2d474a 100644 --- a/cmd/layotto_multiple_api/main.go +++ b/cmd/layotto_multiple_api/main.go @@ -26,6 +26,7 @@ import ( l8_grpc "mosn.io/layotto/pkg/grpc" "mosn.io/layotto/pkg/grpc/dapr" "mosn.io/layotto/pkg/grpc/default_api" + s3ext "mosn.io/layotto/pkg/grpc/extension/s3" _ "mosn.io/mosn/pkg/filter/stream/grpcmetric" "mosn.io/mosn/pkg/stagemanager" "mosn.io/mosn/pkg/trace/skywalking" @@ -216,6 +217,7 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp // Currently it only support Dapr's InvokeService,secret API,state API and InvokeBinding API. // Note: this feature is still in Alpha state and we don't recommend that you use it in your production environment. dapr.NewDaprAPI_Alpha, + s3ext.NewS3Server, ), // Hello runtime.WithHelloFactory( @@ -391,6 +393,9 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp custom.NewComponentFactory("in-memory", component.NewInMemoryHelloWorld), custom.NewComponentFactory("goodbye", component.NewSayGoodbyeHelloWorld), ), + runtime.WithCustomComponentFactory("extension", + custom.NewComponentFactory("s3", s3ext.NewS3Component), + ), ) return server, err } diff --git a/configs/config_in_memory.json b/configs/config_in_memory.json index 983ff8d6e7..ee00e43187 100644 --- a/configs/config_in_memory.json +++ b/configs/config_in_memory.json @@ -55,6 +55,14 @@ "in-memory": { "metadata": {} } + }, + "extension": { + "s3": { + "metadata": { + "ak": "123", + "sk": "456" + } + } } }, "app": { diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go new file mode 100644 index 0000000000..41f3d727f9 --- /dev/null +++ b/pkg/grpc/extension/s3/s3.go @@ -0,0 +1,51 @@ +package s3 + +import ( + "context" + rawGRPC "google.golang.org/grpc" + "mosn.io/layotto/components/custom" + "mosn.io/layotto/pkg/grpc" + "mosn.io/layotto/spec/proto/extension/v1" +) + +var ( + s3Instance *S3Server +) + +type S3Server struct { + appId string + config custom.Config + ctx context.Context +} + +func NewS3Component() custom.Component { + s3Instance = &S3Server{} + return s3Instance +} + +func NewS3Server(ac *grpc.ApplicationContext) grpc.GrpcAPI { + s3Instance.appId = ac.AppId + return s3Instance +} + +func (s *S3Server) Initialize(ctx context.Context, config custom.Config) error { + s.config = config + return nil +} + +func (s *S3Server) Init(conn *rawGRPC.ClientConn) error { + return nil +} + +func (s *S3Server) Register(rawGrpcServer *rawGRPC.Server) error { + s3.RegisterS3Server(rawGrpcServer, s) + return nil +} + +func (s *S3Server) GetObject(req *s3.GetObjectInput, stream s3.S3_GetObjectServer) error { + return nil +} + +func (s *S3Server) PutObject(s3.S3_PutObjectServer) error { + return nil +} diff --git a/spec/proto/extension/v1/s3.pb.go b/spec/proto/extension/v1/s3.pb.go index 461a7f2424..dc9b83abf3 100644 --- a/spec/proto/extension/v1/s3.pb.go +++ b/spec/proto/extension/v1/s3.pb.go @@ -36,10 +36,26 @@ type GetObjectInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - ChecksumMode string `protobuf:"bytes,3,opt,name=checksum_mode,json=checksumMode,proto3" json:"checksum_mode,omitempty"` - PartNumber string `protobuf:"bytes,4,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,2,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + IfMatch string `protobuf:"bytes,3,opt,name=if_match,json=ifMatch,proto3" json:"if_match,omitempty"` + IfModifiedSince string `protobuf:"bytes,4,opt,name=if_modified_since,json=ifModifiedSince,proto3" json:"if_modified_since,omitempty"` + IfNoneMatch string `protobuf:"bytes,5,opt,name=if_none_match,json=ifNoneMatch,proto3" json:"if_none_match,omitempty"` + IfUnmodifiedSince string `protobuf:"bytes,6,opt,name=if_unmodified_since,json=ifUnmodifiedSince,proto3" json:"if_unmodified_since,omitempty"` + Key string `protobuf:"bytes,7,opt,name=key,proto3" json:"key,omitempty"` + PartNumber int64 `protobuf:"varint,8,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + Range string `protobuf:"bytes,9,opt,name=range,proto3" json:"range,omitempty"` + RequestPayer string `protobuf:"bytes,10,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + ResponseCacheControl string `protobuf:"bytes,11,opt,name=response_cache_control,json=responseCacheControl,proto3" json:"response_cache_control,omitempty"` + ResponseContentDisposition string `protobuf:"bytes,12,opt,name=response_content_disposition,json=responseContentDisposition,proto3" json:"response_content_disposition,omitempty"` + ResponseContentEncoding string `protobuf:"bytes,13,opt,name=response_content_encoding,json=responseContentEncoding,proto3" json:"response_content_encoding,omitempty"` + ResponseContentLanguage string `protobuf:"bytes,14,opt,name=response_content_language,json=responseContentLanguage,proto3" json:"response_content_language,omitempty"` + ResponseContentType string `protobuf:"bytes,15,opt,name=response_content_type,json=responseContentType,proto3" json:"response_content_type,omitempty"` + ResponseExpires string `protobuf:"bytes,16,opt,name=response_expires,json=responseExpires,proto3" json:"response_expires,omitempty"` + SseCustomerAlgorithm string `protobuf:"bytes,17,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SseCustomerKey string `protobuf:"bytes,18,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` + SseCustomerKeyMd5 string `protobuf:"bytes,19,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + VersionId string `protobuf:"bytes,20,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } func (x *GetObjectInput) Reset() { @@ -81,6 +97,41 @@ func (x *GetObjectInput) GetBucket() string { return "" } +func (x *GetObjectInput) GetExpectedBucketOwner() string { + if x != nil { + return x.ExpectedBucketOwner + } + return "" +} + +func (x *GetObjectInput) GetIfMatch() string { + if x != nil { + return x.IfMatch + } + return "" +} + +func (x *GetObjectInput) GetIfModifiedSince() string { + if x != nil { + return x.IfModifiedSince + } + return "" +} + +func (x *GetObjectInput) GetIfNoneMatch() string { + if x != nil { + return x.IfNoneMatch + } + return "" +} + +func (x *GetObjectInput) GetIfUnmodifiedSince() string { + if x != nil { + return x.IfUnmodifiedSince + } + return "" +} + func (x *GetObjectInput) GetKey() string { if x != nil { return x.Key @@ -88,16 +139,93 @@ func (x *GetObjectInput) GetKey() string { return "" } -func (x *GetObjectInput) GetChecksumMode() string { +func (x *GetObjectInput) GetPartNumber() int64 { + if x != nil { + return x.PartNumber + } + return 0 +} + +func (x *GetObjectInput) GetRange() string { + if x != nil { + return x.Range + } + return "" +} + +func (x *GetObjectInput) GetRequestPayer() string { if x != nil { - return x.ChecksumMode + return x.RequestPayer } return "" } -func (x *GetObjectInput) GetPartNumber() string { +func (x *GetObjectInput) GetResponseCacheControl() string { if x != nil { - return x.PartNumber + return x.ResponseCacheControl + } + return "" +} + +func (x *GetObjectInput) GetResponseContentDisposition() string { + if x != nil { + return x.ResponseContentDisposition + } + return "" +} + +func (x *GetObjectInput) GetResponseContentEncoding() string { + if x != nil { + return x.ResponseContentEncoding + } + return "" +} + +func (x *GetObjectInput) GetResponseContentLanguage() string { + if x != nil { + return x.ResponseContentLanguage + } + return "" +} + +func (x *GetObjectInput) GetResponseContentType() string { + if x != nil { + return x.ResponseContentType + } + return "" +} + +func (x *GetObjectInput) GetResponseExpires() string { + if x != nil { + return x.ResponseExpires + } + return "" +} + +func (x *GetObjectInput) GetSseCustomerAlgorithm() string { + if x != nil { + return x.SseCustomerAlgorithm + } + return "" +} + +func (x *GetObjectInput) GetSseCustomerKey() string { + if x != nil { + return x.SseCustomerKey + } + return "" +} + +func (x *GetObjectInput) GetSseCustomerKeyMd5() string { + if x != nil { + return x.SseCustomerKeyMd5 + } + return "" +} + +func (x *GetObjectInput) GetVersionId() string { + if x != nil { + return x.VersionId } return "" } @@ -107,8 +235,7 @@ type GetObjectOutput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - AcceptRanges string `protobuf:"bytes,1,opt,name=accept_ranges,json=acceptRanges,proto3" json:"accept_ranges,omitempty"` - Body []byte `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"` + Body []byte `protobuf:"bytes,1,opt,name=body,proto3" json:"body,omitempty"` } func (x *GetObjectOutput) Reset() { @@ -143,20 +270,155 @@ func (*GetObjectOutput) Descriptor() ([]byte, []int) { return file_s3_proto_rawDescGZIP(), []int{1} } -func (x *GetObjectOutput) GetAcceptRanges() string { +func (x *GetObjectOutput) GetBody() []byte { if x != nil { - return x.AcceptRanges + return x.Body + } + return nil +} + +type PutObjectInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Acl string `protobuf:"bytes,1,opt,name=acl,proto3" json:"acl,omitempty"` + Body []byte `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"` + Bucket string `protobuf:"bytes,3,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,4,opt,name=key,proto3" json:"key,omitempty"` + BucketKeyEnabled bool `protobuf:"varint,5,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + CacheControl string `protobuf:"bytes,6,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` +} + +func (x *PutObjectInput) Reset() { + *x = PutObjectInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PutObjectInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PutObjectInput) ProtoMessage() {} + +func (x *PutObjectInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[2] + 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 PutObjectInput.ProtoReflect.Descriptor instead. +func (*PutObjectInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{2} +} + +func (x *PutObjectInput) GetAcl() string { + if x != nil { + return x.Acl } return "" } -func (x *GetObjectOutput) GetBody() []byte { +func (x *PutObjectInput) GetBody() []byte { if x != nil { return x.Body } return nil } +func (x *PutObjectInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *PutObjectInput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *PutObjectInput) GetBucketKeyEnabled() bool { + if x != nil { + return x.BucketKeyEnabled + } + return false +} + +func (x *PutObjectInput) GetCacheControl() string { + if x != nil { + return x.CacheControl + } + return "" +} + +type PutObjectOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BucketKeyEnabled bool `protobuf:"varint,1,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + Etag string `protobuf:"bytes,2,opt,name=etag,proto3" json:"etag,omitempty"` +} + +func (x *PutObjectOutput) Reset() { + *x = PutObjectOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PutObjectOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PutObjectOutput) ProtoMessage() {} + +func (x *PutObjectOutput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[3] + 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 PutObjectOutput.ProtoReflect.Descriptor instead. +func (*PutObjectOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{3} +} + +func (x *PutObjectOutput) GetBucketKeyEnabled() bool { + if x != nil { + return x.BucketKeyEnabled + } + return false +} + +func (x *PutObjectOutput) GetEtag() string { + if x != nil { + return x.Etag + } + return "" +} + var File_s3_proto protoreflect.FileDescriptor var file_s3_proto_rawDesc = []byte{ @@ -165,31 +427,96 @@ var file_s3_proto_rawDesc = []byte{ 0x31, 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, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, - 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x80, 0x01, 0x0a, 0x0e, 0x47, 0x65, + 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe4, 0x06, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 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, 0x23, 0x0a, 0x0d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, - 0x75, 0x6d, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, - 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x4a, 0x0a, 0x0f, - 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, - 0x23, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x32, 0x6e, 0x0a, 0x0c, 0x53, 0x33, 0x4f, 0x75, - 0x74, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x5e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x6d, - 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x30, 0x01, 0x42, 0x3e, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x6c, - 0x61, 0x62, 0x2e, 0x61, 0x6c, 0x69, 0x70, 0x61, 0x79, 0x2d, 0x69, 0x6e, 0x63, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x61, 0x6e, 0x74, 0x2d, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x6c, 0x61, 0x79, 0x6f, 0x74, - 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x63, 0x6b, 0x65, 0x74, 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, 0x02, 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, 0x03, 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, 0x04, 0x20, 0x01, 0x28, 0x09, 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, 0x05, 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, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x11, 0x69, 0x66, 0x55, 0x6e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x53, 0x69, + 0x6e, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x65, + 0x72, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x14, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x40, 0x0a, 0x1c, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x44, 0x69, + 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, + 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, + 0x67, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, + 0x65, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x13, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, + 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, 0x11, 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, 0x12, 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, 0x13, 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, + 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x22, 0x25, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0xb3, 0x01, 0x0a, 0x0e, 0x50, 0x75, 0x74, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x12, 0x12, 0x0a, 0x04, + 0x62, 0x6f, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, + 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x04, 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, 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, 0x22, 0x53, 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, 0x32, 0xc4, 0x01, 0x0a, 0x02, 0x53, 0x33, 0x12, 0x5e, 0x0a, 0x09, 0x47, 0x65, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, + 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x09, 0x50, 0x75, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, + 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -204,16 +531,20 @@ func file_s3_proto_rawDescGZIP() []byte { return file_s3_proto_rawDescData } -var file_s3_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_s3_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_s3_proto_goTypes = []interface{}{ (*GetObjectInput)(nil), // 0: mosn.proto.runtime.v1.GetObjectInput (*GetObjectOutput)(nil), // 1: mosn.proto.runtime.v1.GetObjectOutput + (*PutObjectInput)(nil), // 2: mosn.proto.runtime.v1.PutObjectInput + (*PutObjectOutput)(nil), // 3: mosn.proto.runtime.v1.PutObjectOutput } var file_s3_proto_depIdxs = []int32{ - 0, // 0: mosn.proto.runtime.v1.S3OutBinding.GetObject:input_type -> mosn.proto.runtime.v1.GetObjectInput - 1, // 1: mosn.proto.runtime.v1.S3OutBinding.GetObject:output_type -> mosn.proto.runtime.v1.GetObjectOutput - 1, // [1:2] is the sub-list for method output_type - 0, // [0:1] is the sub-list for method input_type + 0, // 0: mosn.proto.runtime.v1.S3.GetObject:input_type -> mosn.proto.runtime.v1.GetObjectInput + 2, // 1: mosn.proto.runtime.v1.S3.PutObject:input_type -> mosn.proto.runtime.v1.PutObjectInput + 1, // 2: mosn.proto.runtime.v1.S3.GetObject:output_type -> mosn.proto.runtime.v1.GetObjectOutput + 3, // 3: mosn.proto.runtime.v1.S3.PutObject:output_type -> mosn.proto.runtime.v1.PutObjectOutput + 2, // [2:4] is the sub-list for method output_type + 0, // [0:2] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name @@ -249,6 +580,30 @@ func file_s3_proto_init() { return nil } } + file_s3_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PutObjectInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PutObjectOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -256,7 +611,7 @@ func file_s3_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_s3_proto_rawDesc, NumEnums: 0, - NumMessages: 2, + NumMessages: 4, NumExtensions: 0, NumServices: 1, }, @@ -278,27 +633,28 @@ var _ grpc.ClientConnInterface // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion6 -// S3OutBindingClient is the client API for S3OutBinding service. +// S3Client is the client API for S3 service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type S3OutBindingClient interface { - GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (S3OutBinding_GetObjectClient, error) +type S3Client interface { + GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (S3_GetObjectClient, error) + PutObject(ctx context.Context, opts ...grpc.CallOption) (S3_PutObjectClient, error) } -type s3OutBindingClient struct { +type s3Client struct { cc grpc.ClientConnInterface } -func NewS3OutBindingClient(cc grpc.ClientConnInterface) S3OutBindingClient { - return &s3OutBindingClient{cc} +func NewS3Client(cc grpc.ClientConnInterface) S3Client { + return &s3Client{cc} } -func (c *s3OutBindingClient) GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (S3OutBinding_GetObjectClient, error) { - stream, err := c.cc.NewStream(ctx, &_S3OutBinding_serviceDesc.Streams[0], "/mosn.proto.runtime.v1.S3OutBinding/GetObject", opts...) +func (c *s3Client) GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (S3_GetObjectClient, error) { + stream, err := c.cc.NewStream(ctx, &_S3_serviceDesc.Streams[0], "/mosn.proto.runtime.v1.S3/GetObject", opts...) if err != nil { return nil, err } - x := &s3OutBindingGetObjectClient{stream} + x := &s3GetObjectClient{stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } @@ -308,16 +664,16 @@ func (c *s3OutBindingClient) GetObject(ctx context.Context, in *GetObjectInput, return x, nil } -type S3OutBinding_GetObjectClient interface { +type S3_GetObjectClient interface { Recv() (*GetObjectOutput, error) grpc.ClientStream } -type s3OutBindingGetObjectClient struct { +type s3GetObjectClient struct { grpc.ClientStream } -func (x *s3OutBindingGetObjectClient) Recv() (*GetObjectOutput, error) { +func (x *s3GetObjectClient) Recv() (*GetObjectOutput, error) { m := new(GetObjectOutput) if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err @@ -325,54 +681,123 @@ func (x *s3OutBindingGetObjectClient) Recv() (*GetObjectOutput, error) { return m, nil } -// S3OutBindingServer is the server API for S3OutBinding service. -type S3OutBindingServer interface { - GetObject(*GetObjectInput, S3OutBinding_GetObjectServer) error +func (c *s3Client) PutObject(ctx context.Context, opts ...grpc.CallOption) (S3_PutObjectClient, error) { + stream, err := c.cc.NewStream(ctx, &_S3_serviceDesc.Streams[1], "/mosn.proto.runtime.v1.S3/PutObject", opts...) + if err != nil { + return nil, err + } + x := &s3PutObjectClient{stream} + return x, nil } -// UnimplementedS3OutBindingServer can be embedded to have forward compatible implementations. -type UnimplementedS3OutBindingServer struct { +type S3_PutObjectClient interface { + Send(*PutObjectInput) error + CloseAndRecv() (*PutObjectOutput, error) + grpc.ClientStream } -func (*UnimplementedS3OutBindingServer) GetObject(*GetObjectInput, S3OutBinding_GetObjectServer) error { +type s3PutObjectClient struct { + grpc.ClientStream +} + +func (x *s3PutObjectClient) Send(m *PutObjectInput) error { + return x.ClientStream.SendMsg(m) +} + +func (x *s3PutObjectClient) CloseAndRecv() (*PutObjectOutput, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(PutObjectOutput) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// S3Server is the server API for S3 service. +type S3Server interface { + GetObject(*GetObjectInput, S3_GetObjectServer) error + PutObject(S3_PutObjectServer) error +} + +// UnimplementedS3Server can be embedded to have forward compatible implementations. +type UnimplementedS3Server struct { +} + +func (*UnimplementedS3Server) GetObject(*GetObjectInput, S3_GetObjectServer) error { return status.Errorf(codes.Unimplemented, "method GetObject not implemented") } +func (*UnimplementedS3Server) PutObject(S3_PutObjectServer) error { + return status.Errorf(codes.Unimplemented, "method PutObject not implemented") +} -func RegisterS3OutBindingServer(s *grpc.Server, srv S3OutBindingServer) { - s.RegisterService(&_S3OutBinding_serviceDesc, srv) +func RegisterS3Server(s *grpc.Server, srv S3Server) { + s.RegisterService(&_S3_serviceDesc, srv) } -func _S3OutBinding_GetObject_Handler(srv interface{}, stream grpc.ServerStream) error { +func _S3_GetObject_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(GetObjectInput) if err := stream.RecvMsg(m); err != nil { return err } - return srv.(S3OutBindingServer).GetObject(m, &s3OutBindingGetObjectServer{stream}) + return srv.(S3Server).GetObject(m, &s3GetObjectServer{stream}) } -type S3OutBinding_GetObjectServer interface { +type S3_GetObjectServer interface { Send(*GetObjectOutput) error grpc.ServerStream } -type s3OutBindingGetObjectServer struct { +type s3GetObjectServer struct { grpc.ServerStream } -func (x *s3OutBindingGetObjectServer) Send(m *GetObjectOutput) error { +func (x *s3GetObjectServer) Send(m *GetObjectOutput) error { return x.ServerStream.SendMsg(m) } -var _S3OutBinding_serviceDesc = grpc.ServiceDesc{ - ServiceName: "mosn.proto.runtime.v1.S3OutBinding", - HandlerType: (*S3OutBindingServer)(nil), +func _S3_PutObject_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(S3Server).PutObject(&s3PutObjectServer{stream}) +} + +type S3_PutObjectServer interface { + SendAndClose(*PutObjectOutput) error + Recv() (*PutObjectInput, error) + grpc.ServerStream +} + +type s3PutObjectServer struct { + grpc.ServerStream +} + +func (x *s3PutObjectServer) SendAndClose(m *PutObjectOutput) error { + return x.ServerStream.SendMsg(m) +} + +func (x *s3PutObjectServer) Recv() (*PutObjectInput, error) { + m := new(PutObjectInput) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +var _S3_serviceDesc = grpc.ServiceDesc{ + ServiceName: "mosn.proto.runtime.v1.S3", + HandlerType: (*S3Server)(nil), Methods: []grpc.MethodDesc{}, Streams: []grpc.StreamDesc{ { StreamName: "GetObject", - Handler: _S3OutBinding_GetObject_Handler, + Handler: _S3_GetObject_Handler, ServerStreams: true, }, + { + StreamName: "PutObject", + Handler: _S3_PutObject_Handler, + ClientStreams: true, + }, }, Metadata: "s3.proto", } diff --git a/spec/proto/extension/v1/s3.proto b/spec/proto/extension/v1/s3.proto new file mode 100644 index 0000000000..31aff484c7 --- /dev/null +++ b/spec/proto/extension/v1/s3.proto @@ -0,0 +1,54 @@ +syntax = "proto3"; + +package mosn.proto.runtime.v1; + +import "google/protobuf/empty.proto"; +import "google/protobuf/any.proto"; + +option go_package = "mosn.io/layotto/spec/proto/extension/v1;s3"; + +service S3 { + rpc GetObject(GetObjectInput) returns (stream GetObjectOutput) {} + rpc PutObject(stream PutObjectInput) returns(PutObjectOutput){} +} + +message GetObjectInput { + string bucket = 1; + string expected_bucket_owner = 2; + string if_match = 3; + string if_modified_since = 4; + string if_none_match = 5; + string if_unmodified_since = 6; + string key = 7; + int64 part_number = 8; + string range = 9; + string request_payer = 10; + string response_cache_control = 11; + string response_content_disposition = 12; + string response_content_encoding = 13; + string response_content_language = 14; + string response_content_type = 15; + string response_expires = 16; + string sse_customer_algorithm = 17; + string sse_customer_key = 18; + string sse_customer_key_md5 = 19; + string version_id = 20; +} + +message GetObjectOutput { + bytes body = 1; +} + +message PutObjectInput{ + string acl = 1; + bytes body = 2; + string bucket = 3; + string key = 4; + bool bucket_key_enabled = 5; + string cache_control = 6; +} + +message PutObjectOutput{ + bool bucket_key_enabled = 1; + string etag = 2; +} \ No newline at end of file From 36a81c2b1244bc9e417e1d24d43acf946764db49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 10 May 2022 22:40:40 +0800 Subject: [PATCH 003/126] add oss implement --- cmd/layotto/main.go | 18 +- cmd/layotto_multiple_api/main.go | 18 +- components/file/{s3 => }/alicloud/oss.go | 14 +- components/file/{s3 => }/alicloud/oss_test.go | 0 components/file/{s3 => }/aws/oss.go | 54 ++- components/file/{s3 => }/aws/oss_test.go | 4 +- components/file/{s3 => }/minio/oss.go | 24 +- components/file/{s3 => }/minio/oss_test.go | 0 .../file/{s3 => }/qiniu/qiniu_oss_client.go | 0 .../{s3 => }/qiniu/qiniu_oss_client_test.go | 0 .../file/{s3 => }/qiniu/qiniu_oss_test.go | 0 components/file/{s3 => }/qiniu/quniu_oss.go | 0 components/file/registry.go | 46 +- components/file/s3/default.go | 1 + components/file/s3/factory.go | 22 + components/file/s3def.go | 50 ++ components/file/{s3 => }/tencentcloud/oss.go | 0 .../file/{s3 => }/tencentcloud/oss_test.go | 0 components/file/types.go | 3 +- components/file/{s3 => util}/util.go | 2 +- components/file/{s3 => util}/util_test.go | 2 +- go.sum | 38 ++ pkg/grpc/extension/s3/s3.go | 42 +- pkg/grpc/grpc_api.go | 1 + pkg/runtime/config_test.go | 2 +- pkg/runtime/options.go | 7 + pkg/runtime/runtime.go | 29 ++ spec/proto/extension/v1/s3.pb.go | 443 ++++++++++++------ spec/proto/extension/v1/s3.proto | 62 +-- 29 files changed, 633 insertions(+), 249 deletions(-) rename components/file/{s3 => }/alicloud/oss.go (94%) rename components/file/{s3 => }/alicloud/oss_test.go (100%) rename components/file/{s3 => }/aws/oss.go (86%) rename components/file/{s3 => }/aws/oss_test.go (98%) rename components/file/{s3 => }/minio/oss.go (91%) rename components/file/{s3 => }/minio/oss_test.go (100%) rename components/file/{s3 => }/qiniu/qiniu_oss_client.go (100%) rename components/file/{s3 => }/qiniu/qiniu_oss_client_test.go (100%) rename components/file/{s3 => }/qiniu/qiniu_oss_test.go (100%) rename components/file/{s3 => }/qiniu/quniu_oss.go (100%) create mode 100644 components/file/s3/default.go create mode 100644 components/file/s3/factory.go create mode 100644 components/file/s3def.go rename components/file/{s3 => }/tencentcloud/oss.go (100%) rename components/file/{s3 => }/tencentcloud/oss_test.go (100%) rename components/file/{s3 => util}/util.go (99%) rename components/file/{s3 => util}/util_test.go (99%) diff --git a/cmd/layotto/main.go b/cmd/layotto/main.go index ecdc5822bc..0603733dbc 100644 --- a/cmd/layotto/main.go +++ b/cmd/layotto/main.go @@ -28,6 +28,11 @@ import ( secretstore_env "github.com/dapr/components-contrib/secretstores/local/env" secretstore_file "github.com/dapr/components-contrib/secretstores/local/file" "mosn.io/api" + "mosn.io/layotto/components/file/alicloud" + "mosn.io/layotto/components/file/aws" + "mosn.io/layotto/components/file/minio" + "mosn.io/layotto/components/file/qiniu" + "mosn.io/layotto/components/file/tencentcloud" component_actuators "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/diagnostics" "mosn.io/layotto/pkg/grpc/default_api" @@ -39,10 +44,6 @@ import ( "time" "mosn.io/layotto/components/file/local" - "mosn.io/layotto/components/file/s3/alicloud" - "mosn.io/layotto/components/file/s3/aws" - "mosn.io/layotto/components/file/s3/minio" - mock_state "mosn.io/layotto/pkg/mock/components/state" dbindings "github.com/dapr/components-contrib/bindings" @@ -123,10 +124,6 @@ import ( sequencer_redis "mosn.io/layotto/components/sequencer/redis" sequencer_zookeeper "mosn.io/layotto/components/sequencer/zookeeper" - // File - "mosn.io/layotto/components/file/s3/qiniu" - "mosn.io/layotto/components/file/s3/tencentcloud" - // Actuator _ "mosn.io/layotto/pkg/actuator" "mosn.io/layotto/pkg/actuator/health" @@ -239,11 +236,14 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp runtime.WithFileFactory( file.NewFileFactory("aliOSS", alicloud.NewAliCloudOSS), file.NewFileFactory("minioOSS", minio.NewMinioOss), - file.NewFileFactory("awsOSS", aws.NewAwsOss), + file.NewFileFactory("awsOSS", aws.NewAwsFile), file.NewFileFactory("tencentCloudOSS", tencentcloud.NewTencentCloudOSS), file.NewFileFactory("local", local.NewLocalStore), file.NewFileFactory("qiniuOSS", qiniu.NewQiniuOSS), ), + runtime.WithOssFactory( + file.NewOssFactory("awsOSS", aws.NewAwsOss), + ), // PubSub runtime.WithPubSubFactory( diff --git a/cmd/layotto_multiple_api/main.go b/cmd/layotto_multiple_api/main.go index d26c2d474a..9a909c30df 100644 --- a/cmd/layotto_multiple_api/main.go +++ b/cmd/layotto_multiple_api/main.go @@ -22,6 +22,11 @@ import ( helloworld_api "mosn.io/layotto/cmd/layotto_multiple_api/helloworld" "mosn.io/layotto/cmd/layotto_multiple_api/helloworld/component" "mosn.io/layotto/components/custom" + "mosn.io/layotto/components/file/alicloud" + "mosn.io/layotto/components/file/aws" + "mosn.io/layotto/components/file/minio" + "mosn.io/layotto/components/file/qiniu" + "mosn.io/layotto/components/file/tencentcloud" component_actuators "mosn.io/layotto/components/pkg/actuators" l8_grpc "mosn.io/layotto/pkg/grpc" "mosn.io/layotto/pkg/grpc/dapr" @@ -39,10 +44,6 @@ import ( "mosn.io/layotto/components/file/local" - "mosn.io/layotto/components/file/s3/alicloud" - "mosn.io/layotto/components/file/s3/aws" - "mosn.io/layotto/components/file/s3/minio" - dbindings "github.com/dapr/components-contrib/bindings" "github.com/dapr/components-contrib/bindings/http" "mosn.io/layotto/components/configstores/etcdv3" @@ -119,10 +120,6 @@ import ( sequencer_redis "mosn.io/layotto/components/sequencer/redis" sequencer_zookeeper "mosn.io/layotto/components/sequencer/zookeeper" - // File - "mosn.io/layotto/components/file/s3/qiniu" - "mosn.io/layotto/components/file/s3/tencentcloud" - // Actuator _ "mosn.io/layotto/pkg/actuator" "mosn.io/layotto/pkg/actuator/health" @@ -238,7 +235,7 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp runtime.WithFileFactory( file.NewFileFactory("aliOSS", alicloud.NewAliCloudOSS), file.NewFileFactory("minioOSS", minio.NewMinioOss), - file.NewFileFactory("awsOSS", aws.NewAwsOss), + file.NewFileFactory("awsOSS", aws.NewAwsFile), file.NewFileFactory("tencentCloudOSS", tencentcloud.NewTencentCloudOSS), file.NewFileFactory("local", local.NewLocalStore), file.NewFileFactory("qiniuOSS", qiniu.NewQiniuOSS), @@ -393,9 +390,6 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp custom.NewComponentFactory("in-memory", component.NewInMemoryHelloWorld), custom.NewComponentFactory("goodbye", component.NewSayGoodbyeHelloWorld), ), - runtime.WithCustomComponentFactory("extension", - custom.NewComponentFactory("s3", s3ext.NewS3Component), - ), ) return server, err } diff --git a/components/file/s3/alicloud/oss.go b/components/file/alicloud/oss.go similarity index 94% rename from components/file/s3/alicloud/oss.go rename to components/file/alicloud/oss.go index 4ba5e928eb..0eec76e841 100644 --- a/components/file/s3/alicloud/oss.go +++ b/components/file/alicloud/oss.go @@ -21,12 +21,12 @@ import ( "encoding/json" "fmt" "io" + "mosn.io/layotto/components/file/util" "strconv" "sync" "github.com/aliyun/aliyun-oss-go-sdk/oss" "mosn.io/layotto/components/file" - loss "mosn.io/layotto/components/file/s3" ) const ( @@ -84,7 +84,7 @@ func (s *AliCloudOSS) Put(ctx context.Context, st *file.PutFileStu) error { if err != nil { return fmt.Errorf("put file[%s] fail,err: %s", st.FileName, err.Error()) } - fileNameWithoutBucket, err := loss.GetFileName(st.FileName) + fileNameWithoutBucket, err := util.GetFileName(st.FileName) if err != nil { return fmt.Errorf("put file[%s] fail,err: %s", st.FileName, err.Error()) } @@ -101,7 +101,7 @@ func (s *AliCloudOSS) Get(ctx context.Context, st *file.GetFileStu) (io.ReadClos if err != nil { return nil, fmt.Errorf("get file[%s] fail, err: %s", st.FileName, err.Error()) } - fileNameWithoutBucket, err := loss.GetFileName(st.FileName) + fileNameWithoutBucket, err := util.GetFileName(st.FileName) if err != nil { return nil, fmt.Errorf("get file[%s] fail, err: %s", st.FileName, err.Error()) } @@ -115,7 +115,7 @@ func (s *AliCloudOSS) List(ctx context.Context, request *file.ListRequest) (*fil return nil, fmt.Errorf("list directory[%s] fail, err: %s", request.DirectoryName, err.Error()) } resp := &file.ListResp{} - prefix := loss.GetFilePrefixName(request.DirectoryName) + prefix := util.GetFilePrefixName(request.DirectoryName) object, err := bucket.ListObjectsV2(oss.StartAfter(request.Marker), oss.MaxKeys(int(request.PageSize)), oss.Prefix(prefix)) if err != nil { return nil, fmt.Errorf("list directory[%s] fail, err: %s", request.DirectoryName, err.Error()) @@ -141,7 +141,7 @@ func (s *AliCloudOSS) Del(ctx context.Context, request *file.DelRequest) error { if err != nil { return fmt.Errorf("del file[%s] fail, err: %s", request.FileName, err.Error()) } - fileNameWithoutBucket, err := loss.GetFileName(request.FileName) + fileNameWithoutBucket, err := util.GetFileName(request.FileName) if err != nil { return fmt.Errorf("del file[%s] fail, err: %s", request.FileName, err.Error()) } @@ -159,7 +159,7 @@ func (s *AliCloudOSS) Stat(ctx context.Context, request *file.FileMetaRequest) ( if err != nil { return nil, fmt.Errorf("stat file[%s] fail, err: %s", request.FileName, err.Error()) } - fileNameWithoutBucket, err := loss.GetFileName(request.FileName) + fileNameWithoutBucket, err := util.GetFileName(request.FileName) if err != nil { return nil, fmt.Errorf("stat file[%s] fail, err: %s", request.FileName, err.Error()) } @@ -223,7 +223,7 @@ func (s *AliCloudOSS) getBucket(fileName string, metaData map[string]string) (*o } // get oss bucket - bucketName, err := loss.GetBucketName(fileName) + bucketName, err := util.GetBucketName(fileName) if err != nil { return nil, err } diff --git a/components/file/s3/alicloud/oss_test.go b/components/file/alicloud/oss_test.go similarity index 100% rename from components/file/s3/alicloud/oss_test.go rename to components/file/alicloud/oss_test.go diff --git a/components/file/s3/aws/oss.go b/components/file/aws/oss.go similarity index 86% rename from components/file/s3/aws/oss.go rename to components/file/aws/oss.go index a42b276574..a58b09a240 100644 --- a/components/file/s3/aws/oss.go +++ b/components/file/aws/oss.go @@ -23,6 +23,7 @@ import ( "fmt" "github.com/aws/aws-sdk-go-v2/feature/s3/manager" "io" + "mosn.io/layotto/components/file/util" "strings" "github.com/aws/aws-sdk-go-v2/aws" @@ -30,7 +31,6 @@ import ( "github.com/aws/aws-sdk-go-v2/credentials" "github.com/aws/aws-sdk-go-v2/service/s3" "mosn.io/layotto/components/file" - loss "mosn.io/layotto/components/file/s3" ) const ( @@ -48,6 +48,7 @@ var ( type AwsOss struct { client map[string]*s3.Client meta map[string]*AwsOssMetaData + method string } // AwsOssMetaData describe a aws-oss instance. @@ -58,7 +59,7 @@ type AwsOssMetaData struct { AccessKeySecret string `json:"accessKeySecret"` } -func NewAwsOss() file.File { +func NewAwsFile() file.File { return &AwsOss{ client: make(map[string]*s3.Client), meta: make(map[string]*AwsOssMetaData), @@ -67,6 +68,7 @@ func NewAwsOss() file.File { // Init instance by config. func (a *AwsOss) Init(ctx context.Context, config *file.FileConfig) error { + a.method = config.Method m := make([]*AwsOssMetaData, 0) err := json.Unmarshal(config.Metadata, &m) if err != nil { @@ -130,11 +132,11 @@ func (a *AwsOss) createOssClient(meta *AwsOssMetaData) (*s3.Client, error) { // Put file to aws oss. func (a *AwsOss) Put(ctx context.Context, st *file.PutFileStu) error { //var bodySize int64 - bucket, err := loss.GetBucketName(st.FileName) + bucket, err := util.GetBucketName(st.FileName) if err != nil { return fmt.Errorf("awsoss put file[%s] fail,err: %s", st.FileName, err.Error()) } - key, err := loss.GetFileName(st.FileName) + key, err := util.GetFileName(st.FileName) if err != nil { return fmt.Errorf("awsoss put file[%s] fail,err: %s", st.FileName, err.Error()) } @@ -192,11 +194,11 @@ func (a *AwsOss) selectClient(meta map[string]string) (*s3.Client, error) { // Get object from aws oss. func (a *AwsOss) Get(ctx context.Context, st *file.GetFileStu) (io.ReadCloser, error) { - bucket, err := loss.GetBucketName(st.FileName) + bucket, err := util.GetBucketName(st.FileName) if err != nil { return nil, fmt.Errorf("awsoss get file[%s] fail,err: %s", st.FileName, err.Error()) } - key, err := loss.GetFileName(st.FileName) + key, err := util.GetFileName(st.FileName) if err != nil { return nil, fmt.Errorf("awsoss get file[%s] fail,err: %s", st.FileName, err.Error()) } @@ -217,11 +219,11 @@ func (a *AwsOss) Get(ctx context.Context, st *file.GetFileStu) (io.ReadCloser, e // List objects from aws oss. func (a *AwsOss) List(ctx context.Context, st *file.ListRequest) (*file.ListResp, error) { - bucket, err := loss.GetBucketName(st.DirectoryName) + bucket, err := util.GetBucketName(st.DirectoryName) if err != nil { return nil, fmt.Errorf("list bucket[%s] fail, err: %s", st.DirectoryName, err.Error()) } - prefix := loss.GetFilePrefixName(st.DirectoryName) + prefix := util.GetFilePrefixName(st.DirectoryName) input := &s3.ListObjectsInput{ Bucket: &bucket, MaxKeys: st.PageSize, @@ -253,11 +255,11 @@ func (a *AwsOss) List(ctx context.Context, st *file.ListRequest) (*file.ListResp // Del object in aws oss. func (a *AwsOss) Del(ctx context.Context, st *file.DelRequest) error { - bucket, err := loss.GetBucketName(st.FileName) + bucket, err := util.GetBucketName(st.FileName) if err != nil { return fmt.Errorf("awsoss put file[%s] fail,err: %s", st.FileName, err.Error()) } - key, err := loss.GetFileName(st.FileName) + key, err := util.GetFileName(st.FileName) if err != nil { return fmt.Errorf("awsoss put file[%s] fail,err: %s", st.FileName, err.Error()) } @@ -276,11 +278,11 @@ func (a *AwsOss) Del(ctx context.Context, st *file.DelRequest) error { return nil } func (a *AwsOss) Stat(ctx context.Context, st *file.FileMetaRequest) (*file.FileMetaResp, error) { - bucket, err := loss.GetBucketName(st.FileName) + bucket, err := util.GetBucketName(st.FileName) if err != nil { return nil, fmt.Errorf("awsoss stat file[%s] fail,err: %s", st.FileName, err.Error()) } - key, err := loss.GetFileName(st.FileName) + key, err := util.GetFileName(st.FileName) if err != nil { return nil, fmt.Errorf("awsoss stat file[%s] fail,err: %s", st.FileName, err.Error()) } @@ -303,9 +305,35 @@ func (a *AwsOss) Stat(ctx context.Context, st *file.FileMetaRequest) (*file.File resp.Size = out.ContentLength resp.LastModified = out.LastModified.String() resp.Metadata = make(map[string][]string) - resp.Metadata[loss.ETag] = append(resp.Metadata[loss.ETag], *out.ETag) + resp.Metadata[util.ETag] = append(resp.Metadata[util.ETag], *out.ETag) for k, v := range out.Metadata { resp.Metadata[k] = append(resp.Metadata[k], v) } return resp, nil } + +func NewAwsOss() file.Oss { + return &AwsOss{ + client: make(map[string]*s3.Client), + meta: make(map[string]*AwsOssMetaData), + } +} + +func (a *AwsOss) InitConfig(ctx context.Context, config *file.FileConfig) error { + m := make([]*AwsOssMetaData, 0) + err := json.Unmarshal(config.Metadata, &m) + if err != nil { + return errors.New("invalid config for aws oss") + } + return nil +} + +func (a *AwsOss) InitClient(context.Context, *file.InitRequest) error { + return nil +} +func (a *AwsOss) GetObject(context.Context, *file.GetObjectInput) (io.ReadCloser, error) { + return nil, nil +} +func (a *AwsOss) PutObject(context.Context) error { + return nil +} diff --git a/components/file/s3/aws/oss_test.go b/components/file/aws/oss_test.go similarity index 98% rename from components/file/s3/aws/oss_test.go rename to components/file/aws/oss_test.go index a6eec9cfb1..bfb2ebed6d 100644 --- a/components/file/s3/aws/oss_test.go +++ b/components/file/aws/oss_test.go @@ -35,7 +35,7 @@ const cfg = `[ ]` func TestAwsOss_Init(t *testing.T) { - oss := NewAwsOss() + oss := NewAwsFile() err := oss.Init(context.TODO(), &file.FileConfig{}) assert.Equal(t, err.Error(), "invalid config for aws oss") err = oss.Init(context.TODO(), &file.FileConfig{Metadata: []byte(cfg)}) @@ -84,7 +84,7 @@ func TestAwsOss_IsAwsMetaValid(t *testing.T) { } func TestAwsOss_Put(t *testing.T) { - oss := NewAwsOss() + oss := NewAwsFile() err := oss.Init(context.TODO(), &file.FileConfig{Metadata: []byte(cfg)}) assert.Equal(t, nil, err) diff --git a/components/file/s3/minio/oss.go b/components/file/minio/oss.go similarity index 91% rename from components/file/s3/minio/oss.go rename to components/file/minio/oss.go index e183bbe1e9..6ae15c2fcc 100644 --- a/components/file/s3/minio/oss.go +++ b/components/file/minio/oss.go @@ -22,13 +22,13 @@ import ( "errors" "fmt" "io" + "mosn.io/layotto/components/file/util" "strconv" "github.com/minio/minio-go/v7/pkg/credentials" "github.com/minio/minio-go/v7" "mosn.io/layotto/components/file" - loss "mosn.io/layotto/components/file/s3" ) const ( @@ -87,11 +87,11 @@ func (m *MinioOss) Put(ctx context.Context, st *file.PutFileStu) error { var ( size int64 = -1 ) - bucket, err := loss.GetBucketName(st.FileName) + bucket, err := util.GetBucketName(st.FileName) if err != nil { return fmt.Errorf("minioOss put file[%s] fail,err: %s", st.FileName, err.Error()) } - key, err := loss.GetFileName(st.FileName) + key, err := util.GetFileName(st.FileName) if err != nil { return fmt.Errorf("minioOss put file[%s] fail,err: %s", st.FileName, err.Error()) } @@ -114,11 +114,11 @@ func (m *MinioOss) Put(ctx context.Context, st *file.PutFileStu) error { } func (m *MinioOss) Get(ctx context.Context, st *file.GetFileStu) (io.ReadCloser, error) { - bucket, err := loss.GetBucketName(st.FileName) + bucket, err := util.GetBucketName(st.FileName) if err != nil { return nil, fmt.Errorf("minioOss get file[%s] fail,err: %s", st.FileName, err.Error()) } - key, err := loss.GetFileName(st.FileName) + key, err := util.GetFileName(st.FileName) if err != nil { return nil, fmt.Errorf("minioOss get file[%s] fail,err: %s", st.FileName, err.Error()) } @@ -134,12 +134,12 @@ func (m *MinioOss) Get(ctx context.Context, st *file.GetFileStu) (io.ReadCloser, } func (m *MinioOss) List(ctx context.Context, st *file.ListRequest) (*file.ListResp, error) { - bucket, err := loss.GetBucketName(st.DirectoryName) + bucket, err := util.GetBucketName(st.DirectoryName) marker := "" if err != nil { return nil, fmt.Errorf("MinioOss list bucket[%s] fail, err: %s", st.DirectoryName, err.Error()) } - prefix := loss.GetFilePrefixName(st.DirectoryName) + prefix := util.GetFilePrefixName(st.DirectoryName) core, err := m.selectClient(st.Metadata) if err != nil { @@ -164,11 +164,11 @@ func (m *MinioOss) List(ctx context.Context, st *file.ListRequest) (*file.ListRe } func (m *MinioOss) Del(ctx context.Context, st *file.DelRequest) error { - bucket, err := loss.GetBucketName(st.FileName) + bucket, err := util.GetBucketName(st.FileName) if err != nil { return fmt.Errorf("minioOss del file[%s] fail,err: %s", st.FileName, err.Error()) } - key, err := loss.GetFileName(st.FileName) + key, err := util.GetFileName(st.FileName) if err != nil { return fmt.Errorf("minioOss del file[%s] fail,err: %s", st.FileName, err.Error()) } @@ -180,11 +180,11 @@ func (m *MinioOss) Del(ctx context.Context, st *file.DelRequest) error { } func (m *MinioOss) Stat(ctx context.Context, st *file.FileMetaRequest) (*file.FileMetaResp, error) { - bucket, err := loss.GetBucketName(st.FileName) + bucket, err := util.GetBucketName(st.FileName) if err != nil { return nil, fmt.Errorf("minioOss stat file[%s] fail,err: %s", st.FileName, err.Error()) } - key, err := loss.GetFileName(st.FileName) + key, err := util.GetFileName(st.FileName) if err != nil { return nil, fmt.Errorf("minioOss stat file[%s] fail,err: %s", st.FileName, err.Error()) } @@ -205,7 +205,7 @@ func (m *MinioOss) Stat(ctx context.Context, st *file.FileMetaRequest) (*file.Fi resp.Metadata = make(map[string][]string) resp.LastModified = info.LastModified.String() resp.Size = info.Size - resp.Metadata[loss.ETag] = append(resp.Metadata[loss.ETag], info.ETag) + resp.Metadata[util.ETag] = append(resp.Metadata[util.ETag], info.ETag) for k, v := range info.Metadata { resp.Metadata[k] = v } diff --git a/components/file/s3/minio/oss_test.go b/components/file/minio/oss_test.go similarity index 100% rename from components/file/s3/minio/oss_test.go rename to components/file/minio/oss_test.go diff --git a/components/file/s3/qiniu/qiniu_oss_client.go b/components/file/qiniu/qiniu_oss_client.go similarity index 100% rename from components/file/s3/qiniu/qiniu_oss_client.go rename to components/file/qiniu/qiniu_oss_client.go diff --git a/components/file/s3/qiniu/qiniu_oss_client_test.go b/components/file/qiniu/qiniu_oss_client_test.go similarity index 100% rename from components/file/s3/qiniu/qiniu_oss_client_test.go rename to components/file/qiniu/qiniu_oss_client_test.go diff --git a/components/file/s3/qiniu/qiniu_oss_test.go b/components/file/qiniu/qiniu_oss_test.go similarity index 100% rename from components/file/s3/qiniu/qiniu_oss_test.go rename to components/file/qiniu/qiniu_oss_test.go diff --git a/components/file/s3/qiniu/quniu_oss.go b/components/file/qiniu/quniu_oss.go similarity index 100% rename from components/file/s3/qiniu/quniu_oss.go rename to components/file/qiniu/quniu_oss.go diff --git a/components/file/registry.go b/components/file/registry.go index ee986b7c31..35a9c83719 100644 --- a/components/file/registry.go +++ b/components/file/registry.go @@ -18,7 +18,6 @@ package file import ( "fmt" - "mosn.io/layotto/components/pkg/info" ) @@ -66,3 +65,48 @@ func (r *FileStoreRegistry) Create(name string) (File, error) { } return nil, fmt.Errorf("service component %s is not regsitered", name) } + +type OssRegistry interface { + Register(fs ...*OssFactory) + Create(name string) (Oss, error) +} + +type OssFactory struct { + Name string + FactoryMethod func() Oss +} + +func NewOssFactory(name string, f func() Oss) *OssFactory { + return &OssFactory{ + Name: name, + FactoryMethod: f, + } +} + +type OssStoreRegistry struct { + files map[string]func() Oss + info *info.RuntimeInfo +} + +func NewOssRegistry(info *info.RuntimeInfo) OssRegistry { + info.AddService(ServiceName) + return &OssStoreRegistry{ + files: make(map[string]func() Oss), + info: info, + } +} + +func (r *OssStoreRegistry) Register(fs ...*OssFactory) { + for _, f := range fs { + r.files[f.Name] = f.FactoryMethod + r.info.RegisterComponent(ServiceName, f.Name) + } +} + +func (r *OssStoreRegistry) Create(name string) (Oss, error) { + if f, ok := r.files[name]; ok { + r.info.LoadComponent(ServiceName, name) + return f(), nil + } + return nil, fmt.Errorf("service component %s is not regsitered", name) +} diff --git a/components/file/s3/default.go b/components/file/s3/default.go new file mode 100644 index 0000000000..3ed7f97237 --- /dev/null +++ b/components/file/s3/default.go @@ -0,0 +1 @@ +package s3 diff --git a/components/file/s3/factory.go b/components/file/s3/factory.go new file mode 100644 index 0000000000..0b1b1d128c --- /dev/null +++ b/components/file/s3/factory.go @@ -0,0 +1,22 @@ +package s3 + +import "sync" + +var initFuncRegistry map[string]S3ClientInit +var mux sync.RWMutex + +type S3ClientInit interface { + Init(staticConf map[string]string, DynConf map[string]string) +} + +func RegisterInitFunc(name string, f S3ClientInit) { + mux.Lock() + initFuncRegistry[name] = f + mux.Unlock() +} + +func GetInitFunc(name string) S3ClientInit { + mux.RLock() + defer mux.RUnlock() + return initFuncRegistry[name] +} diff --git a/components/file/s3def.go b/components/file/s3def.go new file mode 100644 index 0000000000..1169e215b1 --- /dev/null +++ b/components/file/s3def.go @@ -0,0 +1,50 @@ +package file + +import ( + "context" + "io" +) + +type Oss interface { + InitConfig(context.Context, *FileConfig) error + InitClient(context.Context, *InitRequest) error + GetObject(context.Context, *GetObjectInput) (io.ReadCloser, error) + PutObject(context.Context) error +} + +type InitRequest struct { + App string + Metadata map[string]string +} + +type GetObjectInput struct { + Bucket string + ExpectedBucketOwner string + IfMatch string + IfModifiedSince string + IfNoneMatch string + IfUnmodifiedSince string + Key string + PartNumber int64 + Range string + RequestPayer string + ResponseCacheControl string + ResponseContentDisposition string + ResponseContentEncoding string + ResponseContentLanguage string + ResponseContentType string + ResponseExpires string + SseCustomerAlgorithm string + SseCustomerKey string + SseCustomerKeyMd5 string + VersionId string +} + +type PutObjectInput struct { + Bucket string + Key string + DataStream io.Reader + Acl string + BucketKeyEnabled bool + CacheControl string +} diff --git a/components/file/s3/tencentcloud/oss.go b/components/file/tencentcloud/oss.go similarity index 100% rename from components/file/s3/tencentcloud/oss.go rename to components/file/tencentcloud/oss.go diff --git a/components/file/s3/tencentcloud/oss_test.go b/components/file/tencentcloud/oss_test.go similarity index 100% rename from components/file/s3/tencentcloud/oss_test.go rename to components/file/tencentcloud/oss_test.go diff --git a/components/file/types.go b/components/file/types.go index 6c68d7a397..1e64b47c43 100644 --- a/components/file/types.go +++ b/components/file/types.go @@ -23,7 +23,8 @@ import ( // FileConfig wraps configuration for a file implementation type FileConfig struct { - Metadata json.RawMessage + Method string `json:"method"` + Metadata json.RawMessage `json:"metadata"` } type PutFileStu struct { diff --git a/components/file/s3/util.go b/components/file/util/util.go similarity index 99% rename from components/file/s3/util.go rename to components/file/util/util.go index 1676a51126..ac128a2477 100644 --- a/components/file/s3/util.go +++ b/components/file/util/util.go @@ -14,7 +14,7 @@ * limitations under the License. */ -package s3 +package util import ( "fmt" diff --git a/components/file/s3/util_test.go b/components/file/util/util_test.go similarity index 99% rename from components/file/s3/util_test.go rename to components/file/util/util_test.go index b4ebd6645a..cefc783861 100644 --- a/components/file/s3/util_test.go +++ b/components/file/util/util_test.go @@ -14,7 +14,7 @@ * limitations under the License. */ -package s3 +package util import ( "testing" diff --git a/go.sum b/go.sum index db951bbad1..4178e9e8a6 100644 --- a/go.sum +++ b/go.sum @@ -221,28 +221,64 @@ github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2z github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-sdk-go-v2 v1.9.1 h1:ZbovGV/qo40nrOJ4q8G33AGICzaPI45FHQWJ9650pF4= github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2 v1.16.3 h1:0W1TSJ7O6OzwuEvIXAtJGvOeQ0SGAhcpxPN2/NK5EhM= +github.com/aws/aws-sdk-go-v2 v1.16.3/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1 h1:SdK4Ppk5IzLs64ZMvr6MrSficMtjY2oS0WOORXTlxwU= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= github.com/aws/aws-sdk-go-v2/config v1.8.2 h1:Dqy4ySXFmulRmZhfynm/5CD4Y6aXiTVhDtXLIuUe/r0= github.com/aws/aws-sdk-go-v2/config v1.8.2/go.mod h1:r0bkX9NyuCuf28qVcsEMtpAQibT7gA1Q0gzkjvgJdLU= +github.com/aws/aws-sdk-go-v2/config v1.15.4 h1:P4mesY1hYUxru4f9SU0XxNKXmzfxsD0FtMIPRBjkH7Q= +github.com/aws/aws-sdk-go-v2/config v1.15.4/go.mod h1:ZijHHh0xd/A+ZY53az0qzC5tT46kt4JVCePf2NX9Lk4= github.com/aws/aws-sdk-go-v2/credentials v1.4.2 h1:8kVE4Og6wlhVrMGiORQ3p9gRj2exjzhFRB+QzWBUa5Q= github.com/aws/aws-sdk-go-v2/credentials v1.4.2/go.mod h1:9Sp6u121/f0NnvHyhG7dgoYeUTEFC2vsvJqJ6wXpkaI= +github.com/aws/aws-sdk-go-v2/credentials v1.12.0 h1:4R/NqlcRFSkR0wxOhgHi+agGpbEr5qMCjn7VqUIJY+E= +github.com/aws/aws-sdk-go-v2/credentials v1.12.0/go.mod h1:9YWk7VW+eyKsoIL6/CljkTrNVWBSK9pkqOPUuijid4A= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.5.1 h1:Nm+BxqBtT0r+AnD6byGMCGT4Km0QwHBy8mAYptNPXY4= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.5.1/go.mod h1:W1ldHfsgeGlKpJ4xZMKZUI6Wmp6EAstU7PxnhbXWWrI= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.4 h1:FP8gquGeGHHdfY6G5llaMQDF+HAf20VKc8opRwmjf04= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.4/go.mod h1:u/s5/Z+ohUQOPXl00m2yJVyioWDECsbpXTQlaqSlufc= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.6 h1:6Q/ITRl/PoOAcbLkT3EOpch/6w9n/YNN6a/v+dfuBY8= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.6/go.mod h1:sj1vB2ZjQ1PQOWc89SyhEJs838UIpDcsa3HylyczQO0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.10 h1:uFWgo6mGJI1n17nbcvSc6fxVuR3xLNqvXt12JCnEcT8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.10/go.mod h1:F+EZtuIwjlv35kRJPyBGcsA4f7bnSoz15zOQ2lJq1Z4= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.4 h1:cnsvEKSoHN4oAN7spMMr0zhEW2MHnhAVpmqQg8E6UcM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.4/go.mod h1:8glyUqVIM4AmeenIsPo0oVh3+NUwnsQml2OFupfQW+0= github.com/aws/aws-sdk-go-v2/internal/ini v1.2.3 h1:NnXJXUz7oihrSlPKEM0yZ19b+7GQ47MX/LluLlEyE/Y= github.com/aws/aws-sdk-go-v2/internal/ini v1.2.3/go.mod h1:EES9ToeC3h063zCFDdqWGnARExNdULPaBvARm1FLwxA= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.11 h1:6cZRymlLEIlDTEB0+5+An6Zj1CKt6rSE69tOmFeu1nk= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.11/go.mod h1:0MR+sS1b/yxsfAPvAESrw8NfwUoxMinDyw6EYR9BS2U= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.1 h1:C21IDZCm9Yu5xqjb3fKmxDoYvJXtw1DNlOmLZEIlY1M= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.1/go.mod h1:l/BbcfqDCT3hePawhy4ZRtewjtdkl6GWtd9/U+1penQ= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.3.0 h1:gceOysEWNNwLd6cki65IMBZ4WAM0MwgBQq2n7kejoT8= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.3.0/go.mod h1:v8ygadNyATSm6elwJ/4gzJwcFhri9RqS8skgHKiwXPU= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1 h1:T4pFel53bkHjL2mMo+4DKE6r6AuoZnM0fg7k1/ratr4= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.4 h1:HXy33+dHXT6WYvnAtIvcQ7Zh4ppeAccz8ofi5bzsQ/A= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.4/go.mod h1:S8TVP66AAkMMdYYCNZGvrdEq9YRm+qLXjio4FqRnrEE= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.1 h1:APEjhKZLFlNVLATnA/TJyA+w1r/xd5r5ACWBDZ9aIvc= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.1/go.mod h1:Ve+eJOx9UWaT/lMVebnFhDhO49fSLVedHoA82+Rqme0= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.4 h1:b16QW0XWl0jWjLABFc1A+uh145Oqv+xDcObNk0iQgUk= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.4/go.mod h1:uKkN7qmSIsNJVyMtxNQoCEYMvFEXbOg9fwCJPdfp2u8= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.7.1 h1:YEz2KMyqK2zyG3uOa0l2xBc/H6NUVJir8FhwHQHF3rc= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.7.1/go.mod h1:yg4EN/BKoc7+DLhNOxxdvoO3+iyW2FuynvaKqLcLDUM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.4 h1:RE/DlZLYrz1OOmq8F28IXHLksuuvlpzUbvJ+SESCZBI= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.4/go.mod h1:oudbsSdDtazNj47z1ut1n37re9hDsKpk2ZI3v7KSxq0= github.com/aws/aws-sdk-go-v2/service/s3 v1.16.0 h1:dt1JQFj/135ozwGIWeCM3aQ8N/kB3Xu3Uu4r9zuOIyc= github.com/aws/aws-sdk-go-v2/service/s3 v1.16.0/go.mod h1:Tk23mCmfL3wb3tNIeMk/0diUZ0W4R6uZtjYKguMLW2s= +github.com/aws/aws-sdk-go-v2/service/s3 v1.26.6 h1:RyI53C9+8xxZ3zrllJwzZjI6/FePzxNv3pvh59Ir0aE= +github.com/aws/aws-sdk-go-v2/service/s3 v1.26.6/go.mod h1:FMXuMpmEOLQUDnQLMjsJ2jJGN7jpji1pQ59Kii+IM4U= github.com/aws/aws-sdk-go-v2/service/sso v1.4.1 h1:RfgQyv3bFT2Js6XokcrNtTjQ6wAVBRpoCgTFsypihHA= github.com/aws/aws-sdk-go-v2/service/sso v1.4.1/go.mod h1:ycPdbJZlM0BLhuBnd80WX9PucWPG88qps/2jl9HugXs= +github.com/aws/aws-sdk-go-v2/service/sso v1.11.4 h1:Uw5wBybFQ1UeA9ts0Y07gbv0ncZnIAyw858tDW0NP2o= +github.com/aws/aws-sdk-go-v2/service/sso v1.11.4/go.mod h1:cPDwJwsP4Kff9mldCXAmddjJL6JGQqtA3Mzer2zyr88= github.com/aws/aws-sdk-go-v2/service/sts v1.7.1 h1:7ce9ugapSgBapwLhg7AJTqKW5U92VRX3vX65k2tsB+g= github.com/aws/aws-sdk-go-v2/service/sts v1.7.1/go.mod h1:r1i8QwKPzwByXqZb3POQfBs7jozrdnHz8PVbsvyx73w= +github.com/aws/aws-sdk-go-v2/service/sts v1.16.4 h1:+xtV90n3abQmgzk1pS++FdxZTrPEDgQng6e4/56WR2A= +github.com/aws/aws-sdk-go-v2/service/sts v1.16.4/go.mod h1:lfSYenAXtavyX2A1LsViglqlG9eEFYxNryTZS5rn3QE= github.com/aws/smithy-go v1.8.0 h1:AEwwwXQZtUwP5Mz506FeXXrKBe0jA8gVM+1gEcSRooc= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aws/smithy-go v1.11.2 h1:eG/N+CcUMAvsdffgMvjMKwfyDzIkjM6pfxMJ8Mzc6mE= +github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f h1:ZNv7On9kyUzm7fvRZumSyy/IUiSC7AzL0I1jKKtwooA= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= @@ -643,6 +679,8 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go index 41f3d727f9..0ba8fcc755 100644 --- a/pkg/grpc/extension/s3/s3.go +++ b/pkg/grpc/extension/s3/s3.go @@ -3,7 +3,8 @@ package s3 import ( "context" rawGRPC "google.golang.org/grpc" - "mosn.io/layotto/components/custom" + "google.golang.org/protobuf/types/known/emptypb" + l8s3 "mosn.io/layotto/components/file" "mosn.io/layotto/pkg/grpc" "mosn.io/layotto/spec/proto/extension/v1" ) @@ -12,27 +13,32 @@ var ( s3Instance *S3Server ) -type S3Server struct { - appId string - config custom.Config - ctx context.Context -} +const ( + AliyunOSS = "aliyun" + MinioOSS = "minio" + AwsOSS = "aws" +) -func NewS3Component() custom.Component { - s3Instance = &S3Server{} - return s3Instance +const ( + Provider = "provider" + Region = "region" + EndPoint = "endpoint" + AccessKeyID = "accessKeyID" + AccessKeySecret = "accessKeySecret" +) + +type S3Server struct { + appId string + ossInstance map[string]l8s3.Oss } func NewS3Server(ac *grpc.ApplicationContext) grpc.GrpcAPI { + s3Instance = &S3Server{} s3Instance.appId = ac.AppId + s3Instance.ossInstance = ac.Oss return s3Instance } -func (s *S3Server) Initialize(ctx context.Context, config custom.Config) error { - s.config = config - return nil -} - func (s *S3Server) Init(conn *rawGRPC.ClientConn) error { return nil } @@ -42,6 +48,14 @@ func (s *S3Server) Register(rawGrpcServer *rawGRPC.Server) error { return nil } +func (s *S3Server) InitClient(ctx context.Context, req *s3.InitRequest) (*emptypb.Empty, error) { + //if s.config.Metadata[Provider] == "" { + // return nil, errors.New("please specific the oss provider in configure file") + //} + + return &emptypb.Empty{}, nil +} + func (s *S3Server) GetObject(req *s3.GetObjectInput, stream s3.S3_GetObjectServer) error { return nil } diff --git a/pkg/grpc/grpc_api.go b/pkg/grpc/grpc_api.go index 6158927e29..0bb37e2205 100644 --- a/pkg/grpc/grpc_api.go +++ b/pkg/grpc/grpc_api.go @@ -54,6 +54,7 @@ type ApplicationContext struct { PubSubs map[string]pubsub.PubSub StateStores map[string]state.Store Files map[string]file.File + Oss map[string]file.Oss LockStores map[string]lock.LockStore Sequencers map[string]sequencer.Store SendToOutputBindingFn func(name string, req *bindings.InvokeRequest) (*bindings.InvokeResponse, error) diff --git a/pkg/runtime/config_test.go b/pkg/runtime/config_test.go index ea74d10c34..621228e65e 100644 --- a/pkg/runtime/config_test.go +++ b/pkg/runtime/config_test.go @@ -15,10 +15,10 @@ package runtime import ( "encoding/json" + "mosn.io/layotto/components/file/alicloud" "testing" "github.com/stretchr/testify/assert" - "mosn.io/layotto/components/file/s3/alicloud" ) func TestConfig(t *testing.T) { diff --git a/pkg/runtime/options.go b/pkg/runtime/options.go index 76fe77286d..26283426e6 100644 --- a/pkg/runtime/options.go +++ b/pkg/runtime/options.go @@ -39,6 +39,7 @@ type services struct { configStores []*configstores.StoreFactory rpcs []*rpc.Factory files []*file.FileFactory + oss []*file.OssFactory pubSubs []*pubsub.Factory states []*state.Factory locks []*runtime_lock.Factory @@ -128,6 +129,12 @@ func WithRpcFactory(rpcs ...*rpc.Factory) Option { } } +func WithOssFactory(oss ...*file.OssFactory) Option { + return func(o *runtimeOptions) { + o.services.oss = append(o.services.oss, oss...) + } +} + func WithFileFactory(files ...*file.FileFactory) Option { return func(o *runtimeOptions) { o.services.files = append(o.services.files, files...) diff --git a/pkg/runtime/runtime.go b/pkg/runtime/runtime.go index ae86b22e81..76c2fb1422 100644 --- a/pkg/runtime/runtime.go +++ b/pkg/runtime/runtime.go @@ -63,6 +63,7 @@ type MosnRuntime struct { lockRegistry runtime_lock.Registry sequencerRegistry runtime_sequencer.Registry fileRegistry file.Registry + ossRegistry file.OssRegistry bindingsRegistry mbindings.Registry secretStoresRegistry msecretstores.Registry customComponentRegistry custom.Registry @@ -75,6 +76,7 @@ type MosnRuntime struct { // state implementations store here are already initialized states map[string]state.Store files map[string]file.File + oss map[string]file.Oss locks map[string]lock.LockStore sequencers map[string]sequencer.Store outputBindings map[string]bindings.OutputBinding @@ -106,6 +108,7 @@ func NewMosnRuntime(runtimeConfig *MosnRuntimeConfig) *MosnRuntime { stateRegistry: runtime_state.NewRegistry(info), bindingsRegistry: mbindings.NewRegistry(info), fileRegistry: file.NewRegistry(info), + ossRegistry: file.NewOssRegistry(info), lockRegistry: runtime_lock.NewRegistry(info), sequencerRegistry: runtime_sequencer.NewRegistry(info), secretStoresRegistry: msecretstores.NewRegistry(info), @@ -116,6 +119,7 @@ func NewMosnRuntime(runtimeConfig *MosnRuntimeConfig) *MosnRuntime { pubSubs: make(map[string]pubsub.PubSub), states: make(map[string]state.Store), files: make(map[string]file.File), + oss: make(map[string]file.Oss), locks: make(map[string]lock.LockStore), sequencers: make(map[string]sequencer.Store), outputBindings: make(map[string]bindings.OutputBinding), @@ -186,6 +190,7 @@ func (m *MosnRuntime) Run(opts ...Option) (mgrpc.RegisteredServer, error) { m.pubSubs, m.states, m.files, + m.oss, m.locks, m.sequencers, m.sendToOutputBinding, @@ -251,6 +256,9 @@ func DefaultInitRuntimeStage(o *runtimeOptions, m *MosnRuntime) error { if err := m.initFiles(o.services.files...); err != nil { return err } + if err := m.initOss(o.services.oss...); err != nil { + return err + } if err := m.initLocks(o.services.locks...); err != nil { return err } @@ -378,11 +386,32 @@ func (m *MosnRuntime) initStates(factorys ...*runtime_state.Factory) error { return nil } +func (m *MosnRuntime) initOss(oss ...*file.OssFactory) error { + log.DefaultLogger.Infof("[runtime] init file service") + + // register all oss store services implementation + m.ossRegistry.Register(oss...) + for name, config := range m.runtimeConfig.Files { + c, err := m.ossRegistry.Create(name) + if err != nil { + m.errInt(err, "create oss component %s failed", name) + return err + } + if err := c.InitConfig(context.TODO(), &config); err != nil { + m.errInt(err, "init oss component %s failed", name) + return err + } + m.oss[name] = c + } + return nil +} + func (m *MosnRuntime) initFiles(files ...*file.FileFactory) error { log.DefaultLogger.Infof("[runtime] init file service") // register all files store services implementation m.fileRegistry.Register(files...) + for name, config := range m.runtimeConfig.Files { c, err := m.fileRegistry.Create(name) if err != nil { diff --git a/spec/proto/extension/v1/s3.pb.go b/spec/proto/extension/v1/s3.pb.go index dc9b83abf3..108e29d92e 100644 --- a/spec/proto/extension/v1/s3.pb.go +++ b/spec/proto/extension/v1/s3.pb.go @@ -15,7 +15,7 @@ import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" _ "google.golang.org/protobuf/types/known/anypb" - _ "google.golang.org/protobuf/types/known/emptypb" + emptypb "google.golang.org/protobuf/types/known/emptypb" reflect "reflect" sync "sync" ) @@ -31,37 +31,93 @@ const ( // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 +type InitRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Metadata map[string]string `protobuf:"bytes,2,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *InitRequest) Reset() { + *x = InitRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InitRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InitRequest) ProtoMessage() {} + +func (x *InitRequest) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[0] + 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 InitRequest.ProtoReflect.Descriptor instead. +func (*InitRequest) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{0} +} + +func (x *InitRequest) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *InitRequest) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + type GetObjectInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,2,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - IfMatch string `protobuf:"bytes,3,opt,name=if_match,json=ifMatch,proto3" json:"if_match,omitempty"` - IfModifiedSince string `protobuf:"bytes,4,opt,name=if_modified_since,json=ifModifiedSince,proto3" json:"if_modified_since,omitempty"` - IfNoneMatch string `protobuf:"bytes,5,opt,name=if_none_match,json=ifNoneMatch,proto3" json:"if_none_match,omitempty"` - IfUnmodifiedSince string `protobuf:"bytes,6,opt,name=if_unmodified_since,json=ifUnmodifiedSince,proto3" json:"if_unmodified_since,omitempty"` - Key string `protobuf:"bytes,7,opt,name=key,proto3" json:"key,omitempty"` - PartNumber int64 `protobuf:"varint,8,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` - Range string `protobuf:"bytes,9,opt,name=range,proto3" json:"range,omitempty"` - RequestPayer string `protobuf:"bytes,10,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - ResponseCacheControl string `protobuf:"bytes,11,opt,name=response_cache_control,json=responseCacheControl,proto3" json:"response_cache_control,omitempty"` - ResponseContentDisposition string `protobuf:"bytes,12,opt,name=response_content_disposition,json=responseContentDisposition,proto3" json:"response_content_disposition,omitempty"` - ResponseContentEncoding string `protobuf:"bytes,13,opt,name=response_content_encoding,json=responseContentEncoding,proto3" json:"response_content_encoding,omitempty"` - ResponseContentLanguage string `protobuf:"bytes,14,opt,name=response_content_language,json=responseContentLanguage,proto3" json:"response_content_language,omitempty"` - ResponseContentType string `protobuf:"bytes,15,opt,name=response_content_type,json=responseContentType,proto3" json:"response_content_type,omitempty"` - ResponseExpires string `protobuf:"bytes,16,opt,name=response_expires,json=responseExpires,proto3" json:"response_expires,omitempty"` - SseCustomerAlgorithm string `protobuf:"bytes,17,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - SseCustomerKey string `protobuf:"bytes,18,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` - SseCustomerKeyMd5 string `protobuf:"bytes,19,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - VersionId string `protobuf:"bytes,20,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,3,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + IfMatch string `protobuf:"bytes,4,opt,name=if_match,json=ifMatch,proto3" json:"if_match,omitempty"` + IfModifiedSince string `protobuf:"bytes,5,opt,name=if_modified_since,json=ifModifiedSince,proto3" json:"if_modified_since,omitempty"` + IfNoneMatch string `protobuf:"bytes,6,opt,name=if_none_match,json=ifNoneMatch,proto3" json:"if_none_match,omitempty"` + IfUnmodifiedSince string `protobuf:"bytes,7,opt,name=if_unmodified_since,json=ifUnmodifiedSince,proto3" json:"if_unmodified_since,omitempty"` + Key string `protobuf:"bytes,8,opt,name=key,proto3" json:"key,omitempty"` + PartNumber int64 `protobuf:"varint,9,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + Range string `protobuf:"bytes,10,opt,name=range,proto3" json:"range,omitempty"` + RequestPayer string `protobuf:"bytes,11,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + ResponseCacheControl string `protobuf:"bytes,12,opt,name=response_cache_control,json=responseCacheControl,proto3" json:"response_cache_control,omitempty"` + ResponseContentDisposition string `protobuf:"bytes,13,opt,name=response_content_disposition,json=responseContentDisposition,proto3" json:"response_content_disposition,omitempty"` + ResponseContentEncoding string `protobuf:"bytes,14,opt,name=response_content_encoding,json=responseContentEncoding,proto3" json:"response_content_encoding,omitempty"` + ResponseContentLanguage string `protobuf:"bytes,15,opt,name=response_content_language,json=responseContentLanguage,proto3" json:"response_content_language,omitempty"` + ResponseContentType string `protobuf:"bytes,16,opt,name=response_content_type,json=responseContentType,proto3" json:"response_content_type,omitempty"` + ResponseExpires string `protobuf:"bytes,17,opt,name=response_expires,json=responseExpires,proto3" json:"response_expires,omitempty"` + SseCustomerAlgorithm string `protobuf:"bytes,18,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SseCustomerKey string `protobuf:"bytes,19,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` + SseCustomerKeyMd5 string `protobuf:"bytes,20,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + VersionId string `protobuf:"bytes,21,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } func (x *GetObjectInput) Reset() { *x = GetObjectInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[0] + mi := &file_s3_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -74,7 +130,7 @@ func (x *GetObjectInput) String() string { func (*GetObjectInput) ProtoMessage() {} func (x *GetObjectInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[0] + mi := &file_s3_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -87,7 +143,14 @@ func (x *GetObjectInput) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObjectInput.ProtoReflect.Descriptor instead. func (*GetObjectInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{0} + return file_s3_proto_rawDescGZIP(), []int{1} +} + +func (x *GetObjectInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" } func (x *GetObjectInput) GetBucket() string { @@ -241,7 +304,7 @@ type GetObjectOutput struct { func (x *GetObjectOutput) Reset() { *x = GetObjectOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[1] + mi := &file_s3_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -254,7 +317,7 @@ func (x *GetObjectOutput) String() string { func (*GetObjectOutput) ProtoMessage() {} func (x *GetObjectOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[1] + mi := &file_s3_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -267,7 +330,7 @@ func (x *GetObjectOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObjectOutput.ProtoReflect.Descriptor instead. func (*GetObjectOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{1} + return file_s3_proto_rawDescGZIP(), []int{2} } func (x *GetObjectOutput) GetBody() []byte { @@ -282,18 +345,19 @@ type PutObjectInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Acl string `protobuf:"bytes,1,opt,name=acl,proto3" json:"acl,omitempty"` - Body []byte `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"` - Bucket string `protobuf:"bytes,3,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,4,opt,name=key,proto3" json:"key,omitempty"` - BucketKeyEnabled bool `protobuf:"varint,5,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - CacheControl string `protobuf:"bytes,6,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Acl string `protobuf:"bytes,2,opt,name=acl,proto3" json:"acl,omitempty"` + Body []byte `protobuf:"bytes,3,opt,name=body,proto3" json:"body,omitempty"` + Bucket string `protobuf:"bytes,4,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,5,opt,name=key,proto3" json:"key,omitempty"` + BucketKeyEnabled bool `protobuf:"varint,6,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + CacheControl string `protobuf:"bytes,7,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` } func (x *PutObjectInput) Reset() { *x = PutObjectInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[2] + mi := &file_s3_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -306,7 +370,7 @@ func (x *PutObjectInput) String() string { func (*PutObjectInput) ProtoMessage() {} func (x *PutObjectInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[2] + mi := &file_s3_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -319,7 +383,14 @@ func (x *PutObjectInput) ProtoReflect() protoreflect.Message { // Deprecated: Use PutObjectInput.ProtoReflect.Descriptor instead. func (*PutObjectInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{2} + return file_s3_proto_rawDescGZIP(), []int{3} +} + +func (x *PutObjectInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" } func (x *PutObjectInput) GetAcl() string { @@ -376,7 +447,7 @@ type PutObjectOutput struct { func (x *PutObjectOutput) Reset() { *x = PutObjectOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[3] + mi := &file_s3_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -389,7 +460,7 @@ func (x *PutObjectOutput) String() string { func (*PutObjectOutput) ProtoMessage() {} func (x *PutObjectOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[3] + mi := &file_s3_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -402,7 +473,7 @@ func (x *PutObjectOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use PutObjectOutput.ProtoReflect.Descriptor instead. func (*PutObjectOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{3} + return file_s3_proto_rawDescGZIP(), []int{4} } func (x *PutObjectOutput) GetBucketKeyEnabled() bool { @@ -427,96 +498,117 @@ var file_s3_proto_rawDesc = []byte{ 0x31, 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, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, - 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe4, 0x06, 0x0a, 0x0e, 0x47, 0x65, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 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, 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, 0x02, 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, 0x03, 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, 0x04, 0x20, 0x01, 0x28, 0x09, 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, 0x05, 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, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x11, 0x69, 0x66, 0x55, 0x6e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x53, 0x69, - 0x6e, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x65, - 0x72, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x61, - 0x63, 0x68, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x14, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x40, 0x0a, 0x1c, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x44, 0x69, - 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, - 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, - 0x67, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, - 0x65, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x13, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, - 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, 0x11, 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, 0x12, 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, 0x13, 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, - 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x22, 0x25, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0xb3, 0x01, 0x0a, 0x0e, 0x50, 0x75, 0x74, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x12, 0x12, 0x0a, 0x04, - 0x62, 0x6f, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, - 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x04, 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, 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, 0x22, 0x53, 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, 0x32, 0xc4, 0x01, 0x0a, 0x02, 0x53, 0x33, 0x12, 0x5e, 0x0a, 0x09, 0x47, 0x65, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, - 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x09, 0x50, 0x75, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, - 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb7, 0x01, 0x0a, 0x0b, 0x49, 0x6e, + 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x4c, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 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, 0x83, 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, 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, 0x03, 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, 0x04, 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, 0x05, 0x20, 0x01, 0x28, 0x09, 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, 0x06, 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, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x69, 0x66, 0x55, 0x6e, 0x6d, + 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1f, + 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x72, 0x61, 0x6e, 0x67, 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, 0x79, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x12, 0x40, 0x0a, 0x1c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x3a, + 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x29, + 0x0a, 0x10, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 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, 0x12, 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, 0x13, 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, 0x14, 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, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x25, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, + 0x22, 0xd2, 0x01, 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, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x61, 0x63, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x05, 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, 0x06, 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, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x22, 0x53, 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, 0x32, 0x90, 0x02, 0x0a, 0x02, 0x53, + 0x33, 0x12, 0x4a, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, + 0x22, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 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, 0x5e, 0x0a, + 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5e, 0x0a, + 0x09, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x42, 0x2c, 0x5a, + 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -531,23 +623,29 @@ func file_s3_proto_rawDescGZIP() []byte { return file_s3_proto_rawDescData } -var file_s3_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_s3_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_s3_proto_goTypes = []interface{}{ - (*GetObjectInput)(nil), // 0: mosn.proto.runtime.v1.GetObjectInput - (*GetObjectOutput)(nil), // 1: mosn.proto.runtime.v1.GetObjectOutput - (*PutObjectInput)(nil), // 2: mosn.proto.runtime.v1.PutObjectInput - (*PutObjectOutput)(nil), // 3: mosn.proto.runtime.v1.PutObjectOutput + (*InitRequest)(nil), // 0: mosn.proto.runtime.v1.InitRequest + (*GetObjectInput)(nil), // 1: mosn.proto.runtime.v1.GetObjectInput + (*GetObjectOutput)(nil), // 2: mosn.proto.runtime.v1.GetObjectOutput + (*PutObjectInput)(nil), // 3: mosn.proto.runtime.v1.PutObjectInput + (*PutObjectOutput)(nil), // 4: mosn.proto.runtime.v1.PutObjectOutput + nil, // 5: mosn.proto.runtime.v1.InitRequest.MetadataEntry + (*emptypb.Empty)(nil), // 6: google.protobuf.Empty } var file_s3_proto_depIdxs = []int32{ - 0, // 0: mosn.proto.runtime.v1.S3.GetObject:input_type -> mosn.proto.runtime.v1.GetObjectInput - 2, // 1: mosn.proto.runtime.v1.S3.PutObject:input_type -> mosn.proto.runtime.v1.PutObjectInput - 1, // 2: mosn.proto.runtime.v1.S3.GetObject:output_type -> mosn.proto.runtime.v1.GetObjectOutput - 3, // 3: mosn.proto.runtime.v1.S3.PutObject:output_type -> mosn.proto.runtime.v1.PutObjectOutput - 2, // [2:4] is the sub-list for method output_type - 0, // [0:2] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name + 5, // 0: mosn.proto.runtime.v1.InitRequest.metadata:type_name -> mosn.proto.runtime.v1.InitRequest.MetadataEntry + 0, // 1: mosn.proto.runtime.v1.S3.InitClient:input_type -> mosn.proto.runtime.v1.InitRequest + 1, // 2: mosn.proto.runtime.v1.S3.GetObject:input_type -> mosn.proto.runtime.v1.GetObjectInput + 3, // 3: mosn.proto.runtime.v1.S3.PutObject:input_type -> mosn.proto.runtime.v1.PutObjectInput + 6, // 4: mosn.proto.runtime.v1.S3.InitClient:output_type -> google.protobuf.Empty + 2, // 5: mosn.proto.runtime.v1.S3.GetObject:output_type -> mosn.proto.runtime.v1.GetObjectOutput + 4, // 6: mosn.proto.runtime.v1.S3.PutObject:output_type -> mosn.proto.runtime.v1.PutObjectOutput + 4, // [4:7] is the sub-list for method output_type + 1, // [1:4] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name } func init() { file_s3_proto_init() } @@ -557,7 +655,7 @@ func file_s3_proto_init() { } if !protoimpl.UnsafeEnabled { file_s3_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObjectInput); i { + switch v := v.(*InitRequest); i { case 0: return &v.state case 1: @@ -569,7 +667,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObjectOutput); i { + switch v := v.(*GetObjectInput); i { case 0: return &v.state case 1: @@ -581,7 +679,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutObjectInput); i { + switch v := v.(*GetObjectOutput); i { case 0: return &v.state case 1: @@ -593,6 +691,18 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PutObjectInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PutObjectOutput); i { case 0: return &v.state @@ -611,7 +721,7 @@ func file_s3_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_s3_proto_rawDesc, NumEnums: 0, - NumMessages: 4, + NumMessages: 6, NumExtensions: 0, NumServices: 1, }, @@ -637,6 +747,7 @@ const _ = grpc.SupportPackageIsVersion6 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type S3Client interface { + InitClient(ctx context.Context, in *InitRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (S3_GetObjectClient, error) PutObject(ctx context.Context, opts ...grpc.CallOption) (S3_PutObjectClient, error) } @@ -649,6 +760,15 @@ func NewS3Client(cc grpc.ClientConnInterface) S3Client { return &s3Client{cc} } +func (c *s3Client) InitClient(ctx context.Context, in *InitRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/InitClient", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *s3Client) GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (S3_GetObjectClient, error) { stream, err := c.cc.NewStream(ctx, &_S3_serviceDesc.Streams[0], "/mosn.proto.runtime.v1.S3/GetObject", opts...) if err != nil { @@ -717,6 +837,7 @@ func (x *s3PutObjectClient) CloseAndRecv() (*PutObjectOutput, error) { // S3Server is the server API for S3 service. type S3Server interface { + InitClient(context.Context, *InitRequest) (*emptypb.Empty, error) GetObject(*GetObjectInput, S3_GetObjectServer) error PutObject(S3_PutObjectServer) error } @@ -725,6 +846,9 @@ type S3Server interface { type UnimplementedS3Server struct { } +func (*UnimplementedS3Server) InitClient(context.Context, *InitRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method InitClient not implemented") +} func (*UnimplementedS3Server) GetObject(*GetObjectInput, S3_GetObjectServer) error { return status.Errorf(codes.Unimplemented, "method GetObject not implemented") } @@ -736,6 +860,24 @@ func RegisterS3Server(s *grpc.Server, srv S3Server) { s.RegisterService(&_S3_serviceDesc, srv) } +func _S3_InitClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(InitRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(S3Server).InitClient(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/InitClient", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).InitClient(ctx, req.(*InitRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _S3_GetObject_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(GetObjectInput) if err := stream.RecvMsg(m); err != nil { @@ -786,7 +928,12 @@ func (x *s3PutObjectServer) Recv() (*PutObjectInput, error) { var _S3_serviceDesc = grpc.ServiceDesc{ ServiceName: "mosn.proto.runtime.v1.S3", HandlerType: (*S3Server)(nil), - Methods: []grpc.MethodDesc{}, + Methods: []grpc.MethodDesc{ + { + MethodName: "InitClient", + Handler: _S3_InitClient_Handler, + }, + }, Streams: []grpc.StreamDesc{ { StreamName: "GetObject", diff --git a/spec/proto/extension/v1/s3.proto b/spec/proto/extension/v1/s3.proto index 31aff484c7..afe6dec10d 100644 --- a/spec/proto/extension/v1/s3.proto +++ b/spec/proto/extension/v1/s3.proto @@ -8,44 +8,52 @@ import "google/protobuf/any.proto"; option go_package = "mosn.io/layotto/spec/proto/extension/v1;s3"; service S3 { - rpc GetObject(GetObjectInput) returns (stream GetObjectOutput) {} + rpc InitClient(InitRequest) returns (google.protobuf.Empty){} + rpc GetObject(GetObjectInput) returns (stream GetObjectOutput){} rpc PutObject(stream PutObjectInput) returns(PutObjectOutput){} } +message InitRequest { + string store_name = 1; + map metadata = 2; +} message GetObjectInput { - string bucket = 1; - string expected_bucket_owner = 2; - string if_match = 3; - string if_modified_since = 4; - string if_none_match = 5; - string if_unmodified_since = 6; - string key = 7; - int64 part_number = 8; - string range = 9; - string request_payer = 10; - string response_cache_control = 11; - string response_content_disposition = 12; - string response_content_encoding = 13; - string response_content_language = 14; - string response_content_type = 15; - string response_expires = 16; - string sse_customer_algorithm = 17; - string sse_customer_key = 18; - string sse_customer_key_md5 = 19; - string version_id = 20; + string store_name = 1; + string bucket = 2; + string expected_bucket_owner = 3; + string if_match = 4; + string if_modified_since = 5; + string if_none_match = 6; + string if_unmodified_since = 7; + string key = 8; + int64 part_number = 9; + string range = 10; + string request_payer = 11; + string response_cache_control = 12; + string response_content_disposition = 13; + string response_content_encoding = 14; + string response_content_language = 15; + string response_content_type = 16; + string response_expires = 17; + string sse_customer_algorithm = 18; + string sse_customer_key = 19; + string sse_customer_key_md5 = 20; + string version_id = 21; } + message GetObjectOutput { bytes body = 1; } message PutObjectInput{ - string acl = 1; - bytes body = 2; - string bucket = 3; - string key = 4; - bool bucket_key_enabled = 5; - string cache_control = 6; + string store_name = 1; + string acl = 2; + bytes body = 3; + string bucket = 4; + string key = 5; + bool bucket_key_enabled = 6; + string cache_control = 7; } message PutObjectOutput{ From 05926c394c6b623a68c6ac0ca03d98f4331d033a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 11 May 2022 10:51:10 +0800 Subject: [PATCH 004/126] refact init function --- components/file/aws/oss.go | 88 ++++++++++++++++++---- components/file/{s3 => factory}/factory.go | 11 +-- components/file/s3/default.go | 1 - components/file/s3def.go | 2 + 4 files changed, 83 insertions(+), 19 deletions(-) rename components/file/{s3 => factory}/factory.go (64%) delete mode 100644 components/file/s3/default.go diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index a58b09a240..c51b42d6e6 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -23,6 +23,7 @@ import ( "fmt" "github.com/aws/aws-sdk-go-v2/feature/s3/manager" "io" + "mosn.io/layotto/components/file/factory" "mosn.io/layotto/components/file/util" "strings" @@ -44,11 +45,56 @@ var ( ErrNotSpecifyEndpoint error = errors.New("should specific endpoint in metadata") ) +func init() { + factory.RegisterInitFunc("", AwsDefaultInitFunc) +} +func AwsDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string) (map[string]interface{}, error) { + m := make([]*AwsOssMetaData, 0) + err := json.Unmarshal(staticConf, &m) + clients := make(map[string]interface{}) + if err != nil { + return nil, errors.New("invalid config for aws oss") + } + for _, data := range m { + customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) { + if region == data.Region { + return aws.Endpoint{ + PartitionID: "aliyun", + URL: "https://" + data.EndPoint, + SigningRegion: data.Region, + HostnameImmutable: true, + }, nil + } + // returning EndpointNotFoundError will allow the service to fallback to it's default resolution + return aws.Endpoint{}, &aws.EndpointNotFoundError{} + }) + + optFunc := []func(options *aws_config.LoadOptions) error{ + aws_config.WithRegion(data.Region), + aws_config.WithCredentialsProvider(credentials.StaticCredentialsProvider{ + Value: aws.Credentials{ + AccessKeyID: data.AccessKeyID, SecretAccessKey: data.AccessKeySecret, + Source: defaultCredentialsSource, + }, + }), + aws_config.WithEndpointResolverWithOptions(customResolver), + } + + cfg, err := aws_config.LoadDefaultConfig(context.TODO(), optFunc...) + if err != nil { + return nil, err + } + clients[data.EndPoint] = s3.NewFromConfig(cfg) + } + return clients, nil +} + // AwsOss is a binding for aws oss storage. type AwsOss struct { - client map[string]*s3.Client - meta map[string]*AwsOssMetaData - method string + client map[string]*s3.Client + meta map[string]*AwsOssMetaData + method string + rawData json.RawMessage } // AwsOssMetaData describe a aws-oss instance. @@ -68,7 +114,6 @@ func NewAwsFile() file.File { // Init instance by config. func (a *AwsOss) Init(ctx context.Context, config *file.FileConfig) error { - a.method = config.Method m := make([]*AwsOssMetaData, 0) err := json.Unmarshal(config.Metadata, &m) if err != nil { @@ -101,7 +146,7 @@ func (a *AwsOss) createOssClient(meta *AwsOssMetaData) (*s3.Client, error) { customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) { if region == meta.Region { return aws.Endpoint{ - PartitionID: "aliyun", + PartitionID: "awsoss", URL: "https://" + meta.EndPoint, SigningRegion: meta.Region, HostnameImmutable: true, @@ -320,19 +365,36 @@ func NewAwsOss() file.Oss { } func (a *AwsOss) InitConfig(ctx context.Context, config *file.FileConfig) error { - m := make([]*AwsOssMetaData, 0) - err := json.Unmarshal(config.Metadata, &m) - if err != nil { - return errors.New("invalid config for aws oss") - } + a.method = config.Method + a.rawData = config.Metadata return nil } -func (a *AwsOss) InitClient(context.Context, *file.InitRequest) error { +func (a *AwsOss) InitClient(ctx context.Context, req *file.InitRequest) error { + initFunc := factory.GetInitFunc(a.method) + clients, err := initFunc(a.rawData, req.Metadata) + if err != nil { + return err + } + for k, v := range clients { + a.client[k] = v.(*s3.Client) + } return nil } -func (a *AwsOss) GetObject(context.Context, *file.GetObjectInput) (io.ReadCloser, error) { - return nil, nil +func (a *AwsOss) GetObject(ctx context.Context, req *file.GetObjectInput) (io.ReadCloser, error) { + input := &s3.GetObjectInput{ + Bucket: &req.Bucket, + Key: &req.Key, + } + client, err := a.selectClient(map[string]string{}) + if err != nil { + return nil, err + } + ob, err := client.GetObject(context.TODO(), input) + if err != nil { + return nil, err + } + return ob.Body, nil } func (a *AwsOss) PutObject(context.Context) error { return nil diff --git a/components/file/s3/factory.go b/components/file/factory/factory.go similarity index 64% rename from components/file/s3/factory.go rename to components/file/factory/factory.go index 0b1b1d128c..13179af8a0 100644 --- a/components/file/s3/factory.go +++ b/components/file/factory/factory.go @@ -1,13 +1,14 @@ -package s3 +package factory -import "sync" +import ( + "encoding/json" + "sync" +) var initFuncRegistry map[string]S3ClientInit var mux sync.RWMutex -type S3ClientInit interface { - Init(staticConf map[string]string, DynConf map[string]string) -} +type S3ClientInit func(staticConf json.RawMessage, DynConf map[string]string) (map[string]interface{}, error) func RegisterInitFunc(name string, f S3ClientInit) { mux.Lock() diff --git a/components/file/s3/default.go b/components/file/s3/default.go deleted file mode 100644 index 3ed7f97237..0000000000 --- a/components/file/s3/default.go +++ /dev/null @@ -1 +0,0 @@ -package s3 diff --git a/components/file/s3def.go b/components/file/s3def.go index 1169e215b1..5b9567d232 100644 --- a/components/file/s3def.go +++ b/components/file/s3def.go @@ -12,6 +12,8 @@ type Oss interface { PutObject(context.Context) error } +type BaseConfig struct { +} type InitRequest struct { App string Metadata map[string]string From 434228e31f65c91a9491ad46bc8b59acf4272fbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 11 May 2022 10:56:34 +0800 Subject: [PATCH 005/126] fix panic --- components/file/factory/factory.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/components/file/factory/factory.go b/components/file/factory/factory.go index 13179af8a0..f36fe31d95 100644 --- a/components/file/factory/factory.go +++ b/components/file/factory/factory.go @@ -10,6 +10,9 @@ var mux sync.RWMutex type S3ClientInit func(staticConf json.RawMessage, DynConf map[string]string) (map[string]interface{}, error) +func init() { + initFuncRegistry = make(map[string]S3ClientInit) +} func RegisterInitFunc(name string, f S3ClientInit) { mux.Lock() initFuncRegistry[name] = f From 6d1662940110dc8f0ba53785e126dcc2c89e1c3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 17 May 2022 20:37:59 +0800 Subject: [PATCH 006/126] remove unused configure --- configs/config_in_memory.json | 8 -------- 1 file changed, 8 deletions(-) diff --git a/configs/config_in_memory.json b/configs/config_in_memory.json index ee00e43187..983ff8d6e7 100644 --- a/configs/config_in_memory.json +++ b/configs/config_in_memory.json @@ -55,14 +55,6 @@ "in-memory": { "metadata": {} } - }, - "extension": { - "s3": { - "metadata": { - "ak": "123", - "sk": "456" - } - } } }, "app": { From 5b406fd31a06b3b0f9a603168851db48e4b53b32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 24 May 2022 16:29:15 +0800 Subject: [PATCH 007/126] add implements of s3 interface --- components/file/aws/oss.go | 12 +- components/file/factory/factory.go | 2 +- components/file/s3def.go | 18 + pkg/grpc/extension/s3/s3.go | 68 + spec/proto/extension/v1/s3.pb.go | 6213 ++++++++++++++++++++++++++-- spec/proto/extension/v1/s3.proto | 357 +- 6 files changed, 6305 insertions(+), 365 deletions(-) diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index 6e582401eb..76bec5b9d8 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -201,7 +201,7 @@ func (a *AwsOss) Put(ctx context.Context, st *file.PutFileStu) error { // Body: st.DataStream, // ContentLength: bodySize, //} - client, err := a.selectClient(st.Metadata) + client, err := a.selectClient(st.Metadata, endpointKey) if err != nil { return err } @@ -222,9 +222,9 @@ func (a *AwsOss) Put(ctx context.Context, st *file.PutFileStu) error { } // selectClient choose aws client from exist client-map, key is endpoint, value is client instance. -func (a *AwsOss) selectClient(meta map[string]string) (*s3.Client, error) { +func (a *AwsOss) selectClient(meta map[string]string, key string) (*s3.Client, error) { // exist specific client with key endpoint - if ep, ok := meta[endpointKey]; ok { + if ep, ok := meta[key]; ok { if client, ok := a.client[ep]; ok { return client, nil } @@ -252,7 +252,7 @@ func (a *AwsOss) Get(ctx context.Context, st *file.GetFileStu) (io.ReadCloser, e Bucket: &bucket, Key: &key, } - client, err := a.selectClient(st.Metadata) + client, err := a.selectClient(st.Metadata, endpointKey) if err != nil { return nil, err } @@ -382,12 +382,13 @@ func (a *AwsOss) InitClient(ctx context.Context, req *file.InitRequest) error { } return nil } + func (a *AwsOss) GetObject(ctx context.Context, req *file.GetObjectInput) (io.ReadCloser, error) { input := &s3.GetObjectInput{ Bucket: &req.Bucket, Key: &req.Key, } - client, err := a.selectClient(map[string]string{}) + client, err := a.selectClient(map[string]string{}, req.ClientName) if err != nil { return nil, err } @@ -397,6 +398,7 @@ func (a *AwsOss) GetObject(ctx context.Context, req *file.GetObjectInput) (io.Re } return ob.Body, nil } + func (a *AwsOss) PutObject(context.Context) error { return nil } diff --git a/components/file/factory/factory.go b/components/file/factory/factory.go index f36fe31d95..f313c06d38 100644 --- a/components/file/factory/factory.go +++ b/components/file/factory/factory.go @@ -8,7 +8,7 @@ import ( var initFuncRegistry map[string]S3ClientInit var mux sync.RWMutex -type S3ClientInit func(staticConf json.RawMessage, DynConf map[string]string) (map[string]interface{}, error) +type S3ClientInit func(staticConf json.RawMessage, dynConf map[string]string) (map[string]interface{}, error) func init() { initFuncRegistry = make(map[string]S3ClientInit) diff --git a/components/file/s3def.go b/components/file/s3def.go index 5b9567d232..0e2d17c9d9 100644 --- a/components/file/s3def.go +++ b/components/file/s3def.go @@ -1,3 +1,19 @@ +/* + * 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 file import ( @@ -20,6 +36,7 @@ type InitRequest struct { } type GetObjectInput struct { + ClientName string Bucket string ExpectedBucketOwner string IfMatch string @@ -43,6 +60,7 @@ type GetObjectInput struct { } type PutObjectInput struct { + ClientName string Bucket string Key string DataStream io.Reader diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go index 0ba8fcc755..761b473f4d 100644 --- a/pkg/grpc/extension/s3/s3.go +++ b/pkg/grpc/extension/s3/s3.go @@ -1,3 +1,19 @@ +/* + * 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 s3 import ( @@ -63,3 +79,55 @@ func (s *S3Server) GetObject(req *s3.GetObjectInput, stream s3.S3_GetObjectServe func (s *S3Server) PutObject(s3.S3_PutObjectServer) error { return nil } + +func (s *S3Server) DeleteObject(context.Context, *s3.DeleteObjectInput) (*s3.DeleteObjectOutput, error) { + return nil, nil +} +func (s *S3Server) PutObjectTagging(context.Context, *s3.PutBucketTaggingInput) (*s3.PutBucketTaggingOutput, error) { + return nil, nil +} +func (s *S3Server) DeleteObjectTagging(context.Context, *s3.DeleteObjectTaggingInput) (*s3.DeleteObjectTaggingOutput, error) { + return nil, nil +} +func (s *S3Server) GetObjectTagging(context.Context, *s3.GetObjectTaggingInput) (*s3.GetObjectTaggingOutput, error) { + return nil, nil +} +func (s *S3Server) CopyObject(context.Context, *s3.CopyObjectInput) (*s3.CopyObjectOutput, error) { + return nil, nil +} +func (s *S3Server) DeleteObjects(context.Context, *s3.DeleteObjectsInput) (*s3.DeleteObjectsOutput, error) { + return nil, nil +} +func (s *S3Server) ListObjects(context.Context, *s3.ListObjectsInput) (*s3.ListObjectsOutput, error) { + return nil, nil +} +func (s *S3Server) GetObjectAcl(context.Context, *s3.GetObjectAclInput) (*s3.GetObjectAclOutput, error) { + return nil, nil +} +func (s *S3Server) PutObjectAcl(context.Context, *s3.PutObjectAclInput) (*s3.PutObjectAclOutput, error) { + return nil, nil +} +func (s *S3Server) RestoreObject(context.Context, *s3.RestoreObjectInput) (*s3.RestoreObjectOutput, error) { + return nil, nil +} +func (s *S3Server) CreateMultipartUpload(context.Context, *s3.CreateMultipartUploadInput) (*s3.CreateMultipartUploadOutput, error) { + return nil, nil +} +func (s *S3Server) UploadPart(s3.S3_UploadPartServer) error { + return nil +} +func (s *S3Server) UploadPartCopy(context.Context, *s3.UploadPartCopyInput) (*s3.UploadPartCopyOutput, error) { + return nil, nil +} +func (s *S3Server) CompleteMultipartUpload(context.Context, *s3.CompleteMultipartUploadInput) (*s3.CompleteMultipartUploadOutput, error) { + return nil, nil +} +func (s *S3Server) AbortMultipartUpload(context.Context, *s3.AbortMultipartUploadInput) (*s3.AbortMultipartUploadOutput, error) { + return nil, nil +} +func (s *S3Server) ListMultipartUploads(context.Context, *s3.ListMultipartUploadsInput) (*s3.ListMultipartUploadsOutput, error) { + return nil, nil +} +func (s *S3Server) ListObjectVersions(context.Context, *s3.ListObjectVersionsInput) (*s3.ListObjectVersionsOutput, error) { + return nil, nil +} diff --git a/spec/proto/extension/v1/s3.pb.go b/spec/proto/extension/v1/s3.pb.go index 108e29d92e..254fd3aba2 100644 --- a/spec/proto/extension/v1/s3.pb.go +++ b/spec/proto/extension/v1/s3.pb.go @@ -14,8 +14,8 @@ import ( status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" - _ "google.golang.org/protobuf/types/known/anypb" emptypb "google.golang.org/protobuf/types/known/emptypb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" ) @@ -490,439 +490,5875 @@ func (x *PutObjectOutput) GetEtag() string { return "" } -var File_s3_proto protoreflect.FileDescriptor +type DeleteObjectInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -var file_s3_proto_rawDesc = []byte{ - 0x0a, 0x08, 0x73, 0x33, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x6d, 0x6f, 0x73, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 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, 0x1a, 0x19, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, - 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb7, 0x01, 0x0a, 0x0b, 0x49, 0x6e, - 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x4c, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 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, 0x83, 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, 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, 0x03, 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, 0x04, 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, 0x05, 0x20, 0x01, 0x28, 0x09, 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, 0x06, 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, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x69, 0x66, 0x55, 0x6e, 0x6d, - 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1f, - 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, - 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x72, 0x61, 0x6e, 0x67, 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, 0x79, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x12, 0x40, 0x0a, 0x1c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x3a, - 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x29, - 0x0a, 0x10, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, - 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 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, 0x12, 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, 0x13, 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, 0x14, 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, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x25, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, - 0x22, 0xd2, 0x01, 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, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x61, 0x63, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x05, 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, 0x06, 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, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x22, 0x53, 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, 0x32, 0x90, 0x02, 0x0a, 0x02, 0x53, - 0x33, 0x12, 0x4a, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, - 0x22, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 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, 0x5e, 0x0a, - 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5e, 0x0a, - 0x09, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x42, 0x2c, 0x5a, - 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` } -var ( - file_s3_proto_rawDescOnce sync.Once - file_s3_proto_rawDescData = file_s3_proto_rawDesc -) +func (x *DeleteObjectInput) Reset() { + *x = DeleteObjectInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} -func file_s3_proto_rawDescGZIP() []byte { - file_s3_proto_rawDescOnce.Do(func() { - file_s3_proto_rawDescData = protoimpl.X.CompressGZIP(file_s3_proto_rawDescData) - }) - return file_s3_proto_rawDescData +func (x *DeleteObjectInput) String() string { + return protoimpl.X.MessageStringOf(x) } -var file_s3_proto_msgTypes = make([]protoimpl.MessageInfo, 6) -var file_s3_proto_goTypes = []interface{}{ - (*InitRequest)(nil), // 0: mosn.proto.runtime.v1.InitRequest - (*GetObjectInput)(nil), // 1: mosn.proto.runtime.v1.GetObjectInput - (*GetObjectOutput)(nil), // 2: mosn.proto.runtime.v1.GetObjectOutput - (*PutObjectInput)(nil), // 3: mosn.proto.runtime.v1.PutObjectInput - (*PutObjectOutput)(nil), // 4: mosn.proto.runtime.v1.PutObjectOutput - nil, // 5: mosn.proto.runtime.v1.InitRequest.MetadataEntry - (*emptypb.Empty)(nil), // 6: google.protobuf.Empty +func (*DeleteObjectInput) ProtoMessage() {} + +func (x *DeleteObjectInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[5] + 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) } -var file_s3_proto_depIdxs = []int32{ - 5, // 0: mosn.proto.runtime.v1.InitRequest.metadata:type_name -> mosn.proto.runtime.v1.InitRequest.MetadataEntry - 0, // 1: mosn.proto.runtime.v1.S3.InitClient:input_type -> mosn.proto.runtime.v1.InitRequest - 1, // 2: mosn.proto.runtime.v1.S3.GetObject:input_type -> mosn.proto.runtime.v1.GetObjectInput - 3, // 3: mosn.proto.runtime.v1.S3.PutObject:input_type -> mosn.proto.runtime.v1.PutObjectInput - 6, // 4: mosn.proto.runtime.v1.S3.InitClient:output_type -> google.protobuf.Empty - 2, // 5: mosn.proto.runtime.v1.S3.GetObject:output_type -> mosn.proto.runtime.v1.GetObjectOutput - 4, // 6: mosn.proto.runtime.v1.S3.PutObject:output_type -> mosn.proto.runtime.v1.PutObjectOutput - 4, // [4:7] is the sub-list for method output_type - 1, // [1:4] is the sub-list for method input_type - 1, // [1:1] is the sub-list for extension type_name - 1, // [1:1] is the sub-list for extension extendee - 0, // [0:1] is the sub-list for field type_name + +// Deprecated: Use DeleteObjectInput.ProtoReflect.Descriptor instead. +func (*DeleteObjectInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{5} } -func init() { file_s3_proto_init() } -func file_s3_proto_init() { - if File_s3_proto != nil { - return +func (x *DeleteObjectInput) GetBucket() string { + if x != nil { + return x.Bucket } - if !protoimpl.UnsafeEnabled { - file_s3_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InitRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_s3_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObjectInput); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_s3_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObjectOutput); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_s3_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutObjectInput); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } + return "" +} + +func (x *DeleteObjectInput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +type DeleteObjectOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeleteMarker bool `protobuf:"varint,1,opt,name=delete_marker,json=deleteMarker,proto3" json:"delete_marker,omitempty"` + RequestCharged string `protobuf:"bytes,2,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + VersionId string `protobuf:"bytes,3,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` +} + +func (x *DeleteObjectOutput) Reset() { + *x = DeleteObjectOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteObjectOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteObjectOutput) ProtoMessage() {} + +func (x *DeleteObjectOutput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - file_s3_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutObjectOutput); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteObjectOutput.ProtoReflect.Descriptor instead. +func (*DeleteObjectOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{6} +} + +func (x *DeleteObjectOutput) GetDeleteMarker() bool { + if x != nil { + return x.DeleteMarker + } + return false +} + +func (x *DeleteObjectOutput) GetRequestCharged() string { + if x != nil { + return x.RequestCharged + } + return "" +} + +func (x *DeleteObjectOutput) GetVersionId() string { + if x != nil { + return x.VersionId + } + return "" +} + +type PutBucketTaggingInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Tags map[string]string `protobuf:"bytes,2,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 *PutBucketTaggingInput) Reset() { + *x = PutBucketTaggingInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PutBucketTaggingInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PutBucketTaggingInput) ProtoMessage() {} + +func (x *PutBucketTaggingInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } + return ms } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_s3_proto_rawDesc, - NumEnums: 0, - NumMessages: 6, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_s3_proto_goTypes, - DependencyIndexes: file_s3_proto_depIdxs, - MessageInfos: file_s3_proto_msgTypes, - }.Build() - File_s3_proto = out.File - file_s3_proto_rawDesc = nil - file_s3_proto_goTypes = nil - file_s3_proto_depIdxs = nil + return mi.MessageOf(x) } -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface +// Deprecated: Use PutBucketTaggingInput.ProtoReflect.Descriptor instead. +func (*PutBucketTaggingInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{7} +} -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 +func (x *PutBucketTaggingInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} -// S3Client is the client API for S3 service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type S3Client interface { - InitClient(ctx context.Context, in *InitRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (S3_GetObjectClient, error) - PutObject(ctx context.Context, opts ...grpc.CallOption) (S3_PutObjectClient, error) +func (x *PutBucketTaggingInput) GetTags() map[string]string { + if x != nil { + return x.Tags + } + return nil } -type s3Client struct { - cc grpc.ClientConnInterface +type PutBucketTaggingOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func NewS3Client(cc grpc.ClientConnInterface) S3Client { - return &s3Client{cc} +func (x *PutBucketTaggingOutput) Reset() { + *x = PutBucketTaggingOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PutBucketTaggingOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PutBucketTaggingOutput) ProtoMessage() {} + +func (x *PutBucketTaggingOutput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[8] + 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 PutBucketTaggingOutput.ProtoReflect.Descriptor instead. +func (*PutBucketTaggingOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{8} +} + +type DeleteObjectTaggingInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The bucket name containing the objects from which to remove the tags. + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` +} + +func (x *DeleteObjectTaggingInput) Reset() { + *x = DeleteObjectTaggingInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteObjectTaggingInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteObjectTaggingInput) ProtoMessage() {} + +func (x *DeleteObjectTaggingInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[9] + 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 DeleteObjectTaggingInput.ProtoReflect.Descriptor instead. +func (*DeleteObjectTaggingInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{9} +} + +func (x *DeleteObjectTaggingInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *DeleteObjectTaggingInput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +type DeleteObjectTaggingOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VersionId string `protobuf:"bytes,1,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` +} + +func (x *DeleteObjectTaggingOutput) Reset() { + *x = DeleteObjectTaggingOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteObjectTaggingOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteObjectTaggingOutput) ProtoMessage() {} + +func (x *DeleteObjectTaggingOutput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[10] + 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 DeleteObjectTaggingOutput.ProtoReflect.Descriptor instead. +func (*DeleteObjectTaggingOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{10} +} + +func (x *DeleteObjectTaggingOutput) GetVersionId() string { + if x != nil { + return x.VersionId + } + return "" +} + +type GetObjectTaggingInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` +} + +func (x *GetObjectTaggingInput) Reset() { + *x = GetObjectTaggingInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetObjectTaggingInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetObjectTaggingInput) ProtoMessage() {} + +func (x *GetObjectTaggingInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[11] + 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 GetObjectTaggingInput.ProtoReflect.Descriptor instead. +func (*GetObjectTaggingInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{11} +} + +func (x *GetObjectTaggingInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *GetObjectTaggingInput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +type GetObjectTaggingOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Tags map[string]string `protobuf:"bytes,1,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 *GetObjectTaggingOutput) Reset() { + *x = GetObjectTaggingOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetObjectTaggingOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetObjectTaggingOutput) ProtoMessage() {} + +func (x *GetObjectTaggingOutput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[12] + 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 GetObjectTaggingOutput.ProtoReflect.Descriptor instead. +func (*GetObjectTaggingOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{12} +} + +func (x *GetObjectTaggingOutput) GetTags() map[string]string { + if x != nil { + return x.Tags + } + return nil +} + +type CopyObjectInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + CopySource string `protobuf:"bytes,3,opt,name=copy_source,json=copySource,proto3" json:"copy_source,omitempty"` +} + +func (x *CopyObjectInput) Reset() { + *x = CopyObjectInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CopyObjectInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CopyObjectInput) ProtoMessage() {} + +func (x *CopyObjectInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[13] + 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 CopyObjectInput.ProtoReflect.Descriptor instead. +func (*CopyObjectInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{13} +} + +func (x *CopyObjectInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *CopyObjectInput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *CopyObjectInput) GetCopySource() string { + if x != nil { + return x.CopySource + } + return "" +} + +type CopyObjectOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CopyObjectOutput) Reset() { + *x = CopyObjectOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CopyObjectOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CopyObjectOutput) ProtoMessage() {} + +func (x *CopyObjectOutput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[14] + 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 CopyObjectOutput.ProtoReflect.Descriptor instead. +func (*CopyObjectOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{14} +} + +type DeleteObjectsInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The bucket name containing the objects from which to remove the tags. + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Objects []string `protobuf:"bytes,2,rep,name=objects,proto3" json:"objects,omitempty"` +} + +func (x *DeleteObjectsInput) Reset() { + *x = DeleteObjectsInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteObjectsInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteObjectsInput) ProtoMessage() {} + +func (x *DeleteObjectsInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[15] + 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 DeleteObjectsInput.ProtoReflect.Descriptor instead. +func (*DeleteObjectsInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{15} +} + +func (x *DeleteObjectsInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *DeleteObjectsInput) GetObjects() []string { + if x != nil { + return x.Objects + } + return nil +} + +type DeleteObjectsOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DeleteObjectsOutput) Reset() { + *x = DeleteObjectsOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteObjectsOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteObjectsOutput) ProtoMessage() {} + +func (x *DeleteObjectsOutput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[16] + 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 DeleteObjectsOutput.ProtoReflect.Descriptor instead. +func (*DeleteObjectsOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{16} +} + +type ListObjectsInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` +} + +func (x *ListObjectsInput) Reset() { + *x = ListObjectsInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListObjectsInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListObjectsInput) ProtoMessage() {} + +func (x *ListObjectsInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[17] + 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 ListObjectsInput.ProtoReflect.Descriptor instead. +func (*ListObjectsInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{17} +} + +func (x *ListObjectsInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +type ListObjectsOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CommonPrefixes []string `protobuf:"bytes,1,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` + Contents []*Object `protobuf:"bytes,2,rep,name=contents,proto3" json:"contents,omitempty"` + Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` + EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + IsTruncated bool `protobuf:"varint,5,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` + Marker string `protobuf:"bytes,6,opt,name=marker,proto3" json:"marker,omitempty"` + MaxKeys int64 `protobuf:"varint,7,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` + Name string `protobuf:"bytes,8,opt,name=name,proto3" json:"name,omitempty"` + NextMarker string `protobuf:"bytes,9,opt,name=next_marker,json=nextMarker,proto3" json:"next_marker,omitempty"` + Prefix string `protobuf:"bytes,10,opt,name=prefix,proto3" json:"prefix,omitempty"` +} + +func (x *ListObjectsOutput) Reset() { + *x = ListObjectsOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListObjectsOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListObjectsOutput) ProtoMessage() {} + +func (x *ListObjectsOutput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[18] + 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 ListObjectsOutput.ProtoReflect.Descriptor instead. +func (*ListObjectsOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{18} +} + +func (x *ListObjectsOutput) GetCommonPrefixes() []string { + if x != nil { + return x.CommonPrefixes + } + return nil +} + +func (x *ListObjectsOutput) GetContents() []*Object { + if x != nil { + return x.Contents + } + return nil +} + +func (x *ListObjectsOutput) GetDelimiter() string { + if x != nil { + return x.Delimiter + } + return "" +} + +func (x *ListObjectsOutput) GetEncodingType() string { + if x != nil { + return x.EncodingType + } + return "" +} + +func (x *ListObjectsOutput) GetIsTruncated() bool { + if x != nil { + return x.IsTruncated + } + return false +} + +func (x *ListObjectsOutput) GetMarker() string { + if x != nil { + return x.Marker + } + return "" +} + +func (x *ListObjectsOutput) GetMaxKeys() int64 { + if x != nil { + return x.MaxKeys + } + return 0 +} + +func (x *ListObjectsOutput) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ListObjectsOutput) GetNextMarker() string { + if x != nil { + return x.NextMarker + } + return "" +} + +func (x *ListObjectsOutput) GetPrefix() string { + if x != nil { + return x.Prefix + } + return "" +} + +type Owner struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *Owner) Reset() { + *x = Owner{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Owner) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Owner) ProtoMessage() {} + +func (x *Owner) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[19] + 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 Owner.ProtoReflect.Descriptor instead. +func (*Owner) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{19} +} + +func (x *Owner) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *Owner) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type Object struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + LastModified *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` + Owner *Owner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` + Size int64 `protobuf:"varint,5,opt,name=size,proto3" json:"size,omitempty"` + StorageClass string `protobuf:"bytes,6,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` +} + +func (x *Object) Reset() { + *x = Object{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Object) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Object) ProtoMessage() {} + +func (x *Object) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[20] + 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 Object.ProtoReflect.Descriptor instead. +func (*Object) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{20} +} + +func (x *Object) GetEtag() string { + if x != nil { + return x.Etag + } + return "" +} + +func (x *Object) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *Object) GetLastModified() *timestamppb.Timestamp { + if x != nil { + return x.LastModified + } + return nil +} + +func (x *Object) GetOwner() *Owner { + if x != nil { + return x.Owner + } + return nil +} + +func (x *Object) GetSize() int64 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *Object) GetStorageClass() string { + if x != nil { + return x.StorageClass + } + return "" +} + +type Grantee struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + EmailAddress string `protobuf:"bytes,2,opt,name=email_address,json=emailAddress,proto3" json:"email_address,omitempty"` + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` + Type string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"` + Uri string `protobuf:"bytes,5,opt,name=uri,proto3" json:"uri,omitempty"` +} + +func (x *Grantee) Reset() { + *x = Grantee{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Grantee) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Grantee) ProtoMessage() {} + +func (x *Grantee) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[21] + 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 Grantee.ProtoReflect.Descriptor instead. +func (*Grantee) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{21} +} + +func (x *Grantee) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *Grantee) GetEmailAddress() string { + if x != nil { + return x.EmailAddress + } + return "" +} + +func (x *Grantee) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Grantee) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *Grantee) GetUri() string { + if x != nil { + return x.Uri + } + return "" +} + +type Grant struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Grantee *Grantee `protobuf:"bytes,1,opt,name=grantee,proto3" json:"grantee,omitempty"` + Permission string `protobuf:"bytes,2,opt,name=permission,proto3" json:"permission,omitempty"` +} + +func (x *Grant) Reset() { + *x = Grant{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Grant) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Grant) ProtoMessage() {} + +func (x *Grant) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[22] + 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 Grant.ProtoReflect.Descriptor instead. +func (*Grant) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{22} +} + +func (x *Grant) GetGrantee() *Grantee { + if x != nil { + return x.Grantee + } + return nil +} + +func (x *Grant) GetPermission() string { + if x != nil { + return x.Permission + } + return "" +} + +type GetObjectAclInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` +} + +func (x *GetObjectAclInput) Reset() { + *x = GetObjectAclInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetObjectAclInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetObjectAclInput) ProtoMessage() {} + +func (x *GetObjectAclInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[23] + 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 GetObjectAclInput.ProtoReflect.Descriptor instead. +func (*GetObjectAclInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{23} +} + +func (x *GetObjectAclInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *GetObjectAclInput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +type GetObjectAclOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Grants []*Grant `protobuf:"bytes,1,rep,name=grants,proto3" json:"grants,omitempty"` + Owner *Owner `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,omitempty"` + RequestCharged string `protobuf:"bytes,3,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` +} + +func (x *GetObjectAclOutput) Reset() { + *x = GetObjectAclOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetObjectAclOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetObjectAclOutput) ProtoMessage() {} + +func (x *GetObjectAclOutput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[24] + 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 GetObjectAclOutput.ProtoReflect.Descriptor instead. +func (*GetObjectAclOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{24} +} + +func (x *GetObjectAclOutput) GetGrants() []*Grant { + if x != nil { + return x.Grants + } + return nil +} + +func (x *GetObjectAclOutput) GetOwner() *Owner { + if x != nil { + return x.Owner + } + return nil +} + +func (x *GetObjectAclOutput) GetRequestCharged() string { + if x != nil { + return x.RequestCharged + } + return "" +} + +type PutObjectAclInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Acl string `protobuf:"bytes,3,opt,name=acl,proto3" json:"acl,omitempty"` +} + +func (x *PutObjectAclInput) Reset() { + *x = PutObjectAclInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PutObjectAclInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PutObjectAclInput) ProtoMessage() {} + +func (x *PutObjectAclInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[25] + 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 PutObjectAclInput.ProtoReflect.Descriptor instead. +func (*PutObjectAclInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{25} +} + +func (x *PutObjectAclInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *PutObjectAclInput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *PutObjectAclInput) GetAcl() string { + if x != nil { + return x.Acl + } + return "" +} + +type PutObjectAclOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RequestCharged string `protobuf:"bytes,1,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` +} + +func (x *PutObjectAclOutput) Reset() { + *x = PutObjectAclOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PutObjectAclOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PutObjectAclOutput) ProtoMessage() {} + +func (x *PutObjectAclOutput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PutObjectAclOutput.ProtoReflect.Descriptor instead. +func (*PutObjectAclOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{26} +} + +func (x *PutObjectAclOutput) GetRequestCharged() string { + if x != nil { + return x.RequestCharged + } + return "" +} + +type RestoreObjectInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` +} + +func (x *RestoreObjectInput) Reset() { + *x = RestoreObjectInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RestoreObjectInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RestoreObjectInput) ProtoMessage() {} + +func (x *RestoreObjectInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RestoreObjectInput.ProtoReflect.Descriptor instead. +func (*RestoreObjectInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{27} +} + +func (x *RestoreObjectInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *RestoreObjectInput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +type RestoreObjectOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RequestCharged string `protobuf:"bytes,1,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + RestoreOutputPath string `protobuf:"bytes,2,opt,name=restore_output_path,json=restoreOutputPath,proto3" json:"restore_output_path,omitempty"` +} + +func (x *RestoreObjectOutput) Reset() { + *x = RestoreObjectOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RestoreObjectOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RestoreObjectOutput) ProtoMessage() {} + +func (x *RestoreObjectOutput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[28] + 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 RestoreObjectOutput.ProtoReflect.Descriptor instead. +func (*RestoreObjectOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{28} +} + +func (x *RestoreObjectOutput) GetRequestCharged() string { + if x != nil { + return x.RequestCharged + } + return "" +} + +func (x *RestoreObjectOutput) GetRestoreOutputPath() string { + if x != nil { + return x.RestoreOutputPath + } + return "" +} + +type CreateMultipartUploadInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Acl string `protobuf:"bytes,3,opt,name=acl,proto3" json:"acl,omitempty"` + BucketKeyEnabled bool `protobuf:"varint,4,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + CacheControl string `protobuf:"bytes,5,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` + ContentDisposition string `protobuf:"bytes,6,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` + ContentEncoding string `protobuf:"bytes,7,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` + ContentLanguage string `protobuf:"bytes,8,opt,name=content_language,json=contentLanguage,proto3" json:"content_language,omitempty"` + ContentType string `protobuf:"bytes,9,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,10,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + Expires string `protobuf:"bytes,11,opt,name=expires,proto3" json:"expires,omitempty"` + GrantFullControl string `protobuf:"bytes,12,opt,name=grant_full_control,json=grantFullControl,proto3" json:"grant_full_control,omitempty"` + GrantRead string `protobuf:"bytes,13,opt,name=grant_read,json=grantRead,proto3" json:"grant_read,omitempty"` + GrantReadAcp string `protobuf:"bytes,14,opt,name=grant_read_acp,json=grantReadAcp,proto3" json:"grant_read_acp,omitempty"` + GrantWriteAcp string `protobuf:"bytes,15,opt,name=grant_write_acp,json=grantWriteAcp,proto3" json:"grant_write_acp,omitempty"` + MetaData map[string]string `protobuf:"bytes,16,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"` + ObjectLockLegalHoldStatus string `protobuf:"bytes,17,opt,name=object_lock_legal_hold_status,json=objectLockLegalHoldStatus,proto3" json:"object_lock_legal_hold_status,omitempty"` + ObjectLockMode string `protobuf:"bytes,18,opt,name=object_lock_mode,json=objectLockMode,proto3" json:"object_lock_mode,omitempty"` + ObjectLockRetainUntilDate string `protobuf:"bytes,19,opt,name=object_lock_retain_until_date,json=objectLockRetainUntilDate,proto3" json:"object_lock_retain_until_date,omitempty"` + RequestPayer string `protobuf:"bytes,20,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + SseCustomerAlgorithm string `protobuf:"bytes,21,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SseCustomerKey string `protobuf:"bytes,22,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` + SseCustomerKeyMd5 string `protobuf:"bytes,23,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + SseKmsEncryptionContext string `protobuf:"bytes,24,opt,name=sse_kms_encryption_context,json=sseKmsEncryptionContext,proto3" json:"sse_kms_encryption_context,omitempty"` + SseKmsKeyId string `protobuf:"bytes,25,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` + ServerSideEncryption string `protobuf:"bytes,26,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` + StorageClass string `protobuf:"bytes,27,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` + Tagging string `protobuf:"bytes,28,opt,name=tagging,proto3" json:"tagging,omitempty"` + WebsiteRedirectLocation string `protobuf:"bytes,29,opt,name=website_redirect_location,json=websiteRedirectLocation,proto3" json:"website_redirect_location,omitempty"` +} + +func (x *CreateMultipartUploadInput) Reset() { + *x = CreateMultipartUploadInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateMultipartUploadInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateMultipartUploadInput) ProtoMessage() {} + +func (x *CreateMultipartUploadInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[29] + 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 CreateMultipartUploadInput.ProtoReflect.Descriptor instead. +func (*CreateMultipartUploadInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{29} +} + +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 *CreateMultipartUploadInput) GetCacheControl() string { + if x != nil { + return x.CacheControl + } + return "" +} + +func (x *CreateMultipartUploadInput) GetContentDisposition() string { + if x != nil { + return x.ContentDisposition + } + return "" +} + +func (x *CreateMultipartUploadInput) GetContentEncoding() string { + if x != nil { + return x.ContentEncoding + } + return "" +} + +func (x *CreateMultipartUploadInput) GetContentLanguage() string { + if x != nil { + return x.ContentLanguage + } + return "" +} + +func (x *CreateMultipartUploadInput) GetContentType() string { + if x != nil { + return x.ContentType + } + return "" +} + +func (x *CreateMultipartUploadInput) GetExpectedBucketOwner() string { + if x != nil { + return x.ExpectedBucketOwner + } + return "" +} + +func (x *CreateMultipartUploadInput) GetExpires() string { + if x != nil { + return x.Expires + } + return "" +} + +func (x *CreateMultipartUploadInput) GetGrantFullControl() string { + if x != nil { + return x.GrantFullControl + } + return "" +} + +func (x *CreateMultipartUploadInput) GetGrantRead() string { + if x != nil { + return x.GrantRead + } + return "" +} + +func (x *CreateMultipartUploadInput) GetGrantReadAcp() string { + if x != nil { + return x.GrantReadAcp + } + return "" +} + +func (x *CreateMultipartUploadInput) GetGrantWriteAcp() string { + if x != nil { + return x.GrantWriteAcp + } + return "" +} + +func (x *CreateMultipartUploadInput) GetMetaData() map[string]string { + if x != nil { + return x.MetaData + } + return nil +} + +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() string { + if x != nil { + return x.ObjectLockRetainUntilDate + } + return "" +} + +func (x *CreateMultipartUploadInput) GetRequestPayer() string { + if x != nil { + return x.RequestPayer + } + return "" +} + +func (x *CreateMultipartUploadInput) GetSseCustomerAlgorithm() string { + if x != nil { + return x.SseCustomerAlgorithm + } + return "" +} + +func (x *CreateMultipartUploadInput) GetSseCustomerKey() string { + if x != nil { + return x.SseCustomerKey + } + return "" +} + +func (x *CreateMultipartUploadInput) GetSseCustomerKeyMd5() string { + if x != nil { + return x.SseCustomerKeyMd5 + } + return "" +} + +func (x *CreateMultipartUploadInput) GetSseKmsEncryptionContext() string { + if x != nil { + return x.SseKmsEncryptionContext + } + return "" +} + +func (x *CreateMultipartUploadInput) GetSseKmsKeyId() string { + if x != nil { + return x.SseKmsKeyId + } + return "" +} + +func (x *CreateMultipartUploadInput) GetServerSideEncryption() string { + if x != nil { + return x.ServerSideEncryption + } + return "" +} + +func (x *CreateMultipartUploadInput) GetStorageClass() string { + if x != nil { + return x.StorageClass + } + return "" +} + +func (x *CreateMultipartUploadInput) GetTagging() string { + if x != nil { + return x.Tagging + } + return "" +} + +func (x *CreateMultipartUploadInput) GetWebsiteRedirectLocation() string { + if x != nil { + return x.WebsiteRedirectLocation + } + return "" +} + +type CreateMultipartUploadOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + AbortDate *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=abort_date,json=abortDate,proto3" json:"abort_date,omitempty"` + AbortRuleId string `protobuf:"bytes,4,opt,name=abort_rule_id,json=abortRuleId,proto3" json:"abort_rule_id,omitempty"` + BucketKeyEnabled bool `protobuf:"varint,5,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + RequestCharged string `protobuf:"bytes,6,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + SseCustomerAlgorithm string `protobuf:"bytes,7,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SseCustomerKeyMd5 string `protobuf:"bytes,8,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + SseKmsEncryptionContext string `protobuf:"bytes,9,opt,name=sse_kms_encryption_context,json=sseKmsEncryptionContext,proto3" json:"sse_kms_encryption_context,omitempty"` + SseKmsKeyId string `protobuf:"bytes,10,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` + ServerSideEncryption string `protobuf:"bytes,11,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` + UploadId string `protobuf:"bytes,12,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` +} + +func (x *CreateMultipartUploadOutput) Reset() { + *x = CreateMultipartUploadOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateMultipartUploadOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateMultipartUploadOutput) ProtoMessage() {} + +func (x *CreateMultipartUploadOutput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[30] + 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 CreateMultipartUploadOutput.ProtoReflect.Descriptor instead. +func (*CreateMultipartUploadOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{30} +} + +func (x *CreateMultipartUploadOutput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *CreateMultipartUploadOutput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *CreateMultipartUploadOutput) GetAbortDate() *timestamppb.Timestamp { + if x != nil { + return x.AbortDate + } + return nil +} + +func (x *CreateMultipartUploadOutput) GetAbortRuleId() string { + if x != nil { + return x.AbortRuleId + } + return "" +} + +func (x *CreateMultipartUploadOutput) GetBucketKeyEnabled() bool { + if x != nil { + return x.BucketKeyEnabled + } + return false +} + +func (x *CreateMultipartUploadOutput) GetRequestCharged() string { + if x != nil { + return x.RequestCharged + } + return "" +} + +func (x *CreateMultipartUploadOutput) GetSseCustomerAlgorithm() string { + if x != nil { + return x.SseCustomerAlgorithm + } + return "" +} + +func (x *CreateMultipartUploadOutput) GetSseCustomerKeyMd5() string { + if x != nil { + return x.SseCustomerKeyMd5 + } + return "" +} + +func (x *CreateMultipartUploadOutput) GetSseKmsEncryptionContext() string { + if x != nil { + return x.SseKmsEncryptionContext + } + return "" +} + +func (x *CreateMultipartUploadOutput) GetSseKmsKeyId() string { + if x != nil { + return x.SseKmsKeyId + } + return "" +} + +func (x *CreateMultipartUploadOutput) GetServerSideEncryption() string { + if x != nil { + return x.ServerSideEncryption + } + return "" +} + +func (x *CreateMultipartUploadOutput) GetUploadId() string { + if x != nil { + return x.UploadId + } + return "" +} + +type UploadPartInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Body []byte `protobuf:"bytes,3,opt,name=body,proto3" json:"body,omitempty"` + ContentLength int64 `protobuf:"varint,4,opt,name=content_length,json=contentLength,proto3" json:"content_length,omitempty"` + ContentMd5 string `protobuf:"bytes,5,opt,name=content_md5,json=contentMd5,proto3" json:"content_md5,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,6,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + PartNumber int64 `protobuf:"varint,7,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + RequestPayer string `protobuf:"bytes,8,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + SseCustomerAlgorithm string `protobuf:"bytes,9,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SseCustomerKey string `protobuf:"bytes,10,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` + SseCustomerKeyMd5 string `protobuf:"bytes,11,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + UploadId string `protobuf:"bytes,12,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` +} + +func (x *UploadPartInput) Reset() { + *x = UploadPartInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UploadPartInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UploadPartInput) ProtoMessage() {} + +func (x *UploadPartInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[31] + 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 UploadPartInput.ProtoReflect.Descriptor instead. +func (*UploadPartInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{31} +} + +func (x *UploadPartInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *UploadPartInput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *UploadPartInput) GetBody() []byte { + if x != nil { + 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 *UploadPartInput) GetExpectedBucketOwner() string { + if x != nil { + return x.ExpectedBucketOwner + } + return "" +} + +func (x *UploadPartInput) GetPartNumber() int64 { + if x != nil { + return x.PartNumber + } + return 0 +} + +func (x *UploadPartInput) GetRequestPayer() string { + if x != nil { + return x.RequestPayer + } + return "" +} + +func (x *UploadPartInput) GetSseCustomerAlgorithm() string { + if x != nil { + return x.SseCustomerAlgorithm + } + return "" +} + +func (x *UploadPartInput) GetSseCustomerKey() string { + if x != nil { + return x.SseCustomerKey + } + return "" +} + +func (x *UploadPartInput) GetSseCustomerKeyMd5() string { + if x != nil { + return x.SseCustomerKeyMd5 + } + return "" +} + +func (x *UploadPartInput) GetUploadId() string { + if x != nil { + return x.UploadId + } + return "" +} + +type UploadPartOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BucketKeyEnabled bool `protobuf:"varint,1,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + Etag string `protobuf:"bytes,2,opt,name=etag,proto3" json:"etag,omitempty"` + RequestCharged string `protobuf:"bytes,3,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + SseCustomerAlgorithm string `protobuf:"bytes,4,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SseCustomerKeyMd5 string `protobuf:"bytes,5,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + SseKmsKeyId string `protobuf:"bytes,6,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` + ServerSideEncryption string `protobuf:"bytes,7,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` +} + +func (x *UploadPartOutput) Reset() { + *x = UploadPartOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UploadPartOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UploadPartOutput) ProtoMessage() {} + +func (x *UploadPartOutput) ProtoReflect() protoreflect.Message { + mi := &file_s3_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 UploadPartOutput.ProtoReflect.Descriptor instead. +func (*UploadPartOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{32} +} + +func (x *UploadPartOutput) GetBucketKeyEnabled() bool { + if x != nil { + return x.BucketKeyEnabled + } + return false +} + +func (x *UploadPartOutput) GetEtag() string { + if x != nil { + return x.Etag + } + return "" +} + +func (x *UploadPartOutput) GetRequestCharged() string { + if x != nil { + return x.RequestCharged + } + return "" +} + +func (x *UploadPartOutput) GetSseCustomerAlgorithm() string { + if x != nil { + return x.SseCustomerAlgorithm + } + return "" +} + +func (x *UploadPartOutput) GetSseCustomerKeyMd5() string { + if x != nil { + return x.SseCustomerKeyMd5 + } + return "" +} + +func (x *UploadPartOutput) GetSseKmsKeyId() string { + if x != nil { + return x.SseKmsKeyId + } + return "" +} + +func (x *UploadPartOutput) GetServerSideEncryption() string { + if x != nil { + return x.ServerSideEncryption + } + return "" +} + +type UploadPartCopyInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + CopySource string `protobuf:"bytes,3,opt,name=copy_source,json=copySource,proto3" json:"copy_source,omitempty"` + PartNumber int64 `protobuf:"varint,4,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + UploadId string `protobuf:"bytes,5,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` +} + +func (x *UploadPartCopyInput) Reset() { + *x = UploadPartCopyInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UploadPartCopyInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UploadPartCopyInput) ProtoMessage() {} + +func (x *UploadPartCopyInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_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 mi.MessageOf(x) +} + +// Deprecated: Use UploadPartCopyInput.ProtoReflect.Descriptor instead. +func (*UploadPartCopyInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{33} +} + +func (x *UploadPartCopyInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *UploadPartCopyInput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *UploadPartCopyInput) GetCopySource() string { + if x != nil { + return x.CopySource + } + return "" +} + +func (x *UploadPartCopyInput) GetPartNumber() int64 { + if x != nil { + return x.PartNumber + } + return 0 +} + +func (x *UploadPartCopyInput) GetUploadId() string { + if x != nil { + return x.UploadId + } + return "" +} + +type CopyPartResult struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` + LastModified *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` +} + +func (x *CopyPartResult) Reset() { + *x = CopyPartResult{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CopyPartResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CopyPartResult) ProtoMessage() {} + +func (x *CopyPartResult) ProtoReflect() protoreflect.Message { + mi := &file_s3_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 mi.MessageOf(x) +} + +// Deprecated: Use CopyPartResult.ProtoReflect.Descriptor instead. +func (*CopyPartResult) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{34} +} + +func (x *CopyPartResult) GetEtag() string { + if x != nil { + return x.Etag + } + return "" +} + +func (x *CopyPartResult) GetLastModified() *timestamppb.Timestamp { + if x != nil { + return x.LastModified + } + return nil +} + +type UploadPartCopyOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BucketKeyEnabled bool `protobuf:"varint,1,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + CopyPartResult *CopyPartResult `protobuf:"bytes,2,opt,name=copy_part_result,json=copyPartResult,proto3" json:"copy_part_result,omitempty"` + CopySourceVersionId string `protobuf:"bytes,3,opt,name=copy_source_version_id,json=copySourceVersionId,proto3" json:"copy_source_version_id,omitempty"` + RequestCharged string `protobuf:"bytes,4,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + SseCustomerAlgorithm string `protobuf:"bytes,5,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SseCustomerKeyMd5 string `protobuf:"bytes,6,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + SseKmsKeyId string `protobuf:"bytes,7,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` + 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_s3_proto_msgTypes[35] + 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_s3_proto_msgTypes[35] + 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_s3_proto_rawDescGZIP(), []int{35} +} + +func (x *UploadPartCopyOutput) GetBucketKeyEnabled() bool { + if x != nil { + return x.BucketKeyEnabled + } + return false +} + +func (x *UploadPartCopyOutput) GetCopyPartResult() *CopyPartResult { + if x != nil { + return x.CopyPartResult + } + return nil +} + +func (x *UploadPartCopyOutput) GetCopySourceVersionId() string { + if x != nil { + return x.CopySourceVersionId + } + return "" +} + +func (x *UploadPartCopyOutput) GetRequestCharged() string { + if x != nil { + return x.RequestCharged + } + return "" +} + +func (x *UploadPartCopyOutput) GetSseCustomerAlgorithm() string { + if x != nil { + return x.SseCustomerAlgorithm + } + return "" +} + +func (x *UploadPartCopyOutput) GetSseCustomerKeyMd5() string { + if x != nil { + return x.SseCustomerKeyMd5 + } + return "" +} + +func (x *UploadPartCopyOutput) GetSseKmsKeyId() string { + if x != nil { + return x.SseKmsKeyId + } + return "" +} + +func (x *UploadPartCopyOutput) GetServerSideEncryption() string { + if x != nil { + return x.ServerSideEncryption + } + return "" +} + +type CompletedPart struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` + PartNumber int64 `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_s3_proto_msgTypes[36] + 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_s3_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 CompletedPart.ProtoReflect.Descriptor instead. +func (*CompletedPart) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{36} +} + +func (x *CompletedPart) GetEtag() string { + if x != nil { + return x.Etag + } + return "" +} + +func (x *CompletedPart) GetPartNumber() int64 { + if x != nil { + return x.PartNumber + } + return 0 +} + +type CompletedMultipartUpload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Parts []*CompletedPart `protobuf:"bytes,1,rep,name=parts,proto3" json:"parts,omitempty"` +} + +func (x *CompletedMultipartUpload) Reset() { + *x = CompletedMultipartUpload{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CompletedMultipartUpload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CompletedMultipartUpload) ProtoMessage() {} + +func (x *CompletedMultipartUpload) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[37] + 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 CompletedMultipartUpload.ProtoReflect.Descriptor instead. +func (*CompletedMultipartUpload) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{37} +} + +func (x *CompletedMultipartUpload) GetParts() []*CompletedPart { + if x != nil { + return x.Parts + } + return nil +} + +type CompleteMultipartUploadInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + UploadId string `protobuf:"bytes,3,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + RequestPayer string `protobuf:"bytes,4,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + MultipartUpload *CompletedMultipartUpload `protobuf:"bytes,6,opt,name=multipart_upload,json=multipartUpload,proto3" json:"multipart_upload,omitempty"` +} + +func (x *CompleteMultipartUploadInput) Reset() { + *x = CompleteMultipartUploadInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CompleteMultipartUploadInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CompleteMultipartUploadInput) ProtoMessage() {} + +func (x *CompleteMultipartUploadInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_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 CompleteMultipartUploadInput.ProtoReflect.Descriptor instead. +func (*CompleteMultipartUploadInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{38} +} + +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 +} + +type CompleteMultipartUploadOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + BucketKeyEnabled bool `protobuf:"varint,3,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + Etag string `protobuf:"bytes,4,opt,name=etag,proto3" json:"etag,omitempty"` + Expiration string `protobuf:"bytes,5,opt,name=expiration,proto3" json:"expiration,omitempty"` + Location string `protobuf:"bytes,6,opt,name=location,proto3" json:"location,omitempty"` + RequestCharged string `protobuf:"bytes,7,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + SseKmsKeyId string `protobuf:"bytes,8,opt,name=sse_kms_keyId,json=sseKmsKeyId,proto3" json:"sse_kms_keyId,omitempty"` + ServerSideEncryption string `protobuf:"bytes,9,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` + VersionId string `protobuf:"bytes,10,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` +} + +func (x *CompleteMultipartUploadOutput) Reset() { + *x = CompleteMultipartUploadOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CompleteMultipartUploadOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CompleteMultipartUploadOutput) ProtoMessage() {} + +func (x *CompleteMultipartUploadOutput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[39] + 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 CompleteMultipartUploadOutput.ProtoReflect.Descriptor instead. +func (*CompleteMultipartUploadOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{39} +} + +func (x *CompleteMultipartUploadOutput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *CompleteMultipartUploadOutput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *CompleteMultipartUploadOutput) GetBucketKeyEnabled() bool { + if x != nil { + return x.BucketKeyEnabled + } + return false +} + +func (x *CompleteMultipartUploadOutput) GetEtag() string { + if x != nil { + return x.Etag + } + return "" +} + +func (x *CompleteMultipartUploadOutput) GetExpiration() string { + if x != nil { + return x.Expiration + } + return "" +} + +func (x *CompleteMultipartUploadOutput) GetLocation() string { + if x != nil { + return x.Location + } + return "" +} + +func (x *CompleteMultipartUploadOutput) GetRequestCharged() string { + if x != nil { + return x.RequestCharged + } + return "" +} + +func (x *CompleteMultipartUploadOutput) GetSseKmsKeyId() string { + if x != nil { + return x.SseKmsKeyId + } + return "" +} + +func (x *CompleteMultipartUploadOutput) GetServerSideEncryption() string { + if x != nil { + return x.ServerSideEncryption + } + return "" +} + +func (x *CompleteMultipartUploadOutput) GetVersionId() string { + if x != nil { + return x.VersionId + } + return "" +} + +type AbortMultipartUploadInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,3,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + RequestPayer string `protobuf:"bytes,4,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + UploadId string `protobuf:"bytes,5,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` +} + +func (x *AbortMultipartUploadInput) Reset() { + *x = AbortMultipartUploadInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AbortMultipartUploadInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AbortMultipartUploadInput) ProtoMessage() {} + +func (x *AbortMultipartUploadInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[40] + 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 AbortMultipartUploadInput.ProtoReflect.Descriptor instead. +func (*AbortMultipartUploadInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{40} +} + +func (x *AbortMultipartUploadInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *AbortMultipartUploadInput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *AbortMultipartUploadInput) GetExpectedBucketOwner() string { + if x != nil { + return x.ExpectedBucketOwner + } + return "" +} + +func (x *AbortMultipartUploadInput) GetRequestPayer() string { + if x != nil { + return x.RequestPayer + } + return "" +} + +func (x *AbortMultipartUploadInput) GetUploadId() string { + if x != nil { + return x.UploadId + } + return "" +} + +type AbortMultipartUploadOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + 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_s3_proto_msgTypes[41] + 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_s3_proto_msgTypes[41] + 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 AbortMultipartUploadOutput.ProtoReflect.Descriptor instead. +func (*AbortMultipartUploadOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{41} +} + +func (x *AbortMultipartUploadOutput) GetRequestCharged() string { + if x != nil { + return x.RequestCharged + } + return "" +} + +type ListMultipartUploadsInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Delimiter string `protobuf:"bytes,2,opt,name=delimiter,proto3" json:"delimiter,omitempty"` + EncodingType string `protobuf:"bytes,3,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,4,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + KeyMarker string `protobuf:"bytes,5,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` + MaxUploads int64 `protobuf:"varint,6,opt,name=max_uploads,json=maxUploads,proto3" json:"max_uploads,omitempty"` + Prefix string `protobuf:"bytes,7,opt,name=prefix,proto3" json:"prefix,omitempty"` + UploadIdMarker string `protobuf:"bytes,8,opt,name=upload_id_marker,json=uploadIdMarker,proto3" json:"upload_id_marker,omitempty"` +} + +func (x *ListMultipartUploadsInput) Reset() { + *x = ListMultipartUploadsInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListMultipartUploadsInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListMultipartUploadsInput) ProtoMessage() {} + +func (x *ListMultipartUploadsInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[42] + 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 ListMultipartUploadsInput.ProtoReflect.Descriptor instead. +func (*ListMultipartUploadsInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{42} +} + +func (x *ListMultipartUploadsInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *ListMultipartUploadsInput) GetDelimiter() string { + if x != nil { + return x.Delimiter + } + return "" +} + +func (x *ListMultipartUploadsInput) GetEncodingType() string { + if x != nil { + return x.EncodingType + } + return "" +} + +func (x *ListMultipartUploadsInput) GetExpectedBucketOwner() string { + if x != nil { + return x.ExpectedBucketOwner + } + return "" +} + +func (x *ListMultipartUploadsInput) GetKeyMarker() string { + if x != nil { + return x.KeyMarker + } + return "" +} + +func (x *ListMultipartUploadsInput) GetMaxUploads() int64 { + if x != nil { + return x.MaxUploads + } + return 0 +} + +func (x *ListMultipartUploadsInput) GetPrefix() string { + if x != nil { + return x.Prefix + } + return "" +} + +func (x *ListMultipartUploadsInput) GetUploadIdMarker() string { + if x != nil { + return x.UploadIdMarker + } + return "" +} + +type Initiator struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *Initiator) Reset() { + *x = Initiator{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Initiator) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Initiator) ProtoMessage() {} + +func (x *Initiator) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[43] + 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 Initiator.ProtoReflect.Descriptor instead. +func (*Initiator) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{43} +} + +func (x *Initiator) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *Initiator) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type MultipartUpload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Initiated *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=Initiated,proto3" json:"Initiated,omitempty"` + Initiator *Initiator `protobuf:"bytes,2,opt,name=initiator,proto3" json:"initiator,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + Owner *Owner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` + StorageClass string `protobuf:"bytes,5,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` + UploadId string `protobuf:"bytes,6,opt,name=UploadId,proto3" json:"UploadId,omitempty"` +} + +func (x *MultipartUpload) Reset() { + *x = MultipartUpload{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MultipartUpload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MultipartUpload) ProtoMessage() {} + +func (x *MultipartUpload) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[44] + 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 MultipartUpload.ProtoReflect.Descriptor instead. +func (*MultipartUpload) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{44} +} + +func (x *MultipartUpload) GetInitiated() *timestamppb.Timestamp { + if x != nil { + return x.Initiated + } + return nil +} + +func (x *MultipartUpload) GetInitiator() *Initiator { + if x != nil { + return x.Initiator + } + return nil +} + +func (x *MultipartUpload) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *MultipartUpload) GetOwner() *Owner { + if x != nil { + return x.Owner + } + return nil +} + +func (x *MultipartUpload) GetStorageClass() string { + if x != nil { + return x.StorageClass + } + return "" +} + +func (x *MultipartUpload) GetUploadId() string { + if x != nil { + return x.UploadId + } + return "" +} + +type ListMultipartUploadsOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + CommonPrefixes []string `protobuf:"bytes,2,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` + Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` + EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + IsTruncated bool `protobuf:"varint,5,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` + KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` + MaxUploads int64 `protobuf:"varint,7,opt,name=max_uploads,json=maxUploads,proto3" json:"max_uploads,omitempty"` + NextKeyMarker string `protobuf:"bytes,8,opt,name=next_key_marker,json=nextKeyMarker,proto3" json:"next_key_marker,omitempty"` + NextUploadIdMarker string `protobuf:"bytes,9,opt,name=next_upload_id_marker,json=nextUploadIdMarker,proto3" json:"next_upload_id_marker,omitempty"` + Prefix string `protobuf:"bytes,10,opt,name=prefix,proto3" json:"prefix,omitempty"` + UploadIdMarker string `protobuf:"bytes,11,opt,name=upload_id_marker,json=uploadIdMarker,proto3" json:"upload_id_marker,omitempty"` + Uploads *MultipartUpload `protobuf:"bytes,12,opt,name=uploads,proto3" json:"uploads,omitempty"` +} + +func (x *ListMultipartUploadsOutput) Reset() { + *x = ListMultipartUploadsOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListMultipartUploadsOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListMultipartUploadsOutput) ProtoMessage() {} + +func (x *ListMultipartUploadsOutput) ProtoReflect() protoreflect.Message { + mi := &file_s3_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 ListMultipartUploadsOutput.ProtoReflect.Descriptor instead. +func (*ListMultipartUploadsOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{45} +} + +func (x *ListMultipartUploadsOutput) 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 { + if x != nil { + return x.EncodingType + } + return "" +} + +func (x *ListMultipartUploadsOutput) GetIsTruncated() bool { + if x != nil { + return x.IsTruncated + } + return false +} + +func (x *ListMultipartUploadsOutput) GetKeyMarker() string { + if x != nil { + return x.KeyMarker + } + return "" +} + +func (x *ListMultipartUploadsOutput) GetMaxUploads() int64 { + if x != nil { + return x.MaxUploads + } + return 0 +} + +func (x *ListMultipartUploadsOutput) GetNextKeyMarker() string { + if x != nil { + return x.NextKeyMarker + } + return "" +} + +func (x *ListMultipartUploadsOutput) GetNextUploadIdMarker() string { + if x != nil { + return x.NextUploadIdMarker + } + return "" +} + +func (x *ListMultipartUploadsOutput) GetPrefix() string { + if x != nil { + return x.Prefix + } + return "" +} + +func (x *ListMultipartUploadsOutput) GetUploadIdMarker() string { + if x != nil { + return x.UploadIdMarker + } + return "" +} + +func (x *ListMultipartUploadsOutput) GetUploads() *MultipartUpload { + if x != nil { + return x.Uploads + } + return nil +} + +type ListObjectVersionsInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Delimiter string `protobuf:"bytes,2,opt,name=delimiter,proto3" json:"delimiter,omitempty"` + EncodingType string `protobuf:"bytes,3,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,4,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + KeyMarker string `protobuf:"bytes,5,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` + MaxKeys int64 `protobuf:"varint,6,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` + Prefix string `protobuf:"bytes,7,opt,name=prefix,proto3" json:"prefix,omitempty"` + VersionIdMarker string `protobuf:"bytes,8,opt,name=version_id_marker,json=versionIdMarker,proto3" json:"version_id_marker,omitempty"` +} + +func (x *ListObjectVersionsInput) Reset() { + *x = ListObjectVersionsInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListObjectVersionsInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListObjectVersionsInput) ProtoMessage() {} + +func (x *ListObjectVersionsInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[46] + 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 ListObjectVersionsInput.ProtoReflect.Descriptor instead. +func (*ListObjectVersionsInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{46} +} + +func (x *ListObjectVersionsInput) 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 { + if x != nil { + return x.EncodingType + } + return "" +} + +func (x *ListObjectVersionsInput) 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 { + if x != nil { + return x.Prefix + } + return "" +} + +func (x *ListObjectVersionsInput) GetVersionIdMarker() string { + if x != nil { + return x.VersionIdMarker + } + return "" +} + +type DeleteMarkerEntry struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + IsLatest bool `protobuf:"varint,1,opt,name=is_latest,json=isLatest,proto3" json:"is_latest,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + LastModified *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` + Owner *Owner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` + VersionId string `protobuf:"bytes,5,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` +} + +func (x *DeleteMarkerEntry) Reset() { + *x = DeleteMarkerEntry{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteMarkerEntry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteMarkerEntry) ProtoMessage() {} + +func (x *DeleteMarkerEntry) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[47] + 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 DeleteMarkerEntry.ProtoReflect.Descriptor instead. +func (*DeleteMarkerEntry) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{47} +} + +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() *timestamppb.Timestamp { + if x != nil { + return x.LastModified + } + return nil +} + +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 "" +} + +type ObjectVersion struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` + IsLatest bool `protobuf:"varint,2,opt,name=is_latest,json=isLatest,proto3" json:"is_latest,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + LastModified *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` + Owner *Owner `protobuf:"bytes,5,opt,name=owner,proto3" json:"owner,omitempty"` + Size int64 `protobuf:"varint,6,opt,name=size,proto3" json:"size,omitempty"` + StorageClass string `protobuf:"bytes,7,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` + VersionId string `protobuf:"bytes,8,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` +} + +func (x *ObjectVersion) Reset() { + *x = ObjectVersion{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ObjectVersion) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ObjectVersion) ProtoMessage() {} + +func (x *ObjectVersion) ProtoReflect() protoreflect.Message { + mi := &file_s3_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 mi.MessageOf(x) +} + +// Deprecated: Use ObjectVersion.ProtoReflect.Descriptor instead. +func (*ObjectVersion) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{48} +} + +func (x *ObjectVersion) GetEtag() string { + if x != nil { + return x.Etag + } + return "" +} + +func (x *ObjectVersion) GetIsLatest() bool { + if x != nil { + return x.IsLatest + } + return false +} + +func (x *ObjectVersion) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *ObjectVersion) GetLastModified() *timestamppb.Timestamp { + if x != nil { + return x.LastModified + } + return nil +} + +func (x *ObjectVersion) GetOwner() *Owner { + if x != nil { + return x.Owner + } + return nil +} + +func (x *ObjectVersion) GetSize() int64 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *ObjectVersion) GetStorageClass() string { + if x != nil { + return x.StorageClass + } + return "" +} + +func (x *ObjectVersion) GetVersionId() string { + if x != nil { + return x.VersionId + } + return "" +} + +type ListObjectVersionsOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CommonPrefixes []string `protobuf:"bytes,1,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` + DeleteMarkers []*DeleteMarkerEntry `protobuf:"bytes,2,rep,name=delete_markers,json=deleteMarkers,proto3" json:"delete_markers,omitempty"` + Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` + EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + IsTruncated bool `protobuf:"varint,5,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` + KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` + MaxKeys int64 `protobuf:"varint,7,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` + Name string `protobuf:"bytes,8,opt,name=name,proto3" json:"name,omitempty"` + NextKeyMarker string `protobuf:"bytes,9,opt,name=next_key_marker,json=nextKeyMarker,proto3" json:"next_key_marker,omitempty"` + NextVersionIdMarker string `protobuf:"bytes,10,opt,name=next_version_id_marker,json=nextVersionIdMarker,proto3" json:"next_version_id_marker,omitempty"` + Prefix string `protobuf:"bytes,11,opt,name=prefix,proto3" json:"prefix,omitempty"` + VersionIdMarker string `protobuf:"bytes,12,opt,name=version_id_marker,json=versionIdMarker,proto3" json:"version_id_marker,omitempty"` + Versions []*ObjectVersion `protobuf:"bytes,13,rep,name=versions,proto3" json:"versions,omitempty"` +} + +func (x *ListObjectVersionsOutput) Reset() { + *x = ListObjectVersionsOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListObjectVersionsOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListObjectVersionsOutput) ProtoMessage() {} + +func (x *ListObjectVersionsOutput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[49] + 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 ListObjectVersionsOutput.ProtoReflect.Descriptor instead. +func (*ListObjectVersionsOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{49} +} + +func (x *ListObjectVersionsOutput) GetCommonPrefixes() []string { + if x != nil { + return x.CommonPrefixes + } + return nil +} + +func (x *ListObjectVersionsOutput) GetDeleteMarkers() []*DeleteMarkerEntry { + if x != nil { + return x.DeleteMarkers + } + return nil +} + +func (x *ListObjectVersionsOutput) GetDelimiter() string { + if x != nil { + return x.Delimiter + } + return "" +} + +func (x *ListObjectVersionsOutput) GetEncodingType() string { + if x != nil { + return x.EncodingType + } + return "" +} + +func (x *ListObjectVersionsOutput) GetIsTruncated() bool { + if x != nil { + return x.IsTruncated + } + return false +} + +func (x *ListObjectVersionsOutput) GetKeyMarker() string { + if x != nil { + return x.KeyMarker + } + return "" +} + +func (x *ListObjectVersionsOutput) GetMaxKeys() int64 { + if x != nil { + return x.MaxKeys + } + return 0 +} + +func (x *ListObjectVersionsOutput) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ListObjectVersionsOutput) GetNextKeyMarker() string { + if x != nil { + return x.NextKeyMarker + } + return "" +} + +func (x *ListObjectVersionsOutput) GetNextVersionIdMarker() string { + if x != nil { + return x.NextVersionIdMarker + } + return "" +} + +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 +} + +var File_s3_proto protoreflect.FileDescriptor + +var file_s3_proto_rawDesc = []byte{ + 0x0a, 0x08, 0x73, 0x33, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x6d, 0x6f, 0x73, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 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, 0x1a, 0x1f, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, + 0xb7, 0x01, 0x0a, 0x0b, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x4c, + 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 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, 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, 0x83, 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, 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, 0x03, 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, 0x04, 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, 0x05, 0x20, 0x01, 0x28, 0x09, 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, + 0x06, 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, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x11, 0x69, 0x66, 0x55, 0x6e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x53, 0x69, 0x6e, + 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 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, 0x79, 0x65, 0x72, + 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x14, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x40, 0x0a, 0x1c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x63, + 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, + 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, + 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x13, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 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, 0x12, 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, 0x13, 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, 0x14, 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, 0x15, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, + 0x25, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0xd2, 0x01, 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, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, + 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x16, + 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x05, 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, 0x06, + 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, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x22, 0x53, 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, + 0x22, 0x3d, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x49, 0x6e, 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, 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, 0xb4, 0x01, 0x0a, 0x15, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 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, 0x4a, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, + 0x75, 0x63, 0x6b, 0x65, 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, 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, 0x18, 0x0a, 0x16, 0x50, 0x75, + 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x22, 0x44, 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, 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, 0x22, 0x3a, 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, 0x22, 0x41, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 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, 0x22, 0x9e, 0x01, 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, 0x4b, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 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, 0x5c, 0x0a, 0x0f, 0x43, 0x6f, + 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 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, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, + 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x46, 0x0a, 0x12, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 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, 0x18, 0x0a, 0x07, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x2a, 0x0a, 0x10, 0x4c, + 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 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, 0x22, 0xdd, 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, 0x39, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 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, + 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, 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, 0xdc, 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, 0x3f, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, + 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, + 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x87, 0x01, 0x0a, 0x07, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 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, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, + 0x69, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x22, 0x61, 0x0a, 0x05, + 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x52, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x12, + 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x3d, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, + 0x6e, 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, 0x22, 0xa7, + 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x34, 0x0a, 0x06, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, + 0x61, 0x6e, 0x74, 0x52, 0x06, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x05, 0x6f, + 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 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, 0x4f, 0x0a, 0x11, 0x50, 0x75, 0x74, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, 0x6e, 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, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x22, 0x3d, 0x0a, 0x12, 0x50, 0x75, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x3e, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 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, 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, 0xd0, 0x0a, 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, 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, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x03, 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, 0x04, 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, 0x05, 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, 0x06, 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, 0x07, 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, 0x08, 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, 0x09, 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, 0x0a, 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, + 0x0b, 0x20, 0x01, 0x28, 0x09, 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, 0x0c, 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, 0x0d, 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, 0x0e, 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, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x67, 0x72, 0x61, 0x6e, + 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x63, 0x70, 0x12, 0x5c, 0x0a, 0x09, 0x6d, 0x65, 0x74, + 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x6d, + 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 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, 0x11, 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, 0x12, 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, 0x13, 0x20, 0x01, 0x28, 0x09, 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, 0x14, 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, 0x15, 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, 0x16, 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, 0x17, 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, 0x18, 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, 0x19, 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, 0x1a, 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, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, + 0x69, 0x6e, 0x67, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 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, + 0x1d, 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, 0x99, 0x04, 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, 0x39, 0x0a, 0x0a, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x5f, 0x64, + 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 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, 0xbf, 0x03, 0x0a, 0x0f, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x49, 0x6e, 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, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 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, 0x04, 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, + 0x05, 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, 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, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 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, 0x08, 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, 0x09, 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, 0x0a, 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, 0x0b, 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, 0x0c, 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, 0x9e, 0x01, 0x0a, 0x13, + 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x49, 0x6e, + 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, 0x1f, 0x0a, + 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 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, 0x04, 0x20, + 0x01, 0x28, 0x03, 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, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x22, 0x65, 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, 0x3f, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x22, 0xb5, 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, 0x4f, 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, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x22, 0x56, 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, 0x3a, 0x0a, + 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, + 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, + 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x22, 0x9a, 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, 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, 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, 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, 0x5a, 0x0a, 0x10, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xbb, 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, 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, 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, 0x03, 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, + 0x04, 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, 0x05, 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, 0xac, 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, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, + 0x01, 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, 0x02, 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, 0x03, 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, 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, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x72, 0x18, 0x05, 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, 0x06, 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, 0x07, + 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, 0x08, 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, 0x92, 0x02, 0x0a, 0x0f, 0x4d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x49, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x49, 0x6e, 0x69, 0x74, 0x69, + 0x61, 0x74, 0x65, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, + 0x1a, 0x0a, 0x08, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x22, 0xe2, 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, 0x03, 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, 0x40, + 0x0a, 0x07, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xa6, 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, 0x16, 0x0a, 0x06, + 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 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, 0x02, 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, 0x03, 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, 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, 0x1d, 0x0a, 0x0a, 0x6b, + 0x65, 0x79, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x05, 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, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x61, + 0x78, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, + 0x07, 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, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x22, 0xd6, 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, 0x3f, + 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, + 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x9f, 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, 0x3f, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xab, 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, 0x4f, 0x0a, 0x0e, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 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, 0x40, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x32, 0x93, 0x11, 0x0a, 0x02, 0x53, 0x33, 0x12, 0x4a, 0x0a, 0x0a, 0x49, 0x6e, 0x69, + 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x5e, 0x0a, 0x09, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, + 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x10, + 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, + 0x12, 0x2c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, + 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, + 0x7a, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, + 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x71, 0x0a, 0x10, 0x47, + 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, + 0x2c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, + 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x5f, + 0x0a, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x26, 0x2e, 0x6d, + 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, + 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, + 0x68, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x12, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, + 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x0b, 0x4c, 0x69, 0x73, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x1a, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x65, 0x0a, + 0x0c, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x12, 0x28, 0x2e, + 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, + 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x41, 0x63, 0x6c, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, + 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0d, 0x52, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x29, 0x2e, 0x6d, + 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x80, 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, + 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x32, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x61, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, + 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, + 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6b, 0x0a, 0x0e, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x2e, + 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, + 0x43, 0x6f, 0x70, 0x79, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2b, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x86, 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, 0x33, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x34, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 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, 0x7d, 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, + 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 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, 0x31, 0x2e, 0x6d, 0x6f, + 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 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, 0x7d, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, + 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 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, + 0x77, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_s3_proto_rawDescOnce sync.Once + file_s3_proto_rawDescData = file_s3_proto_rawDesc +) + +func file_s3_proto_rawDescGZIP() []byte { + file_s3_proto_rawDescOnce.Do(func() { + file_s3_proto_rawDescData = protoimpl.X.CompressGZIP(file_s3_proto_rawDescData) + }) + return file_s3_proto_rawDescData +} + +var file_s3_proto_msgTypes = make([]protoimpl.MessageInfo, 54) +var file_s3_proto_goTypes = []interface{}{ + (*InitRequest)(nil), // 0: mosn.proto.runtime.v1.InitRequest + (*GetObjectInput)(nil), // 1: mosn.proto.runtime.v1.GetObjectInput + (*GetObjectOutput)(nil), // 2: mosn.proto.runtime.v1.GetObjectOutput + (*PutObjectInput)(nil), // 3: mosn.proto.runtime.v1.PutObjectInput + (*PutObjectOutput)(nil), // 4: mosn.proto.runtime.v1.PutObjectOutput + (*DeleteObjectInput)(nil), // 5: mosn.proto.runtime.v1.DeleteObjectInput + (*DeleteObjectOutput)(nil), // 6: mosn.proto.runtime.v1.DeleteObjectOutput + (*PutBucketTaggingInput)(nil), // 7: mosn.proto.runtime.v1.PutBucketTaggingInput + (*PutBucketTaggingOutput)(nil), // 8: mosn.proto.runtime.v1.PutBucketTaggingOutput + (*DeleteObjectTaggingInput)(nil), // 9: mosn.proto.runtime.v1.DeleteObjectTaggingInput + (*DeleteObjectTaggingOutput)(nil), // 10: mosn.proto.runtime.v1.DeleteObjectTaggingOutput + (*GetObjectTaggingInput)(nil), // 11: mosn.proto.runtime.v1.GetObjectTaggingInput + (*GetObjectTaggingOutput)(nil), // 12: mosn.proto.runtime.v1.GetObjectTaggingOutput + (*CopyObjectInput)(nil), // 13: mosn.proto.runtime.v1.CopyObjectInput + (*CopyObjectOutput)(nil), // 14: mosn.proto.runtime.v1.CopyObjectOutput + (*DeleteObjectsInput)(nil), // 15: mosn.proto.runtime.v1.DeleteObjectsInput + (*DeleteObjectsOutput)(nil), // 16: mosn.proto.runtime.v1.DeleteObjectsOutput + (*ListObjectsInput)(nil), // 17: mosn.proto.runtime.v1.ListObjectsInput + (*ListObjectsOutput)(nil), // 18: mosn.proto.runtime.v1.ListObjectsOutput + (*Owner)(nil), // 19: mosn.proto.runtime.v1.Owner + (*Object)(nil), // 20: mosn.proto.runtime.v1.Object + (*Grantee)(nil), // 21: mosn.proto.runtime.v1.Grantee + (*Grant)(nil), // 22: mosn.proto.runtime.v1.Grant + (*GetObjectAclInput)(nil), // 23: mosn.proto.runtime.v1.GetObjectAclInput + (*GetObjectAclOutput)(nil), // 24: mosn.proto.runtime.v1.GetObjectAclOutput + (*PutObjectAclInput)(nil), // 25: mosn.proto.runtime.v1.PutObjectAclInput + (*PutObjectAclOutput)(nil), // 26: mosn.proto.runtime.v1.PutObjectAclOutput + (*RestoreObjectInput)(nil), // 27: mosn.proto.runtime.v1.RestoreObjectInput + (*RestoreObjectOutput)(nil), // 28: mosn.proto.runtime.v1.RestoreObjectOutput + (*CreateMultipartUploadInput)(nil), // 29: mosn.proto.runtime.v1.CreateMultipartUploadInput + (*CreateMultipartUploadOutput)(nil), // 30: mosn.proto.runtime.v1.CreateMultipartUploadOutput + (*UploadPartInput)(nil), // 31: mosn.proto.runtime.v1.UploadPartInput + (*UploadPartOutput)(nil), // 32: mosn.proto.runtime.v1.UploadPartOutput + (*UploadPartCopyInput)(nil), // 33: mosn.proto.runtime.v1.UploadPartCopyInput + (*CopyPartResult)(nil), // 34: mosn.proto.runtime.v1.CopyPartResult + (*UploadPartCopyOutput)(nil), // 35: mosn.proto.runtime.v1.UploadPartCopyOutput + (*CompletedPart)(nil), // 36: mosn.proto.runtime.v1.CompletedPart + (*CompletedMultipartUpload)(nil), // 37: mosn.proto.runtime.v1.CompletedMultipartUpload + (*CompleteMultipartUploadInput)(nil), // 38: mosn.proto.runtime.v1.CompleteMultipartUploadInput + (*CompleteMultipartUploadOutput)(nil), // 39: mosn.proto.runtime.v1.CompleteMultipartUploadOutput + (*AbortMultipartUploadInput)(nil), // 40: mosn.proto.runtime.v1.AbortMultipartUploadInput + (*AbortMultipartUploadOutput)(nil), // 41: mosn.proto.runtime.v1.AbortMultipartUploadOutput + (*ListMultipartUploadsInput)(nil), // 42: mosn.proto.runtime.v1.ListMultipartUploadsInput + (*Initiator)(nil), // 43: mosn.proto.runtime.v1.Initiator + (*MultipartUpload)(nil), // 44: mosn.proto.runtime.v1.MultipartUpload + (*ListMultipartUploadsOutput)(nil), // 45: mosn.proto.runtime.v1.ListMultipartUploadsOutput + (*ListObjectVersionsInput)(nil), // 46: mosn.proto.runtime.v1.ListObjectVersionsInput + (*DeleteMarkerEntry)(nil), // 47: mosn.proto.runtime.v1.DeleteMarkerEntry + (*ObjectVersion)(nil), // 48: mosn.proto.runtime.v1.ObjectVersion + (*ListObjectVersionsOutput)(nil), // 49: mosn.proto.runtime.v1.ListObjectVersionsOutput + nil, // 50: mosn.proto.runtime.v1.InitRequest.MetadataEntry + nil, // 51: mosn.proto.runtime.v1.PutBucketTaggingInput.TagsEntry + nil, // 52: mosn.proto.runtime.v1.GetObjectTaggingOutput.TagsEntry + nil, // 53: mosn.proto.runtime.v1.CreateMultipartUploadInput.MetaDataEntry + (*timestamppb.Timestamp)(nil), // 54: google.protobuf.Timestamp + (*emptypb.Empty)(nil), // 55: google.protobuf.Empty +} +var file_s3_proto_depIdxs = []int32{ + 50, // 0: mosn.proto.runtime.v1.InitRequest.metadata:type_name -> mosn.proto.runtime.v1.InitRequest.MetadataEntry + 51, // 1: mosn.proto.runtime.v1.PutBucketTaggingInput.tags:type_name -> mosn.proto.runtime.v1.PutBucketTaggingInput.TagsEntry + 52, // 2: mosn.proto.runtime.v1.GetObjectTaggingOutput.tags:type_name -> mosn.proto.runtime.v1.GetObjectTaggingOutput.TagsEntry + 20, // 3: mosn.proto.runtime.v1.ListObjectsOutput.contents:type_name -> mosn.proto.runtime.v1.Object + 54, // 4: mosn.proto.runtime.v1.Object.last_modified:type_name -> google.protobuf.Timestamp + 19, // 5: mosn.proto.runtime.v1.Object.owner:type_name -> mosn.proto.runtime.v1.Owner + 21, // 6: mosn.proto.runtime.v1.Grant.grantee:type_name -> mosn.proto.runtime.v1.Grantee + 22, // 7: mosn.proto.runtime.v1.GetObjectAclOutput.grants:type_name -> mosn.proto.runtime.v1.Grant + 19, // 8: mosn.proto.runtime.v1.GetObjectAclOutput.owner:type_name -> mosn.proto.runtime.v1.Owner + 53, // 9: mosn.proto.runtime.v1.CreateMultipartUploadInput.meta_data:type_name -> mosn.proto.runtime.v1.CreateMultipartUploadInput.MetaDataEntry + 54, // 10: mosn.proto.runtime.v1.CreateMultipartUploadOutput.abort_date:type_name -> google.protobuf.Timestamp + 54, // 11: mosn.proto.runtime.v1.CopyPartResult.last_modified:type_name -> google.protobuf.Timestamp + 34, // 12: mosn.proto.runtime.v1.UploadPartCopyOutput.copy_part_result:type_name -> mosn.proto.runtime.v1.CopyPartResult + 36, // 13: mosn.proto.runtime.v1.CompletedMultipartUpload.parts:type_name -> mosn.proto.runtime.v1.CompletedPart + 37, // 14: mosn.proto.runtime.v1.CompleteMultipartUploadInput.multipart_upload:type_name -> mosn.proto.runtime.v1.CompletedMultipartUpload + 54, // 15: mosn.proto.runtime.v1.MultipartUpload.Initiated:type_name -> google.protobuf.Timestamp + 43, // 16: mosn.proto.runtime.v1.MultipartUpload.initiator:type_name -> mosn.proto.runtime.v1.Initiator + 19, // 17: mosn.proto.runtime.v1.MultipartUpload.owner:type_name -> mosn.proto.runtime.v1.Owner + 44, // 18: mosn.proto.runtime.v1.ListMultipartUploadsOutput.uploads:type_name -> mosn.proto.runtime.v1.MultipartUpload + 54, // 19: mosn.proto.runtime.v1.DeleteMarkerEntry.last_modified:type_name -> google.protobuf.Timestamp + 19, // 20: mosn.proto.runtime.v1.DeleteMarkerEntry.owner:type_name -> mosn.proto.runtime.v1.Owner + 54, // 21: mosn.proto.runtime.v1.ObjectVersion.last_modified:type_name -> google.protobuf.Timestamp + 19, // 22: mosn.proto.runtime.v1.ObjectVersion.owner:type_name -> mosn.proto.runtime.v1.Owner + 47, // 23: mosn.proto.runtime.v1.ListObjectVersionsOutput.delete_markers:type_name -> mosn.proto.runtime.v1.DeleteMarkerEntry + 48, // 24: mosn.proto.runtime.v1.ListObjectVersionsOutput.versions:type_name -> mosn.proto.runtime.v1.ObjectVersion + 0, // 25: mosn.proto.runtime.v1.S3.InitClient:input_type -> mosn.proto.runtime.v1.InitRequest + 3, // 26: mosn.proto.runtime.v1.S3.PutObject:input_type -> mosn.proto.runtime.v1.PutObjectInput + 1, // 27: mosn.proto.runtime.v1.S3.GetObject:input_type -> mosn.proto.runtime.v1.GetObjectInput + 5, // 28: mosn.proto.runtime.v1.S3.DeleteObject:input_type -> mosn.proto.runtime.v1.DeleteObjectInput + 7, // 29: mosn.proto.runtime.v1.S3.PutObjectTagging:input_type -> mosn.proto.runtime.v1.PutBucketTaggingInput + 9, // 30: mosn.proto.runtime.v1.S3.DeleteObjectTagging:input_type -> mosn.proto.runtime.v1.DeleteObjectTaggingInput + 11, // 31: mosn.proto.runtime.v1.S3.GetObjectTagging:input_type -> mosn.proto.runtime.v1.GetObjectTaggingInput + 13, // 32: mosn.proto.runtime.v1.S3.CopyObject:input_type -> mosn.proto.runtime.v1.CopyObjectInput + 15, // 33: mosn.proto.runtime.v1.S3.DeleteObjects:input_type -> mosn.proto.runtime.v1.DeleteObjectsInput + 17, // 34: mosn.proto.runtime.v1.S3.ListObjects:input_type -> mosn.proto.runtime.v1.ListObjectsInput + 23, // 35: mosn.proto.runtime.v1.S3.GetObjectAcl:input_type -> mosn.proto.runtime.v1.GetObjectAclInput + 25, // 36: mosn.proto.runtime.v1.S3.PutObjectAcl:input_type -> mosn.proto.runtime.v1.PutObjectAclInput + 27, // 37: mosn.proto.runtime.v1.S3.RestoreObject:input_type -> mosn.proto.runtime.v1.RestoreObjectInput + 29, // 38: mosn.proto.runtime.v1.S3.CreateMultipartUpload:input_type -> mosn.proto.runtime.v1.CreateMultipartUploadInput + 31, // 39: mosn.proto.runtime.v1.S3.UploadPart:input_type -> mosn.proto.runtime.v1.UploadPartInput + 33, // 40: mosn.proto.runtime.v1.S3.UploadPartCopy:input_type -> mosn.proto.runtime.v1.UploadPartCopyInput + 38, // 41: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:input_type -> mosn.proto.runtime.v1.CompleteMultipartUploadInput + 40, // 42: mosn.proto.runtime.v1.S3.AbortMultipartUpload:input_type -> mosn.proto.runtime.v1.AbortMultipartUploadInput + 42, // 43: mosn.proto.runtime.v1.S3.ListMultipartUploads:input_type -> mosn.proto.runtime.v1.ListMultipartUploadsInput + 46, // 44: mosn.proto.runtime.v1.S3.ListObjectVersions:input_type -> mosn.proto.runtime.v1.ListObjectVersionsInput + 55, // 45: mosn.proto.runtime.v1.S3.InitClient:output_type -> google.protobuf.Empty + 4, // 46: mosn.proto.runtime.v1.S3.PutObject:output_type -> mosn.proto.runtime.v1.PutObjectOutput + 2, // 47: mosn.proto.runtime.v1.S3.GetObject:output_type -> mosn.proto.runtime.v1.GetObjectOutput + 6, // 48: mosn.proto.runtime.v1.S3.DeleteObject:output_type -> mosn.proto.runtime.v1.DeleteObjectOutput + 8, // 49: mosn.proto.runtime.v1.S3.PutObjectTagging:output_type -> mosn.proto.runtime.v1.PutBucketTaggingOutput + 10, // 50: mosn.proto.runtime.v1.S3.DeleteObjectTagging:output_type -> mosn.proto.runtime.v1.DeleteObjectTaggingOutput + 12, // 51: mosn.proto.runtime.v1.S3.GetObjectTagging:output_type -> mosn.proto.runtime.v1.GetObjectTaggingOutput + 14, // 52: mosn.proto.runtime.v1.S3.CopyObject:output_type -> mosn.proto.runtime.v1.CopyObjectOutput + 16, // 53: mosn.proto.runtime.v1.S3.DeleteObjects:output_type -> mosn.proto.runtime.v1.DeleteObjectsOutput + 18, // 54: mosn.proto.runtime.v1.S3.ListObjects:output_type -> mosn.proto.runtime.v1.ListObjectsOutput + 24, // 55: mosn.proto.runtime.v1.S3.GetObjectAcl:output_type -> mosn.proto.runtime.v1.GetObjectAclOutput + 26, // 56: mosn.proto.runtime.v1.S3.PutObjectAcl:output_type -> mosn.proto.runtime.v1.PutObjectAclOutput + 28, // 57: mosn.proto.runtime.v1.S3.RestoreObject:output_type -> mosn.proto.runtime.v1.RestoreObjectOutput + 30, // 58: mosn.proto.runtime.v1.S3.CreateMultipartUpload:output_type -> mosn.proto.runtime.v1.CreateMultipartUploadOutput + 32, // 59: mosn.proto.runtime.v1.S3.UploadPart:output_type -> mosn.proto.runtime.v1.UploadPartOutput + 35, // 60: mosn.proto.runtime.v1.S3.UploadPartCopy:output_type -> mosn.proto.runtime.v1.UploadPartCopyOutput + 39, // 61: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:output_type -> mosn.proto.runtime.v1.CompleteMultipartUploadOutput + 41, // 62: mosn.proto.runtime.v1.S3.AbortMultipartUpload:output_type -> mosn.proto.runtime.v1.AbortMultipartUploadOutput + 45, // 63: mosn.proto.runtime.v1.S3.ListMultipartUploads:output_type -> mosn.proto.runtime.v1.ListMultipartUploadsOutput + 49, // 64: mosn.proto.runtime.v1.S3.ListObjectVersions:output_type -> mosn.proto.runtime.v1.ListObjectVersionsOutput + 45, // [45:65] is the sub-list for method output_type + 25, // [25:45] is the sub-list for method input_type + 25, // [25:25] is the sub-list for extension type_name + 25, // [25:25] is the sub-list for extension extendee + 0, // [0:25] is the sub-list for field type_name +} + +func init() { file_s3_proto_init() } +func file_s3_proto_init() { + if File_s3_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_s3_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InitRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetObjectInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetObjectOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PutObjectInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PutObjectOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteObjectInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteObjectOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PutBucketTaggingInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PutBucketTaggingOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteObjectTaggingInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteObjectTaggingOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetObjectTaggingInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetObjectTaggingOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CopyObjectInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CopyObjectOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteObjectsInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteObjectsOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListObjectsInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListObjectsOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Owner); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Object); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Grantee); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Grant); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetObjectAclInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetObjectAclOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PutObjectAclInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PutObjectAclOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RestoreObjectInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RestoreObjectOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateMultipartUploadInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateMultipartUploadOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UploadPartInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UploadPartOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UploadPartCopyInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CopyPartResult); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UploadPartCopyOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CompletedPart); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CompletedMultipartUpload); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CompleteMultipartUploadInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CompleteMultipartUploadOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AbortMultipartUploadInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AbortMultipartUploadOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListMultipartUploadsInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Initiator); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MultipartUpload); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListMultipartUploadsOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListObjectVersionsInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteMarkerEntry); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ObjectVersion); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListObjectVersionsOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_s3_proto_rawDesc, + NumEnums: 0, + NumMessages: 54, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_s3_proto_goTypes, + DependencyIndexes: file_s3_proto_depIdxs, + MessageInfos: file_s3_proto_msgTypes, + }.Build() + File_s3_proto = out.File + file_s3_proto_rawDesc = nil + file_s3_proto_goTypes = nil + file_s3_proto_depIdxs = nil +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConnInterface + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion6 + +// S3Client is the client API for S3 service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type S3Client interface { + InitClient(ctx context.Context, in *InitRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + PutObject(ctx context.Context, opts ...grpc.CallOption) (S3_PutObjectClient, error) + GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (S3_GetObjectClient, error) + DeleteObject(ctx context.Context, in *DeleteObjectInput, opts ...grpc.CallOption) (*DeleteObjectOutput, error) + PutObjectTagging(ctx context.Context, in *PutBucketTaggingInput, opts ...grpc.CallOption) (*PutBucketTaggingOutput, error) + DeleteObjectTagging(ctx context.Context, in *DeleteObjectTaggingInput, opts ...grpc.CallOption) (*DeleteObjectTaggingOutput, error) + GetObjectTagging(ctx context.Context, in *GetObjectTaggingInput, opts ...grpc.CallOption) (*GetObjectTaggingOutput, error) + CopyObject(ctx context.Context, in *CopyObjectInput, opts ...grpc.CallOption) (*CopyObjectOutput, error) + DeleteObjects(ctx context.Context, in *DeleteObjectsInput, opts ...grpc.CallOption) (*DeleteObjectsOutput, error) + ListObjects(ctx context.Context, in *ListObjectsInput, opts ...grpc.CallOption) (*ListObjectsOutput, error) + GetObjectAcl(ctx context.Context, in *GetObjectAclInput, opts ...grpc.CallOption) (*GetObjectAclOutput, error) + PutObjectAcl(ctx context.Context, in *PutObjectAclInput, opts ...grpc.CallOption) (*PutObjectAclOutput, error) + RestoreObject(ctx context.Context, in *RestoreObjectInput, opts ...grpc.CallOption) (*RestoreObjectOutput, error) + CreateMultipartUpload(ctx context.Context, in *CreateMultipartUploadInput, opts ...grpc.CallOption) (*CreateMultipartUploadOutput, error) + UploadPart(ctx context.Context, opts ...grpc.CallOption) (S3_UploadPartClient, error) + UploadPartCopy(ctx context.Context, in *UploadPartCopyInput, opts ...grpc.CallOption) (*UploadPartCopyOutput, error) + CompleteMultipartUpload(ctx context.Context, in *CompleteMultipartUploadInput, opts ...grpc.CallOption) (*CompleteMultipartUploadOutput, error) + AbortMultipartUpload(ctx context.Context, in *AbortMultipartUploadInput, opts ...grpc.CallOption) (*AbortMultipartUploadOutput, error) + ListMultipartUploads(ctx context.Context, in *ListMultipartUploadsInput, opts ...grpc.CallOption) (*ListMultipartUploadsOutput, error) + ListObjectVersions(ctx context.Context, in *ListObjectVersionsInput, opts ...grpc.CallOption) (*ListObjectVersionsOutput, error) +} + +type s3Client struct { + cc grpc.ClientConnInterface +} + +func NewS3Client(cc grpc.ClientConnInterface) S3Client { + return &s3Client{cc} +} + +func (c *s3Client) InitClient(ctx context.Context, in *InitRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/InitClient", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *s3Client) PutObject(ctx context.Context, opts ...grpc.CallOption) (S3_PutObjectClient, error) { + stream, err := c.cc.NewStream(ctx, &_S3_serviceDesc.Streams[0], "/mosn.proto.runtime.v1.S3/PutObject", opts...) + if err != nil { + return nil, err + } + x := &s3PutObjectClient{stream} + return x, nil +} + +type S3_PutObjectClient interface { + Send(*PutObjectInput) error + CloseAndRecv() (*PutObjectOutput, error) + grpc.ClientStream +} + +type s3PutObjectClient struct { + grpc.ClientStream +} + +func (x *s3PutObjectClient) Send(m *PutObjectInput) error { + return x.ClientStream.SendMsg(m) +} + +func (x *s3PutObjectClient) CloseAndRecv() (*PutObjectOutput, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(PutObjectOutput) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *s3Client) GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (S3_GetObjectClient, error) { + stream, err := c.cc.NewStream(ctx, &_S3_serviceDesc.Streams[1], "/mosn.proto.runtime.v1.S3/GetObject", opts...) + if err != nil { + return nil, err + } + x := &s3GetObjectClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type S3_GetObjectClient interface { + Recv() (*GetObjectOutput, error) + grpc.ClientStream +} + +type s3GetObjectClient struct { + grpc.ClientStream +} + +func (x *s3GetObjectClient) Recv() (*GetObjectOutput, error) { + m := new(GetObjectOutput) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *s3Client) DeleteObject(ctx context.Context, in *DeleteObjectInput, opts ...grpc.CallOption) (*DeleteObjectOutput, error) { + out := new(DeleteObjectOutput) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/DeleteObject", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *s3Client) PutObjectTagging(ctx context.Context, in *PutBucketTaggingInput, opts ...grpc.CallOption) (*PutBucketTaggingOutput, error) { + out := new(PutBucketTaggingOutput) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/PutObjectTagging", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *s3Client) DeleteObjectTagging(ctx context.Context, in *DeleteObjectTaggingInput, opts ...grpc.CallOption) (*DeleteObjectTaggingOutput, error) { + out := new(DeleteObjectTaggingOutput) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/DeleteObjectTagging", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *s3Client) GetObjectTagging(ctx context.Context, in *GetObjectTaggingInput, opts ...grpc.CallOption) (*GetObjectTaggingOutput, error) { + out := new(GetObjectTaggingOutput) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/GetObjectTagging", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *s3Client) CopyObject(ctx context.Context, in *CopyObjectInput, opts ...grpc.CallOption) (*CopyObjectOutput, error) { + out := new(CopyObjectOutput) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/CopyObject", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *s3Client) DeleteObjects(ctx context.Context, in *DeleteObjectsInput, opts ...grpc.CallOption) (*DeleteObjectsOutput, error) { + out := new(DeleteObjectsOutput) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/DeleteObjects", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *s3Client) ListObjects(ctx context.Context, in *ListObjectsInput, opts ...grpc.CallOption) (*ListObjectsOutput, error) { + out := new(ListObjectsOutput) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/ListObjects", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *s3Client) GetObjectAcl(ctx context.Context, in *GetObjectAclInput, opts ...grpc.CallOption) (*GetObjectAclOutput, error) { + out := new(GetObjectAclOutput) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/GetObjectAcl", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *s3Client) PutObjectAcl(ctx context.Context, in *PutObjectAclInput, opts ...grpc.CallOption) (*PutObjectAclOutput, error) { + out := new(PutObjectAclOutput) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/PutObjectAcl", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *s3Client) RestoreObject(ctx context.Context, in *RestoreObjectInput, opts ...grpc.CallOption) (*RestoreObjectOutput, error) { + out := new(RestoreObjectOutput) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/RestoreObject", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *s3Client) CreateMultipartUpload(ctx context.Context, in *CreateMultipartUploadInput, opts ...grpc.CallOption) (*CreateMultipartUploadOutput, error) { + out := new(CreateMultipartUploadOutput) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/CreateMultipartUpload", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *s3Client) UploadPart(ctx context.Context, opts ...grpc.CallOption) (S3_UploadPartClient, error) { + stream, err := c.cc.NewStream(ctx, &_S3_serviceDesc.Streams[2], "/mosn.proto.runtime.v1.S3/UploadPart", opts...) + if err != nil { + return nil, err + } + x := &s3UploadPartClient{stream} + return x, nil +} + +type S3_UploadPartClient interface { + Send(*UploadPartInput) error + CloseAndRecv() (*UploadPartOutput, error) + grpc.ClientStream +} + +type s3UploadPartClient struct { + grpc.ClientStream +} + +func (x *s3UploadPartClient) Send(m *UploadPartInput) error { + return x.ClientStream.SendMsg(m) +} + +func (x *s3UploadPartClient) CloseAndRecv() (*UploadPartOutput, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(UploadPartOutput) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *s3Client) UploadPartCopy(ctx context.Context, in *UploadPartCopyInput, opts ...grpc.CallOption) (*UploadPartCopyOutput, error) { + out := new(UploadPartCopyOutput) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/UploadPartCopy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *s3Client) CompleteMultipartUpload(ctx context.Context, in *CompleteMultipartUploadInput, opts ...grpc.CallOption) (*CompleteMultipartUploadOutput, error) { + out := new(CompleteMultipartUploadOutput) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/CompleteMultipartUpload", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *s3Client) AbortMultipartUpload(ctx context.Context, in *AbortMultipartUploadInput, opts ...grpc.CallOption) (*AbortMultipartUploadOutput, error) { + out := new(AbortMultipartUploadOutput) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/AbortMultipartUpload", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *s3Client) ListMultipartUploads(ctx context.Context, in *ListMultipartUploadsInput, opts ...grpc.CallOption) (*ListMultipartUploadsOutput, error) { + out := new(ListMultipartUploadsOutput) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/ListMultipartUploads", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *s3Client) ListObjectVersions(ctx context.Context, in *ListObjectVersionsInput, opts ...grpc.CallOption) (*ListObjectVersionsOutput, error) { + out := new(ListObjectVersionsOutput) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/ListObjectVersions", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// S3Server is the server API for S3 service. +type S3Server interface { + InitClient(context.Context, *InitRequest) (*emptypb.Empty, error) + PutObject(S3_PutObjectServer) error + GetObject(*GetObjectInput, S3_GetObjectServer) error + DeleteObject(context.Context, *DeleteObjectInput) (*DeleteObjectOutput, error) + PutObjectTagging(context.Context, *PutBucketTaggingInput) (*PutBucketTaggingOutput, error) + DeleteObjectTagging(context.Context, *DeleteObjectTaggingInput) (*DeleteObjectTaggingOutput, error) + GetObjectTagging(context.Context, *GetObjectTaggingInput) (*GetObjectTaggingOutput, error) + CopyObject(context.Context, *CopyObjectInput) (*CopyObjectOutput, error) + DeleteObjects(context.Context, *DeleteObjectsInput) (*DeleteObjectsOutput, error) + ListObjects(context.Context, *ListObjectsInput) (*ListObjectsOutput, error) + GetObjectAcl(context.Context, *GetObjectAclInput) (*GetObjectAclOutput, error) + PutObjectAcl(context.Context, *PutObjectAclInput) (*PutObjectAclOutput, error) + RestoreObject(context.Context, *RestoreObjectInput) (*RestoreObjectOutput, error) + CreateMultipartUpload(context.Context, *CreateMultipartUploadInput) (*CreateMultipartUploadOutput, error) + UploadPart(S3_UploadPartServer) error + UploadPartCopy(context.Context, *UploadPartCopyInput) (*UploadPartCopyOutput, error) + CompleteMultipartUpload(context.Context, *CompleteMultipartUploadInput) (*CompleteMultipartUploadOutput, error) + AbortMultipartUpload(context.Context, *AbortMultipartUploadInput) (*AbortMultipartUploadOutput, error) + ListMultipartUploads(context.Context, *ListMultipartUploadsInput) (*ListMultipartUploadsOutput, error) + ListObjectVersions(context.Context, *ListObjectVersionsInput) (*ListObjectVersionsOutput, error) +} + +// UnimplementedS3Server can be embedded to have forward compatible implementations. +type UnimplementedS3Server struct { +} + +func (*UnimplementedS3Server) InitClient(context.Context, *InitRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method InitClient not implemented") +} +func (*UnimplementedS3Server) PutObject(S3_PutObjectServer) error { + return status.Errorf(codes.Unimplemented, "method PutObject not implemented") +} +func (*UnimplementedS3Server) GetObject(*GetObjectInput, S3_GetObjectServer) error { + return status.Errorf(codes.Unimplemented, "method GetObject not implemented") +} +func (*UnimplementedS3Server) DeleteObject(context.Context, *DeleteObjectInput) (*DeleteObjectOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteObject not implemented") +} +func (*UnimplementedS3Server) PutObjectTagging(context.Context, *PutBucketTaggingInput) (*PutBucketTaggingOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method PutObjectTagging not implemented") +} +func (*UnimplementedS3Server) DeleteObjectTagging(context.Context, *DeleteObjectTaggingInput) (*DeleteObjectTaggingOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteObjectTagging not implemented") +} +func (*UnimplementedS3Server) GetObjectTagging(context.Context, *GetObjectTaggingInput) (*GetObjectTaggingOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetObjectTagging not implemented") +} +func (*UnimplementedS3Server) CopyObject(context.Context, *CopyObjectInput) (*CopyObjectOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method CopyObject not implemented") +} +func (*UnimplementedS3Server) DeleteObjects(context.Context, *DeleteObjectsInput) (*DeleteObjectsOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteObjects not implemented") +} +func (*UnimplementedS3Server) ListObjects(context.Context, *ListObjectsInput) (*ListObjectsOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListObjects not implemented") +} +func (*UnimplementedS3Server) GetObjectAcl(context.Context, *GetObjectAclInput) (*GetObjectAclOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetObjectAcl not implemented") +} +func (*UnimplementedS3Server) PutObjectAcl(context.Context, *PutObjectAclInput) (*PutObjectAclOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method PutObjectAcl not implemented") +} +func (*UnimplementedS3Server) RestoreObject(context.Context, *RestoreObjectInput) (*RestoreObjectOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method RestoreObject not implemented") +} +func (*UnimplementedS3Server) CreateMultipartUpload(context.Context, *CreateMultipartUploadInput) (*CreateMultipartUploadOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateMultipartUpload not implemented") +} +func (*UnimplementedS3Server) UploadPart(S3_UploadPartServer) error { + return status.Errorf(codes.Unimplemented, "method UploadPart not implemented") +} +func (*UnimplementedS3Server) UploadPartCopy(context.Context, *UploadPartCopyInput) (*UploadPartCopyOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method UploadPartCopy not implemented") +} +func (*UnimplementedS3Server) CompleteMultipartUpload(context.Context, *CompleteMultipartUploadInput) (*CompleteMultipartUploadOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method CompleteMultipartUpload not implemented") +} +func (*UnimplementedS3Server) AbortMultipartUpload(context.Context, *AbortMultipartUploadInput) (*AbortMultipartUploadOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method AbortMultipartUpload not implemented") +} +func (*UnimplementedS3Server) ListMultipartUploads(context.Context, *ListMultipartUploadsInput) (*ListMultipartUploadsOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListMultipartUploads not implemented") +} +func (*UnimplementedS3Server) ListObjectVersions(context.Context, *ListObjectVersionsInput) (*ListObjectVersionsOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListObjectVersions not implemented") +} + +func RegisterS3Server(s *grpc.Server, srv S3Server) { + s.RegisterService(&_S3_serviceDesc, srv) +} + +func _S3_InitClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(InitRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(S3Server).InitClient(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/InitClient", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).InitClient(ctx, req.(*InitRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _S3_PutObject_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(S3Server).PutObject(&s3PutObjectServer{stream}) +} + +type S3_PutObjectServer interface { + SendAndClose(*PutObjectOutput) error + Recv() (*PutObjectInput, error) + grpc.ServerStream +} + +type s3PutObjectServer struct { + grpc.ServerStream +} + +func (x *s3PutObjectServer) SendAndClose(m *PutObjectOutput) error { + return x.ServerStream.SendMsg(m) +} + +func (x *s3PutObjectServer) Recv() (*PutObjectInput, error) { + m := new(PutObjectInput) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func _S3_GetObject_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(GetObjectInput) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(S3Server).GetObject(m, &s3GetObjectServer{stream}) +} + +type S3_GetObjectServer interface { + Send(*GetObjectOutput) error + grpc.ServerStream +} + +type s3GetObjectServer struct { + grpc.ServerStream +} + +func (x *s3GetObjectServer) Send(m *GetObjectOutput) error { + return x.ServerStream.SendMsg(m) +} + +func _S3_DeleteObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteObjectInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(S3Server).DeleteObject(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/DeleteObject", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).DeleteObject(ctx, req.(*DeleteObjectInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _S3_PutObjectTagging_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PutBucketTaggingInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(S3Server).PutObjectTagging(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/PutObjectTagging", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).PutObjectTagging(ctx, req.(*PutBucketTaggingInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _S3_DeleteObjectTagging_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteObjectTaggingInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(S3Server).DeleteObjectTagging(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/DeleteObjectTagging", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).DeleteObjectTagging(ctx, req.(*DeleteObjectTaggingInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _S3_GetObjectTagging_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetObjectTaggingInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(S3Server).GetObjectTagging(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/GetObjectTagging", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).GetObjectTagging(ctx, req.(*GetObjectTaggingInput)) + } + return interceptor(ctx, in, info, handler) } -func (c *s3Client) InitClient(ctx context.Context, in *InitRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/InitClient", in, out, opts...) - if err != nil { +func _S3_CopyObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CopyObjectInput) + if err := dec(in); err != nil { return nil, err } - return out, nil + if interceptor == nil { + return srv.(S3Server).CopyObject(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/CopyObject", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).CopyObject(ctx, req.(*CopyObjectInput)) + } + return interceptor(ctx, in, info, handler) } -func (c *s3Client) GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (S3_GetObjectClient, error) { - stream, err := c.cc.NewStream(ctx, &_S3_serviceDesc.Streams[0], "/mosn.proto.runtime.v1.S3/GetObject", opts...) - if err != nil { +func _S3_DeleteObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteObjectsInput) + if err := dec(in); err != nil { return nil, err } - x := &s3GetObjectClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err + if interceptor == nil { + return srv.(S3Server).DeleteObjects(ctx, in) } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/DeleteObjects", } - return x, nil -} - -type S3_GetObjectClient interface { - Recv() (*GetObjectOutput, error) - grpc.ClientStream -} - -type s3GetObjectClient struct { - grpc.ClientStream + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).DeleteObjects(ctx, req.(*DeleteObjectsInput)) + } + return interceptor(ctx, in, info, handler) } -func (x *s3GetObjectClient) Recv() (*GetObjectOutput, error) { - m := new(GetObjectOutput) - if err := x.ClientStream.RecvMsg(m); err != nil { +func _S3_ListObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListObjectsInput) + if err := dec(in); err != nil { return nil, err } - return m, nil + if interceptor == nil { + return srv.(S3Server).ListObjects(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/ListObjects", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).ListObjects(ctx, req.(*ListObjectsInput)) + } + return interceptor(ctx, in, info, handler) } -func (c *s3Client) PutObject(ctx context.Context, opts ...grpc.CallOption) (S3_PutObjectClient, error) { - stream, err := c.cc.NewStream(ctx, &_S3_serviceDesc.Streams[1], "/mosn.proto.runtime.v1.S3/PutObject", opts...) - if err != nil { +func _S3_GetObjectAcl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetObjectAclInput) + if err := dec(in); err != nil { return nil, err } - x := &s3PutObjectClient{stream} - return x, nil -} - -type S3_PutObjectClient interface { - Send(*PutObjectInput) error - CloseAndRecv() (*PutObjectOutput, error) - grpc.ClientStream -} - -type s3PutObjectClient struct { - grpc.ClientStream -} - -func (x *s3PutObjectClient) Send(m *PutObjectInput) error { - return x.ClientStream.SendMsg(m) + if interceptor == nil { + return srv.(S3Server).GetObjectAcl(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/GetObjectAcl", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).GetObjectAcl(ctx, req.(*GetObjectAclInput)) + } + return interceptor(ctx, in, info, handler) } -func (x *s3PutObjectClient) CloseAndRecv() (*PutObjectOutput, error) { - if err := x.ClientStream.CloseSend(); err != nil { +func _S3_PutObjectAcl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PutObjectAclInput) + if err := dec(in); err != nil { return nil, err } - m := new(PutObjectOutput) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err + if interceptor == nil { + return srv.(S3Server).PutObjectAcl(ctx, in) } - return m, nil -} - -// S3Server is the server API for S3 service. -type S3Server interface { - InitClient(context.Context, *InitRequest) (*emptypb.Empty, error) - GetObject(*GetObjectInput, S3_GetObjectServer) error - PutObject(S3_PutObjectServer) error -} - -// UnimplementedS3Server can be embedded to have forward compatible implementations. -type UnimplementedS3Server struct { -} - -func (*UnimplementedS3Server) InitClient(context.Context, *InitRequest) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method InitClient not implemented") -} -func (*UnimplementedS3Server) GetObject(*GetObjectInput, S3_GetObjectServer) error { - return status.Errorf(codes.Unimplemented, "method GetObject not implemented") -} -func (*UnimplementedS3Server) PutObject(S3_PutObjectServer) error { - return status.Errorf(codes.Unimplemented, "method PutObject not implemented") + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/PutObjectAcl", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).PutObjectAcl(ctx, req.(*PutObjectAclInput)) + } + return interceptor(ctx, in, info, handler) } -func RegisterS3Server(s *grpc.Server, srv S3Server) { - s.RegisterService(&_S3_serviceDesc, srv) +func _S3_RestoreObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RestoreObjectInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(S3Server).RestoreObject(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/RestoreObject", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).RestoreObject(ctx, req.(*RestoreObjectInput)) + } + return interceptor(ctx, in, info, handler) } -func _S3_InitClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(InitRequest) +func _S3_CreateMultipartUpload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateMultipartUploadInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).InitClient(ctx, in) + return srv.(S3Server).CreateMultipartUpload(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/InitClient", + FullMethod: "/mosn.proto.runtime.v1.S3/CreateMultipartUpload", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).InitClient(ctx, req.(*InitRequest)) + return srv.(S3Server).CreateMultipartUpload(ctx, req.(*CreateMultipartUploadInput)) } return interceptor(ctx, in, info, handler) } -func _S3_GetObject_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(GetObjectInput) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(S3Server).GetObject(m, &s3GetObjectServer{stream}) +func _S3_UploadPart_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(S3Server).UploadPart(&s3UploadPartServer{stream}) } -type S3_GetObjectServer interface { - Send(*GetObjectOutput) error +type S3_UploadPartServer interface { + SendAndClose(*UploadPartOutput) error + Recv() (*UploadPartInput, error) grpc.ServerStream } -type s3GetObjectServer struct { +type s3UploadPartServer struct { grpc.ServerStream } -func (x *s3GetObjectServer) Send(m *GetObjectOutput) error { +func (x *s3UploadPartServer) SendAndClose(m *UploadPartOutput) error { return x.ServerStream.SendMsg(m) } -func _S3_PutObject_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(S3Server).PutObject(&s3PutObjectServer{stream}) +func (x *s3UploadPartServer) Recv() (*UploadPartInput, error) { + m := new(UploadPartInput) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil } -type S3_PutObjectServer interface { - SendAndClose(*PutObjectOutput) error - Recv() (*PutObjectInput, error) - grpc.ServerStream +func _S3_UploadPartCopy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UploadPartCopyInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(S3Server).UploadPartCopy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/UploadPartCopy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).UploadPartCopy(ctx, req.(*UploadPartCopyInput)) + } + return interceptor(ctx, in, info, handler) } -type s3PutObjectServer struct { - grpc.ServerStream +func _S3_CompleteMultipartUpload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CompleteMultipartUploadInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(S3Server).CompleteMultipartUpload(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/CompleteMultipartUpload", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).CompleteMultipartUpload(ctx, req.(*CompleteMultipartUploadInput)) + } + return interceptor(ctx, in, info, handler) } -func (x *s3PutObjectServer) SendAndClose(m *PutObjectOutput) error { - return x.ServerStream.SendMsg(m) +func _S3_AbortMultipartUpload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AbortMultipartUploadInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(S3Server).AbortMultipartUpload(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/AbortMultipartUpload", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).AbortMultipartUpload(ctx, req.(*AbortMultipartUploadInput)) + } + return interceptor(ctx, in, info, handler) } -func (x *s3PutObjectServer) Recv() (*PutObjectInput, error) { - m := new(PutObjectInput) - if err := x.ServerStream.RecvMsg(m); err != nil { +func _S3_ListMultipartUploads_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListMultipartUploadsInput) + if err := dec(in); err != nil { return nil, err } - return m, nil + if interceptor == nil { + return srv.(S3Server).ListMultipartUploads(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/ListMultipartUploads", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).ListMultipartUploads(ctx, req.(*ListMultipartUploadsInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _S3_ListObjectVersions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListObjectVersionsInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(S3Server).ListObjectVersions(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/ListObjectVersions", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).ListObjectVersions(ctx, req.(*ListObjectVersionsInput)) + } + return interceptor(ctx, in, info, handler) } var _S3_serviceDesc = grpc.ServiceDesc{ @@ -933,16 +6369,85 @@ var _S3_serviceDesc = grpc.ServiceDesc{ MethodName: "InitClient", Handler: _S3_InitClient_Handler, }, + { + MethodName: "DeleteObject", + Handler: _S3_DeleteObject_Handler, + }, + { + MethodName: "PutObjectTagging", + Handler: _S3_PutObjectTagging_Handler, + }, + { + MethodName: "DeleteObjectTagging", + Handler: _S3_DeleteObjectTagging_Handler, + }, + { + MethodName: "GetObjectTagging", + Handler: _S3_GetObjectTagging_Handler, + }, + { + MethodName: "CopyObject", + Handler: _S3_CopyObject_Handler, + }, + { + MethodName: "DeleteObjects", + Handler: _S3_DeleteObjects_Handler, + }, + { + MethodName: "ListObjects", + Handler: _S3_ListObjects_Handler, + }, + { + MethodName: "GetObjectAcl", + Handler: _S3_GetObjectAcl_Handler, + }, + { + MethodName: "PutObjectAcl", + Handler: _S3_PutObjectAcl_Handler, + }, + { + MethodName: "RestoreObject", + Handler: _S3_RestoreObject_Handler, + }, + { + MethodName: "CreateMultipartUpload", + Handler: _S3_CreateMultipartUpload_Handler, + }, + { + MethodName: "UploadPartCopy", + Handler: _S3_UploadPartCopy_Handler, + }, + { + MethodName: "CompleteMultipartUpload", + Handler: _S3_CompleteMultipartUpload_Handler, + }, + { + MethodName: "AbortMultipartUpload", + Handler: _S3_AbortMultipartUpload_Handler, + }, + { + MethodName: "ListMultipartUploads", + Handler: _S3_ListMultipartUploads_Handler, + }, + { + MethodName: "ListObjectVersions", + Handler: _S3_ListObjectVersions_Handler, + }, }, Streams: []grpc.StreamDesc{ + { + StreamName: "PutObject", + Handler: _S3_PutObject_Handler, + ClientStreams: true, + }, { StreamName: "GetObject", Handler: _S3_GetObject_Handler, ServerStreams: true, }, { - StreamName: "PutObject", - Handler: _S3_PutObject_Handler, + StreamName: "UploadPart", + Handler: _S3_UploadPart_Handler, ClientStreams: true, }, }, diff --git a/spec/proto/extension/v1/s3.proto b/spec/proto/extension/v1/s3.proto index afe6dec10d..c0d3e9801e 100644 --- a/spec/proto/extension/v1/s3.proto +++ b/spec/proto/extension/v1/s3.proto @@ -3,15 +3,33 @@ syntax = "proto3"; package mosn.proto.runtime.v1; import "google/protobuf/empty.proto"; -import "google/protobuf/any.proto"; +import "google/protobuf/timestamp.proto"; option go_package = "mosn.io/layotto/spec/proto/extension/v1;s3"; service S3 { rpc InitClient(InitRequest) returns (google.protobuf.Empty){} - rpc GetObject(GetObjectInput) returns (stream GetObjectOutput){} rpc PutObject(stream PutObjectInput) returns(PutObjectOutput){} + rpc GetObject(GetObjectInput) returns (stream GetObjectOutput){} + rpc DeleteObject(DeleteObjectInput) returns (DeleteObjectOutput){} + rpc PutObjectTagging(PutBucketTaggingInput) returns (PutBucketTaggingOutput){} + rpc DeleteObjectTagging(DeleteObjectTaggingInput) returns(DeleteObjectTaggingOutput){} + rpc GetObjectTagging(GetObjectTaggingInput) returns(GetObjectTaggingOutput){} + rpc CopyObject(CopyObjectInput) returns(CopyObjectOutput){} + rpc DeleteObjects(DeleteObjectsInput) returns(DeleteObjectsOutput){} + rpc ListObjects(ListObjectsInput) returns(ListObjectsOutput){} + rpc GetObjectAcl(GetObjectAclInput) returns(GetObjectAclOutput){} + rpc PutObjectAcl(PutObjectAclInput) returns(PutObjectAclOutput){} + rpc RestoreObject(RestoreObjectInput) returns(RestoreObjectOutput){} + rpc CreateMultipartUpload(CreateMultipartUploadInput) returns(CreateMultipartUploadOutput){} + rpc UploadPart(stream UploadPartInput) returns(UploadPartOutput){} + rpc UploadPartCopy(UploadPartCopyInput) returns(UploadPartCopyOutput){} + rpc CompleteMultipartUpload(CompleteMultipartUploadInput) returns(CompleteMultipartUploadOutput){} + rpc AbortMultipartUpload(AbortMultipartUploadInput) returns(AbortMultipartUploadOutput){} + rpc ListMultipartUploads(ListMultipartUploadsInput) returns(ListMultipartUploadsOutput){} + rpc ListObjectVersions(ListObjectVersionsInput) returns(ListObjectVersionsOutput){} } + message InitRequest { string store_name = 1; map metadata = 2; @@ -40,8 +58,6 @@ message GetObjectInput { string sse_customer_key_md5 = 20; string version_id = 21; } - - message GetObjectOutput { bytes body = 1; } @@ -55,8 +71,339 @@ message PutObjectInput{ bool bucket_key_enabled = 6; string cache_control = 7; } - message PutObjectOutput{ bool bucket_key_enabled = 1; string etag = 2; +} + +message DeleteObjectInput{ + string bucket = 1; + string key = 2; +} +message DeleteObjectOutput{ + bool delete_marker = 1; + string request_charged = 2; + string version_id = 3; +} + +message PutBucketTaggingInput{ + string bucket = 1; + map tags = 2; +} +message PutBucketTaggingOutput{ + +} + +message DeleteObjectTaggingInput{ + // The bucket name containing the objects from which to remove the tags. + string bucket = 1; + string key = 2; +} +message DeleteObjectTaggingOutput{ + string version_id = 1; +} + +message GetObjectTaggingInput{ + string bucket = 1; + string key = 2; +} +message GetObjectTaggingOutput{ + map tags = 1; +} + +message CopyObjectInput{ + string bucket = 1; + string key = 2; + string copy_source = 3; +} +message CopyObjectOutput{ + +} + +message DeleteObjectsInput{ + // The bucket name containing the objects from which to remove the tags. + string bucket = 1; + repeated string objects = 2; +} +message DeleteObjectsOutput{ + +} + +message ListObjectsInput{ + string bucket = 1; +} +message ListObjectsOutput{ + repeated string common_prefixes = 1; + repeated Object contents = 2; + string delimiter = 3; + string encoding_type = 4; + bool is_truncated = 5; + string marker = 6; + int64 max_keys = 7; + string name = 8; + string next_marker = 9; + string prefix = 10; +} +message Owner{ + string display_name = 1; + string id = 2; +} +message Object{ + string etag = 1; + string key = 2; + google.protobuf.Timestamp last_modified = 3; + Owner owner = 4; + int64 size = 5; + string storage_class = 6; +} + +message Grantee{ + string display_name = 1; + string email_address = 2; + string id = 3; + string type = 4; + string uri = 5; +} +message Grant{ + Grantee grantee = 1; + string permission = 2; +} +message GetObjectAclInput{ + string bucket = 1; + string key = 2; +} +message GetObjectAclOutput{ + repeated Grant grants = 1; + Owner owner = 2; + string request_charged = 3; +} + +message PutObjectAclInput{ + string bucket = 1; + string key = 2; + string acl = 3; +} +message PutObjectAclOutput{ + string request_charged = 1; +} + +message RestoreObjectInput{ + string bucket = 1; + string key = 2; +} +message RestoreObjectOutput{ + string request_charged = 1; + string restore_output_path = 2; +} + +message CreateMultipartUploadInput{ + string bucket = 1; + string key = 2; + string acl = 3; + bool bucket_key_enabled = 4; + string cache_control = 5; + string content_disposition = 6; + string content_encoding = 7; + string content_language = 8; + string content_type = 9; + string expected_bucket_owner = 10; + string expires = 11; + string grant_full_control = 12; + string grant_read = 13; + string grant_read_acp = 14; + string grant_write_acp = 15; + map meta_data = 16; + string object_lock_legal_hold_status = 17; + string object_lock_mode = 18; + string object_lock_retain_until_date = 19; + string request_payer = 20; + string sse_customer_algorithm = 21; + string sse_customer_key = 22; + string sse_customer_key_md5 = 23; + string sse_kms_encryption_context = 24; + string sse_kms_key_id = 25; + string server_side_encryption = 26; + string storage_class = 27; + string tagging = 28; + string website_redirect_location = 29; +} +message CreateMultipartUploadOutput{ + string bucket = 1; + string key = 2; + google.protobuf.Timestamp abort_date = 3; + string abort_rule_id = 4; + bool bucket_key_enabled = 5; + string request_charged = 6; + string sse_customer_algorithm = 7; + string sse_customer_key_md5 = 8; + string sse_kms_encryption_context = 9; + string sse_kms_key_id = 10; + string server_side_encryption = 11; + string upload_id = 12; +} + +message UploadPartInput{ + string bucket = 1; + string key = 2; + bytes body = 3; + int64 content_length = 4; + string content_md5 = 5; + string expected_bucket_owner = 6; + int64 part_number = 7; + string request_payer = 8; + string sse_customer_algorithm = 9; + string sse_customer_key = 10; + string sse_customer_key_md5 = 11; + string upload_id = 12; +} +message UploadPartOutput{ + bool bucket_key_enabled = 1; + string etag = 2; + string request_charged = 3; + string sse_customer_algorithm = 4; + string sse_customer_key_md5 = 5; + string sse_kms_key_id = 6; + string server_side_encryption = 7; +} + +message UploadPartCopyInput{ + string bucket = 1; + string key = 2; + string copy_source = 3; + int64 part_number = 4; + string upload_id = 5; +} + +message CopyPartResult{ + string etag = 1; + google.protobuf.Timestamp last_modified = 2; +} +message UploadPartCopyOutput{ + bool bucket_key_enabled = 1; + CopyPartResult copy_part_result = 2; + string copy_source_version_id = 3; + string request_charged = 4; + string sse_customer_algorithm = 5; + string sse_customer_key_md5 = 6; + string sse_kms_key_id = 7; + string server_side_encryption = 8; +} + +message CompletedPart{ + string etag = 1; + int64 part_number = 2; +} +message CompletedMultipartUpload{ + repeated CompletedPart parts = 1; +} +message CompleteMultipartUploadInput{ + string bucket = 1; + string key = 2; + string upload_id = 3; + string request_payer = 4; + string expected_bucket_owner = 5; + CompletedMultipartUpload multipart_upload = 6; +} +message CompleteMultipartUploadOutput{ + string bucket = 1; + string key = 2; + bool bucket_key_enabled = 3; + string etag = 4; + string expiration = 5; + string location = 6; + string request_charged = 7; + string sse_kms_keyId = 8; + string server_side_encryption = 9; + string version_id = 10; +} + +message AbortMultipartUploadInput{ + string bucket = 1; + string key = 2; + string expected_bucket_owner = 3; + string request_payer = 4; + string upload_id = 5; +} +message AbortMultipartUploadOutput{ + string request_charged = 1; +} + +message ListMultipartUploadsInput{ + string bucket = 1; + string delimiter = 2; + string encoding_type = 3; + string expected_bucket_owner = 4; + string key_marker = 5; + int64 max_uploads = 6; + string prefix = 7; + string upload_id_marker = 8; +} +message Initiator{ + string display_name = 1; + string id = 2; +} +message MultipartUpload{ + google.protobuf.Timestamp Initiated = 1; + Initiator initiator = 2; + string key = 3; + Owner owner = 4; + string storage_class = 5; + string UploadId = 6; +} +message ListMultipartUploadsOutput{ + string bucket = 1; + repeated string common_prefixes = 2; + string delimiter = 3; + string encoding_type = 4; + bool is_truncated = 5; + string key_marker = 6; + int64 max_uploads = 7; + string next_key_marker = 8; + string next_upload_id_marker = 9; + string prefix = 10; + string upload_id_marker = 11; + MultipartUpload uploads = 12; +} + +message ListObjectVersionsInput{ + string bucket = 1; + string delimiter = 2; + string encoding_type = 3; + string expected_bucket_owner = 4; + string key_marker = 5; + int64 max_keys = 6; + string prefix = 7; + string version_id_marker = 8; +} +message DeleteMarkerEntry{ + bool is_latest = 1; + string key = 2; + google.protobuf.Timestamp last_modified = 3; + Owner owner = 4; + string version_id = 5; +} +message ObjectVersion{ + string etag = 1; + bool is_latest = 2; + string key = 3; + google.protobuf.Timestamp last_modified = 4; + Owner owner = 5; + int64 size = 6; + string storage_class = 7; + string version_id = 8; +} +message ListObjectVersionsOutput{ + repeated string common_prefixes = 1; + repeated DeleteMarkerEntry delete_markers = 2; + string delimiter = 3; + string encoding_type = 4; + bool is_truncated = 5; + string key_marker = 6; + int64 max_keys = 7; + string name = 8; + string next_key_marker = 9; + string next_version_id_marker = 10; + string prefix = 11; + string version_id_marker = 12; + repeated ObjectVersion versions = 13; } \ No newline at end of file From 184cb4445d8d090ef5c7bdf47112e6332bf58f74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 25 May 2022 10:52:54 +0800 Subject: [PATCH 008/126] add implement --- components/file/aws/oss.go | 2 +- components/file/s3def.go | 59 ++++++++-------- pkg/grpc/extension/s3/s3.go | 131 ++++++++++++++++++++++++++++++++++-- 3 files changed, 157 insertions(+), 35 deletions(-) diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index 76bec5b9d8..b8555611b1 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -399,6 +399,6 @@ func (a *AwsOss) GetObject(ctx context.Context, req *file.GetObjectInput) (io.Re return ob.Body, nil } -func (a *AwsOss) PutObject(context.Context) error { +func (a *AwsOss) PutObject(context.Context, *file.PutObjectInput) error { return nil } diff --git a/components/file/s3def.go b/components/file/s3def.go index 0e2d17c9d9..950f1b1377 100644 --- a/components/file/s3def.go +++ b/components/file/s3def.go @@ -25,7 +25,7 @@ type Oss interface { InitConfig(context.Context, *FileConfig) error InitClient(context.Context, *InitRequest) error GetObject(context.Context, *GetObjectInput) (io.ReadCloser, error) - PutObject(context.Context) error + PutObject(context.Context, *PutObjectInput) (*PutObjectOutput, error) } type BaseConfig struct { @@ -36,35 +36,38 @@ type InitRequest struct { } type GetObjectInput struct { - ClientName string - Bucket string - ExpectedBucketOwner string - IfMatch string - IfModifiedSince string - IfNoneMatch string - IfUnmodifiedSince string - Key string - PartNumber int64 - Range string - RequestPayer string - ResponseCacheControl string - ResponseContentDisposition string - ResponseContentEncoding string - ResponseContentLanguage string - ResponseContentType string - ResponseExpires string - SseCustomerAlgorithm string - SseCustomerKey string - SseCustomerKeyMd5 string - VersionId string + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,3,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + IfMatch string `protobuf:"bytes,4,opt,name=if_match,json=ifMatch,proto3" json:"if_match,omitempty"` + IfModifiedSince string `protobuf:"bytes,5,opt,name=if_modified_since,json=ifModifiedSince,proto3" json:"if_modified_since,omitempty"` + IfNoneMatch string `protobuf:"bytes,6,opt,name=if_none_match,json=ifNoneMatch,proto3" json:"if_none_match,omitempty"` + IfUnmodifiedSince string `protobuf:"bytes,7,opt,name=if_unmodified_since,json=ifUnmodifiedSince,proto3" json:"if_unmodified_since,omitempty"` + Key string `protobuf:"bytes,8,opt,name=key,proto3" json:"key,omitempty"` + PartNumber int64 `protobuf:"varint,9,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + Range string `protobuf:"bytes,10,opt,name=range,proto3" json:"range,omitempty"` + RequestPayer string `protobuf:"bytes,11,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + ResponseCacheControl string `protobuf:"bytes,12,opt,name=response_cache_control,json=responseCacheControl,proto3" json:"response_cache_control,omitempty"` + ResponseContentDisposition string `protobuf:"bytes,13,opt,name=response_content_disposition,json=responseContentDisposition,proto3" json:"response_content_disposition,omitempty"` + ResponseContentEncoding string `protobuf:"bytes,14,opt,name=response_content_encoding,json=responseContentEncoding,proto3" json:"response_content_encoding,omitempty"` + ResponseContentLanguage string `protobuf:"bytes,15,opt,name=response_content_language,json=responseContentLanguage,proto3" json:"response_content_language,omitempty"` + ResponseContentType string `protobuf:"bytes,16,opt,name=response_content_type,json=responseContentType,proto3" json:"response_content_type,omitempty"` + ResponseExpires string `protobuf:"bytes,17,opt,name=response_expires,json=responseExpires,proto3" json:"response_expires,omitempty"` + SseCustomerAlgorithm string `protobuf:"bytes,18,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SseCustomerKey string `protobuf:"bytes,19,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` + SseCustomerKeyMd5 string `protobuf:"bytes,20,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + VersionId string `protobuf:"bytes,21,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } type PutObjectInput struct { - ClientName string - Bucket string - Key string DataStream io.Reader - Acl string - BucketKeyEnabled bool - CacheControl string + Acl string `protobuf:"bytes,2,opt,name=acl,proto3" json:"acl,omitempty"` + Bucket string `protobuf:"bytes,4,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,5,opt,name=key,proto3" json:"key,omitempty"` + BucketKeyEnabled bool `protobuf:"varint,6,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + CacheControl string `protobuf:"bytes,7,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` +} + +type PutObjectOutput struct { + BucketKeyEnabled bool `protobuf:"varint,1,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + Etag string `protobuf:"bytes,2,opt,name=etag,proto3" json:"etag,omitempty"` } diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go index 761b473f4d..72bfbff568 100644 --- a/pkg/grpc/extension/s3/s3.go +++ b/pkg/grpc/extension/s3/s3.go @@ -18,21 +18,30 @@ package s3 import ( "context" + "encoding/json" rawGRPC "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/emptypb" + "io" l8s3 "mosn.io/layotto/components/file" "mosn.io/layotto/pkg/grpc" "mosn.io/layotto/spec/proto/extension/v1" + "mosn.io/pkg/log" + "sync" ) var ( s3Instance *S3Server ) -const ( - AliyunOSS = "aliyun" - MinioOSS = "minio" - AwsOSS = "aws" +var ( + bytesPool = sync.Pool{ + New: func() interface{} { + // set size to 100kb + return new([]byte) + }, + } ) const ( @@ -72,12 +81,122 @@ func (s *S3Server) InitClient(ctx context.Context, req *s3.InitRequest) (*emptyp return &emptypb.Empty{}, nil } +func transferData(source interface{}, target interface{}) error { + data, err := json.Marshal(source) + if err != nil { + return nil + } + err = json.Unmarshal(data, target) + return err +} + func (s *S3Server) GetObject(req *s3.GetObjectInput, stream s3.S3_GetObjectServer) error { + if s.ossInstance[req.StoreName] == nil { + return status.Errorf(codes.InvalidArgument, "not supported store type: %+v", req.StoreName) + } + st := &l8s3.GetObjectInput{} + err := transferData(req, st) + if err != nil { + return status.Errorf(codes.InvalidArgument, "transfer request data fail for GetObject,err: %+v", err) + } + data, err := s.ossInstance[req.StoreName].GetObject(stream.Context(), st) + if err != nil { + return status.Errorf(codes.Internal, "get file fail,err: %+v", err) + } + + buffsPtr := bytesPool.Get().(*[]byte) + buf := *buffsPtr + if len(buf) == 0 { + buf = make([]byte, 102400) + } + defer func() { + data.Close() + *buffsPtr = buf + bytesPool.Put(buffsPtr) + }() + + for { + length, err := data.Read(buf) + if err != nil && err != io.EOF { + log.DefaultLogger.Warnf("get file fail, err: %+v", err) + return status.Errorf(codes.Internal, "get file fail,err: %+v", err) + } + if err == nil || (err == io.EOF && length != 0) { + resp := &s3.GetObjectOutput{Body: buf[:length]} + if err = stream.Send(resp); err != nil { + return status.Errorf(codes.Internal, "send file data fail,err: %+v", err) + } + } + if err == io.EOF { + return nil + } + } return nil } -func (s *S3Server) PutObject(s3.S3_PutObjectServer) error { - return nil +type putObjectStreamReader struct { + data []byte + server s3.S3_PutObjectServer +} + +func newPutObjectStreamReader(data []byte, server s3.S3_PutObjectServer) *putObjectStreamReader { + return &putObjectStreamReader{data: data, server: server} +} + +func (r *putObjectStreamReader) Read(p []byte) (int, error) { + var count int + total := len(p) + for { + if len(r.data) > 0 { + n := copy(p[count:], r.data) + r.data = r.data[n:] + count += n + if count == total { + return count, nil + } + } + req, err := r.server.Recv() + if err != nil { + if err != io.EOF { + log.DefaultLogger.Errorf("recv data from grpc stream fail, err:%+v", err) + } + return count, err + } + r.data = req.Body + } +} + +func (s *S3Server) PutObject(stream s3.S3_PutObjectServer) error { + req, err := stream.Recv() + if err != nil { + //if client send eof error directly, return nil + if err == io.EOF { + return nil + } + return status.Errorf(codes.Internal, "receive file data fail: err: %+v", err) + } + + if s.ossInstance[req.StoreName] == nil { + return status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + } + fileReader := newPutObjectStreamReader(req.Body, stream) + + st := &l8s3.PutObjectInput{} + err = transferData(req, st) + if err != nil { + return status.Errorf(codes.InvalidArgument, "transfer request data fail for PutObject,err: %+v", err) + } + st.DataStream = fileReader + if resp, err := s.ossInstance[req.StoreName].PutObject(stream.Context(), st); err != nil { + return status.Errorf(codes.Internal, err.Error()) + } else { + output := &s3.PutObjectOutput{} + err := transferData(resp, output) + if err != nil { + return status.Errorf(codes.Internal, "transfer response data fail for PutObject,err: %+v", err) + } + return stream.SendAndClose(output) + } } func (s *S3Server) DeleteObject(context.Context, *s3.DeleteObjectInput) (*s3.DeleteObjectOutput, error) { From b0cc0ecdb0aed5b43eb8439aa35eaf9c8a4f02ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Fri, 27 May 2022 10:15:13 +0800 Subject: [PATCH 009/126] update part interface --- components/file/aws/oss.go | 216 ++- components/file/s3def.go | 362 +++++ pkg/grpc/extension/s3/s3.go | 1 + spec/proto/extension/v1/s3.pb.go | 2105 +++++++++++++++++------------- spec/proto/extension/v1/s3.proto | 24 +- 5 files changed, 1760 insertions(+), 948 deletions(-) diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index b8555611b1..352e11e61c 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -22,6 +22,8 @@ import ( "errors" "fmt" "github.com/aws/aws-sdk-go-v2/feature/s3/manager" + "github.com/aws/aws-sdk-go-v2/service/s3/types" + "google.golang.org/protobuf/types/known/timestamppb" "io" "mosn.io/layotto/components/file/factory" "mosn.io/layotto/components/file/util" @@ -276,7 +278,7 @@ func (a *AwsOss) List(ctx context.Context, st *file.ListRequest) (*file.ListResp Marker: &st.Marker, Prefix: &prefix, } - client, err := a.selectClient(st.Metadata) + client, err := a.selectClient(st.Metadata, endpointKey) if err != nil { return nil, fmt.Errorf("list bucket[%s] fail, err: %s", st.DirectoryName, err.Error()) } @@ -313,7 +315,7 @@ func (a *AwsOss) Del(ctx context.Context, st *file.DelRequest) error { Bucket: &bucket, Key: &key, } - client, err := a.selectClient(st.Metadata) + client, err := a.selectClient(st.Metadata, endpointKey) if err != nil { return err } @@ -336,7 +338,7 @@ func (a *AwsOss) Stat(ctx context.Context, st *file.FileMetaRequest) (*file.File Bucket: &bucket, Key: &key, } - client, err := a.selectClient(st.Metadata) + client, err := a.selectClient(st.Metadata, endpointKey) if err != nil { return nil, err } @@ -388,7 +390,7 @@ func (a *AwsOss) GetObject(ctx context.Context, req *file.GetObjectInput) (io.Re Bucket: &req.Bucket, Key: &req.Key, } - client, err := a.selectClient(map[string]string{}, req.ClientName) + client, err := a.selectClient(map[string]string{}, "") if err != nil { return nil, err } @@ -399,6 +401,208 @@ func (a *AwsOss) GetObject(ctx context.Context, req *file.GetObjectInput) (io.Re return ob.Body, nil } -func (a *AwsOss) PutObject(context.Context, *file.PutObjectInput) error { - return nil +func (a *AwsOss) PutObject(ctx context.Context, req *file.PutObjectInput) (*file.PutObjectOutput, error) { + client, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + uploader := manager.NewUploader(client) + resp, err := uploader.Upload(context.TODO(), &s3.PutObjectInput{ + Bucket: &req.Bucket, + Key: &req.Key, + Body: req.DataStream, + }) + if err != nil { + return nil, err + } + return &file.PutObjectOutput{BucketKeyEnabled: resp.BucketKeyEnabled, Etag: *resp.ETag}, err +} + +func (a *AwsOss) DeleteObject(ctx context.Context, req *file.DeleteObjectInput) (*file.DeleteObjectOutput, error) { + input := &s3.DeleteObjectInput{ + Bucket: &req.Bucket, + Key: &req.Key, + } + client, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + resp, err := client.DeleteObject(ctx, input) + if err != nil { + return nil, err + } + return &file.DeleteObjectOutput{DeleteMarker: resp.DeleteMarker, RequestCharged: string(resp.RequestCharged), VersionId: *resp.VersionId}, err +} + +func (a *AwsOss) PutObjectTagging(ctx context.Context, req *file.PutBucketTaggingInput) (*file.PutBucketTaggingOutput, error) { + client, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + input := &s3.PutObjectTaggingInput{ + Bucket: &req.Bucket, + Key: &req.Key, + Tagging: &types.Tagging{}, + } + + for k, v := range req.Tags { + input.Tagging.TagSet = append(input.Tagging.TagSet, types.Tag{Key: &k, Value: &v}) + } + _, err = client.PutObjectTagging(ctx, input) + return &file.PutBucketTaggingOutput{}, err +} +func (a *AwsOss) DeleteObjectTagging(ctx context.Context, req *file.DeleteObjectTaggingInput) (*file.DeleteObjectTaggingOutput, error) { + client, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + input := &s3.DeleteObjectTaggingInput{ + Bucket: &req.Bucket, + Key: &req.Key, + } + resp, err := client.DeleteObjectTagging(ctx, input) + if err != nil { + return nil, err + } + return &file.DeleteObjectTaggingOutput{VersionId: *resp.VersionId}, err +} + +func (a *AwsOss) GetObjectTagging(ctx context.Context, req *file.GetObjectTaggingInput) (*file.GetObjectTaggingOutput, error) { + client, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + input := &s3.GetObjectTaggingInput{ + Bucket: &req.Bucket, + Key: &req.Key, + } + resp, err := client.GetObjectTagging(ctx, input) + if err != nil { + return nil, err + } + + output := &file.GetObjectTaggingOutput{Tags: map[string]string{}} + for _, tags := range resp.TagSet { + output.Tags[*tags.Key] = *tags.Value + } + return output, err +} + +func (a *AwsOss) CopyObject(ctx context.Context, req *file.CopyObjectInput) (*file.CopyObjectOutput, error) { + client, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + input := &s3.CopyObjectInput{ + Bucket: &req.Bucket, + Key: &req.Key, + CopySource: &req.CopySource, + } + resp, err := client.CopyObject(ctx, input) + if err != nil { + return nil, err + } + + return &file.CopyObjectOutput{}, err +} +func (a *AwsOss) DeleteObjects(ctx context.Context, req *file.DeleteObjectsInput) (*file.DeleteObjectsOutput, error) { + client, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + input := &s3.DeleteObjectsInput{ + Bucket: &req.Bucket, + Delete: &types.Delete{}, + } + for _, v := range req.Delete.Objects { + object := types.ObjectIdentifier{Key: &v.Key, VersionId: &v.VersionId} + input.Delete.Objects = append(input.Delete.Objects, object) + } + _, err = client.DeleteObjects(ctx, input) + if err != nil { + return nil, err + } + return &file.DeleteObjectsOutput{}, err +} +func (a *AwsOss) ListObjects(ctx context.Context, req *file.ListObjectsInput) (*file.ListObjectsOutput, error) { + client, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + input := &s3.ListObjectsInput{ + Bucket: &req.Bucket, + Delimiter: &req.Delimiter, + EncodingType: types.EncodingType(req.EncodingType), + ExpectedBucketOwner: &req.ExpectedBucketOwner, + Marker: &req.Marker, + MaxKeys: req.MaxKeys, + Prefix: &req.Prefix, + RequestPayer: types.RequestPayer(req.RequestPayer), + } + resp, err := client.ListObjects(ctx, input) + if err != nil { + return nil, err + } + + output := &file.ListObjectsOutput{Delimiter: *resp.Delimiter, EncodingType: string(resp.EncodingType), IsTruncated: resp.IsTruncated, Marker: *resp.Marker, + MaxKeys: resp.MaxKeys, Name: *resp.Name, NextMarker: *resp.NextMarker, Prefix: *resp.Prefix, + } + + for _, v := range resp.CommonPrefixes { + output.CommonPrefixes = append(output.CommonPrefixes, *v.Prefix) + } + + for _, v := range resp.Contents { + object := &file.Object{Etag: *v.ETag, Key: *v.Key, Size: v.Size, StorageClass: string(v.StorageClass), Owner: &file.Owner{DisplayName: *v.Owner.DisplayName, Id: *v.Owner.ID}, LastModified: ×tamppb.Timestamp{Seconds: int64(v.LastModified.Second()), Nanos: int32(v.LastModified.Nanosecond())}} + output.Contents = append(output.Contents, object) + } + + return output, err +} +func (a *AwsOss) GetObjectAcl(ctx context.Context, req *file.GetObjectAclInput) (*file.GetObjectAclOutput, error) { + + client, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + input := &s3.GetObjectAclInput{ + Bucket: &req.Bucket, + Key: &req.Key, + } + resp, err := client.GetObjectAcl(ctx, input) + if err != nil { + return nil, err + } + output := &file.GetObjectAclOutput{Owner: &file.Owner{}, RequestCharged: string(resp.RequestCharged)} + for _, v := range resp.Grants { + + } + return &file.DeleteObjectsOutput{}, err +} +func (a *AwsOss) PutObjectAcl(context.Context, *file.PutObjectAclInput) (*file.PutObjectAclOutput, error) { + return nil, nil +} +func (a *AwsOss) RestoreObject(context.Context, *file.RestoreObjectInput) (*file.RestoreObjectOutput, error) { + return nil, nil +} +func (a *AwsOss) CreateMultipartUpload(context.Context, *file.CreateMultipartUploadInput) (*file.CreateMultipartUploadOutput, error) { + return nil, nil +} +func (a *AwsOss) UploadPart(context.Context, *file.UploadPartInput) (*file.UploadPartOutput, error) { + return nil, nil +} +func (a *AwsOss) UploadPartCopy(context.Context, *file.UploadPartCopyInput) (*file.UploadPartCopyOutput, error) { + return nil, nil +} +func (a *AwsOss) CompleteMultipartUpload(context.Context, *file.CompleteMultipartUploadInput) (*file.CompleteMultipartUploadOutput, error) { + return nil, nil +} +func (a *AwsOss) AbortMultipartUpload(context.Context, *file.AbortMultipartUploadInput) (*file.AbortMultipartUploadOutput, error) { + return nil, nil +} +func (a *AwsOss) ListMultipartUploads(context.Context, *file.ListMultipartUploadsInput) (*file.ListMultipartUploadsOutput, error) { + return nil, nil +} +func (a *AwsOss) ListObjectVersions(context.Context, *file.ListObjectVersionsInput) (*file.ListObjectVersionsOutput, error) { + return nil, nil } diff --git a/components/file/s3def.go b/components/file/s3def.go index 950f1b1377..4cc72094b7 100644 --- a/components/file/s3def.go +++ b/components/file/s3def.go @@ -18,6 +18,7 @@ package file import ( "context" + "google.golang.org/protobuf/types/known/timestamppb" "io" ) @@ -26,6 +27,23 @@ type Oss interface { InitClient(context.Context, *InitRequest) error GetObject(context.Context, *GetObjectInput) (io.ReadCloser, error) PutObject(context.Context, *PutObjectInput) (*PutObjectOutput, error) + DeleteObject(context.Context, *DeleteObjectInput) (*DeleteObjectOutput, error) + PutObjectTagging(context.Context, *PutBucketTaggingInput) (*PutBucketTaggingOutput, error) + DeleteObjectTagging(context.Context, *DeleteObjectTaggingInput) (*DeleteObjectTaggingOutput, error) + GetObjectTagging(context.Context, *GetObjectTaggingInput) (*GetObjectTaggingOutput, error) + CopyObject(context.Context, *CopyObjectInput) (*CopyObjectOutput, error) + DeleteObjects(context.Context, *DeleteObjectsInput) (*DeleteObjectsOutput, error) + ListObjects(context.Context, *ListObjectsInput) (*ListObjectsOutput, error) + GetObjectAcl(context.Context, *GetObjectAclInput) (*GetObjectAclOutput, error) + PutObjectAcl(context.Context, *PutObjectAclInput) (*PutObjectAclOutput, error) + RestoreObject(context.Context, *RestoreObjectInput) (*RestoreObjectOutput, error) + CreateMultipartUpload(context.Context, *CreateMultipartUploadInput) (*CreateMultipartUploadOutput, error) + UploadPart(context.Context, *UploadPartInput) (*UploadPartOutput, error) + UploadPartCopy(context.Context, *UploadPartCopyInput) (*UploadPartCopyOutput, error) + CompleteMultipartUpload(context.Context, *CompleteMultipartUploadInput) (*CompleteMultipartUploadOutput, error) + AbortMultipartUpload(context.Context, *AbortMultipartUploadInput) (*AbortMultipartUploadOutput, error) + ListMultipartUploads(context.Context, *ListMultipartUploadsInput) (*ListMultipartUploadsOutput, error) + ListObjectVersions(context.Context, *ListObjectVersionsInput) (*ListObjectVersionsOutput, error) } type BaseConfig struct { @@ -71,3 +89,347 @@ type PutObjectOutput struct { BucketKeyEnabled bool `protobuf:"varint,1,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` Etag string `protobuf:"bytes,2,opt,name=etag,proto3" json:"etag,omitempty"` } + +type DeleteObjectInput struct { + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` +} +type DeleteObjectOutput struct { + DeleteMarker bool `protobuf:"varint,1,opt,name=delete_marker,json=deleteMarker,proto3" json:"delete_marker,omitempty"` + RequestCharged string `protobuf:"bytes,2,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + VersionId string `protobuf:"bytes,3,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` +} + +type PutBucketTaggingInput struct { + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Tags map[string]string `protobuf:"bytes,3,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} +type PutBucketTaggingOutput struct { +} + +type DeleteObjectTaggingInput struct { + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` +} +type DeleteObjectTaggingOutput struct { + VersionId string `protobuf:"bytes,1,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` +} + +type GetObjectTaggingInput struct { + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` +} +type GetObjectTaggingOutput struct { + Tags map[string]string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +type CopyObjectInput struct { + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + CopySource string `protobuf:"bytes,3,opt,name=copy_source,json=copySource,proto3" json:"copy_source,omitempty"` +} +type CopyObjectOutput struct { +} + +type DeleteObjectsInput struct { + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Delete *Delete `protobuf:"bytes,2,opt,name=Delete,proto3" json:"Delete,omitempty"` +} +type Delete struct { + Objects []*ObjectIdentifier `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` + Quiet bool `protobuf:"varint,2,opt,name=quiet,proto3" json:"quiet,omitempty"` +} +type ObjectIdentifier struct { + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + VersionId string `protobuf:"bytes,2,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` +} + +type DeleteObjectsOutput struct { +} + +type ListObjectsInput struct { + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Delimiter string `protobuf:"bytes,2,opt,name=delimiter,proto3" json:"delimiter,omitempty"` + EncodingType string `protobuf:"bytes,3,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,4,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + Marker string `protobuf:"bytes,5,opt,name=marker,proto3" json:"marker,omitempty"` + MaxKeys int32 `protobuf:"varint,6,opt,name=maxKeys,proto3" json:"maxKeys,omitempty"` + Prefix string `protobuf:"bytes,7,opt,name=prefix,proto3" json:"prefix,omitempty"` + RequestPayer string `protobuf:"bytes,8,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` +} +type ListObjectsOutput struct { + CommonPrefixes []string `protobuf:"bytes,1,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` + Contents []*Object `protobuf:"bytes,2,rep,name=contents,proto3" json:"contents,omitempty"` + Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` + EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + IsTruncated bool `protobuf:"varint,5,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` + Marker string `protobuf:"bytes,6,opt,name=marker,proto3" json:"marker,omitempty"` + MaxKeys int32 `protobuf:"varint,7,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` + Name string `protobuf:"bytes,8,opt,name=name,proto3" json:"name,omitempty"` + NextMarker string `protobuf:"bytes,9,opt,name=next_marker,json=nextMarker,proto3" json:"next_marker,omitempty"` + Prefix string `protobuf:"bytes,10,opt,name=prefix,proto3" json:"prefix,omitempty"` +} +type Object struct { + Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + LastModified *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` + Owner *Owner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` + Size int64 `protobuf:"varint,5,opt,name=size,proto3" json:"size,omitempty"` + StorageClass string `protobuf:"bytes,6,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` +} +type Owner struct { + DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` +} + +type GetObjectAclInput struct { + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` +} +type GetObjectAclOutput struct { + Grants []*Grant `protobuf:"bytes,1,rep,name=grants,proto3" json:"grants,omitempty"` + Owner *Owner `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,omitempty"` + RequestCharged string `protobuf:"bytes,3,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` +} +type Grant struct { + Grantee *Grantee `protobuf:"bytes,1,opt,name=grantee,proto3" json:"grantee,omitempty"` + Permission string `protobuf:"bytes,2,opt,name=permission,proto3" json:"permission,omitempty"` +} +type Grantee struct { + DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + EmailAddress string `protobuf:"bytes,2,opt,name=email_address,json=emailAddress,proto3" json:"email_address,omitempty"` + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` + Type string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"` + Uri string `protobuf:"bytes,5,opt,name=uri,proto3" json:"uri,omitempty"` +} + +type PutObjectAclInput struct { + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Acl string `protobuf:"bytes,3,opt,name=acl,proto3" json:"acl,omitempty"` +} +type PutObjectAclOutput struct { + RequestCharged string `protobuf:"bytes,1,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` +} + +type RestoreObjectInput struct { + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` +} +type RestoreObjectOutput struct { + RequestCharged string `protobuf:"bytes,1,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + RestoreOutputPath string `protobuf:"bytes,2,opt,name=restore_output_path,json=restoreOutputPath,proto3" json:"restore_output_path,omitempty"` +} + +type CreateMultipartUploadInput struct { + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Acl string `protobuf:"bytes,3,opt,name=acl,proto3" json:"acl,omitempty"` + BucketKeyEnabled bool `protobuf:"varint,4,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + CacheControl string `protobuf:"bytes,5,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` + ContentDisposition string `protobuf:"bytes,6,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` + ContentEncoding string `protobuf:"bytes,7,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` + ContentLanguage string `protobuf:"bytes,8,opt,name=content_language,json=contentLanguage,proto3" json:"content_language,omitempty"` + ContentType string `protobuf:"bytes,9,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,10,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + Expires string `protobuf:"bytes,11,opt,name=expires,proto3" json:"expires,omitempty"` + GrantFullControl string `protobuf:"bytes,12,opt,name=grant_full_control,json=grantFullControl,proto3" json:"grant_full_control,omitempty"` + GrantRead string `protobuf:"bytes,13,opt,name=grant_read,json=grantRead,proto3" json:"grant_read,omitempty"` + GrantReadAcp string `protobuf:"bytes,14,opt,name=grant_read_acp,json=grantReadAcp,proto3" json:"grant_read_acp,omitempty"` + GrantWriteAcp string `protobuf:"bytes,15,opt,name=grant_write_acp,json=grantWriteAcp,proto3" json:"grant_write_acp,omitempty"` + MetaData map[string]string `protobuf:"bytes,16,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"` + ObjectLockLegalHoldStatus string `protobuf:"bytes,17,opt,name=object_lock_legal_hold_status,json=objectLockLegalHoldStatus,proto3" json:"object_lock_legal_hold_status,omitempty"` + ObjectLockMode string `protobuf:"bytes,18,opt,name=object_lock_mode,json=objectLockMode,proto3" json:"object_lock_mode,omitempty"` + ObjectLockRetainUntilDate string `protobuf:"bytes,19,opt,name=object_lock_retain_until_date,json=objectLockRetainUntilDate,proto3" json:"object_lock_retain_until_date,omitempty"` + RequestPayer string `protobuf:"bytes,20,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + SseCustomerAlgorithm string `protobuf:"bytes,21,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SseCustomerKey string `protobuf:"bytes,22,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` + SseCustomerKeyMd5 string `protobuf:"bytes,23,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + SseKmsEncryptionContext string `protobuf:"bytes,24,opt,name=sse_kms_encryption_context,json=sseKmsEncryptionContext,proto3" json:"sse_kms_encryption_context,omitempty"` + SseKmsKeyId string `protobuf:"bytes,25,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` + ServerSideEncryption string `protobuf:"bytes,26,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` + StorageClass string `protobuf:"bytes,27,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` + Tagging string `protobuf:"bytes,28,opt,name=tagging,proto3" json:"tagging,omitempty"` + WebsiteRedirectLocation string `protobuf:"bytes,29,opt,name=website_redirect_location,json=websiteRedirectLocation,proto3" json:"website_redirect_location,omitempty"` +} +type CreateMultipartUploadOutput struct { + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + AbortDate *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=abort_date,json=abortDate,proto3" json:"abort_date,omitempty"` + AbortRuleId string `protobuf:"bytes,4,opt,name=abort_rule_id,json=abortRuleId,proto3" json:"abort_rule_id,omitempty"` + BucketKeyEnabled bool `protobuf:"varint,5,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + RequestCharged string `protobuf:"bytes,6,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + SseCustomerAlgorithm string `protobuf:"bytes,7,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SseCustomerKeyMd5 string `protobuf:"bytes,8,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + SseKmsEncryptionContext string `protobuf:"bytes,9,opt,name=sse_kms_encryption_context,json=sseKmsEncryptionContext,proto3" json:"sse_kms_encryption_context,omitempty"` + SseKmsKeyId string `protobuf:"bytes,10,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` + ServerSideEncryption string `protobuf:"bytes,11,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` + UploadId string `protobuf:"bytes,12,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` +} + +type UploadPartInput struct { + DataStream io.Reader + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Body []byte `protobuf:"bytes,3,opt,name=body,proto3" json:"body,omitempty"` + ContentLength int64 `protobuf:"varint,4,opt,name=content_length,json=contentLength,proto3" json:"content_length,omitempty"` + ContentMd5 string `protobuf:"bytes,5,opt,name=content_md5,json=contentMd5,proto3" json:"content_md5,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,6,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + PartNumber int64 `protobuf:"varint,7,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + RequestPayer string `protobuf:"bytes,8,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + SseCustomerAlgorithm string `protobuf:"bytes,9,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SseCustomerKey string `protobuf:"bytes,10,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` + SseCustomerKeyMd5 string `protobuf:"bytes,11,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + UploadId string `protobuf:"bytes,12,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` +} +type UploadPartOutput struct { + BucketKeyEnabled bool `protobuf:"varint,1,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + Etag string `protobuf:"bytes,2,opt,name=etag,proto3" json:"etag,omitempty"` + RequestCharged string `protobuf:"bytes,3,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + SseCustomerAlgorithm string `protobuf:"bytes,4,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SseCustomerKeyMd5 string `protobuf:"bytes,5,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + SseKmsKeyId string `protobuf:"bytes,6,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` + ServerSideEncryption string `protobuf:"bytes,7,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` +} + +type UploadPartCopyInput struct { + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + CopySource string `protobuf:"bytes,3,opt,name=copy_source,json=copySource,proto3" json:"copy_source,omitempty"` + PartNumber int64 `protobuf:"varint,4,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + UploadId string `protobuf:"bytes,5,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` +} +type UploadPartCopyOutput struct { + BucketKeyEnabled bool `protobuf:"varint,1,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + CopyPartResult *CopyPartResult `protobuf:"bytes,2,opt,name=copy_part_result,json=copyPartResult,proto3" json:"copy_part_result,omitempty"` + CopySourceVersionId string `protobuf:"bytes,3,opt,name=copy_source_version_id,json=copySourceVersionId,proto3" json:"copy_source_version_id,omitempty"` + RequestCharged string `protobuf:"bytes,4,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + SseCustomerAlgorithm string `protobuf:"bytes,5,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SseCustomerKeyMd5 string `protobuf:"bytes,6,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + SseKmsKeyId string `protobuf:"bytes,7,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` + ServerSideEncryption string `protobuf:"bytes,8,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` +} +type CopyPartResult struct { + Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` + LastModified *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` +} + +type CompleteMultipartUploadInput struct { + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + UploadId string `protobuf:"bytes,3,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + RequestPayer string `protobuf:"bytes,4,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + MultipartUpload *CompletedMultipartUpload `protobuf:"bytes,6,opt,name=multipart_upload,json=multipartUpload,proto3" json:"multipart_upload,omitempty"` +} +type CompletedMultipartUpload struct { + Parts []*CompletedPart `protobuf:"bytes,1,rep,name=parts,proto3" json:"parts,omitempty"` +} +type CompletedPart struct { + Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` + PartNumber int64 `protobuf:"varint,2,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` +} +type CompleteMultipartUploadOutput struct { + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + BucketKeyEnabled bool `protobuf:"varint,3,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + Etag string `protobuf:"bytes,4,opt,name=etag,proto3" json:"etag,omitempty"` + Expiration string `protobuf:"bytes,5,opt,name=expiration,proto3" json:"expiration,omitempty"` + Location string `protobuf:"bytes,6,opt,name=location,proto3" json:"location,omitempty"` + RequestCharged string `protobuf:"bytes,7,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + SseKmsKeyId string `protobuf:"bytes,8,opt,name=sse_kms_keyId,json=sseKmsKeyId,proto3" json:"sse_kms_keyId,omitempty"` + ServerSideEncryption string `protobuf:"bytes,9,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` + VersionId string `protobuf:"bytes,10,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` +} + +type AbortMultipartUploadInput struct { + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,3,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + RequestPayer string `protobuf:"bytes,4,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + UploadId string `protobuf:"bytes,5,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` +} +type AbortMultipartUploadOutput struct { + RequestCharged string `protobuf:"bytes,1,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` +} + +type ListMultipartUploadsInput struct { + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Delimiter string `protobuf:"bytes,2,opt,name=delimiter,proto3" json:"delimiter,omitempty"` + EncodingType string `protobuf:"bytes,3,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,4,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + KeyMarker string `protobuf:"bytes,5,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` + MaxUploads int64 `protobuf:"varint,6,opt,name=max_uploads,json=maxUploads,proto3" json:"max_uploads,omitempty"` + Prefix string `protobuf:"bytes,7,opt,name=prefix,proto3" json:"prefix,omitempty"` + UploadIdMarker string `protobuf:"bytes,8,opt,name=upload_id_marker,json=uploadIdMarker,proto3" json:"upload_id_marker,omitempty"` +} +type ListMultipartUploadsOutput struct { + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + CommonPrefixes []string `protobuf:"bytes,2,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` + Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` + EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + IsTruncated bool `protobuf:"varint,5,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` + KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` + MaxUploads int64 `protobuf:"varint,7,opt,name=max_uploads,json=maxUploads,proto3" json:"max_uploads,omitempty"` + NextKeyMarker string `protobuf:"bytes,8,opt,name=next_key_marker,json=nextKeyMarker,proto3" json:"next_key_marker,omitempty"` + NextUploadIdMarker string `protobuf:"bytes,9,opt,name=next_upload_id_marker,json=nextUploadIdMarker,proto3" json:"next_upload_id_marker,omitempty"` + Prefix string `protobuf:"bytes,10,opt,name=prefix,proto3" json:"prefix,omitempty"` + UploadIdMarker string `protobuf:"bytes,11,opt,name=upload_id_marker,json=uploadIdMarker,proto3" json:"upload_id_marker,omitempty"` + Uploads *MultipartUpload `protobuf:"bytes,12,opt,name=uploads,proto3" json:"uploads,omitempty"` +} +type MultipartUpload struct { + Initiated *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=Initiated,proto3" json:"Initiated,omitempty"` + Initiator *Initiator `protobuf:"bytes,2,opt,name=initiator,proto3" json:"initiator,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + Owner *Owner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` + StorageClass string `protobuf:"bytes,5,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` + UploadId string `protobuf:"bytes,6,opt,name=UploadId,proto3" json:"UploadId,omitempty"` +} +type Initiator struct { + DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` +} + +type ListObjectVersionsInput struct { + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Delimiter string `protobuf:"bytes,2,opt,name=delimiter,proto3" json:"delimiter,omitempty"` + EncodingType string `protobuf:"bytes,3,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,4,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + KeyMarker string `protobuf:"bytes,5,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` + MaxKeys int64 `protobuf:"varint,6,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` + Prefix string `protobuf:"bytes,7,opt,name=prefix,proto3" json:"prefix,omitempty"` + VersionIdMarker string `protobuf:"bytes,8,opt,name=version_id_marker,json=versionIdMarker,proto3" json:"version_id_marker,omitempty"` +} +type ListObjectVersionsOutput struct { + CommonPrefixes []string `protobuf:"bytes,1,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` + DeleteMarkers []*DeleteMarkerEntry `protobuf:"bytes,2,rep,name=delete_markers,json=deleteMarkers,proto3" json:"delete_markers,omitempty"` + Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` + EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + IsTruncated bool `protobuf:"varint,5,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` + KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` + MaxKeys int64 `protobuf:"varint,7,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` + Name string `protobuf:"bytes,8,opt,name=name,proto3" json:"name,omitempty"` + NextKeyMarker string `protobuf:"bytes,9,opt,name=next_key_marker,json=nextKeyMarker,proto3" json:"next_key_marker,omitempty"` + NextVersionIdMarker string `protobuf:"bytes,10,opt,name=next_version_id_marker,json=nextVersionIdMarker,proto3" json:"next_version_id_marker,omitempty"` + Prefix string `protobuf:"bytes,11,opt,name=prefix,proto3" json:"prefix,omitempty"` + VersionIdMarker string `protobuf:"bytes,12,opt,name=version_id_marker,json=versionIdMarker,proto3" json:"version_id_marker,omitempty"` + Versions []*ObjectVersion `protobuf:"bytes,13,rep,name=versions,proto3" json:"versions,omitempty"` +} +type DeleteMarkerEntry struct { + IsLatest bool `protobuf:"varint,1,opt,name=is_latest,json=isLatest,proto3" json:"is_latest,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + LastModified *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` + Owner *Owner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` + VersionId string `protobuf:"bytes,5,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` +} +type ObjectVersion struct { + Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` + IsLatest bool `protobuf:"varint,2,opt,name=is_latest,json=isLatest,proto3" json:"is_latest,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + LastModified *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` + Owner *Owner `protobuf:"bytes,5,opt,name=owner,proto3" json:"owner,omitempty"` + Size int64 `protobuf:"varint,6,opt,name=size,proto3" json:"size,omitempty"` + StorageClass string `protobuf:"bytes,7,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` + VersionId string `protobuf:"bytes,8,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` +} diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go index 72bfbff568..4085b1f8b6 100644 --- a/pkg/grpc/extension/s3/s3.go +++ b/pkg/grpc/extension/s3/s3.go @@ -200,6 +200,7 @@ func (s *S3Server) PutObject(stream s3.S3_PutObjectServer) error { } func (s *S3Server) DeleteObject(context.Context, *s3.DeleteObjectInput) (*s3.DeleteObjectOutput, error) { + return nil, nil } func (s *S3Server) PutObjectTagging(context.Context, *s3.PutBucketTaggingInput) (*s3.PutBucketTaggingOutput, error) { diff --git a/spec/proto/extension/v1/s3.pb.go b/spec/proto/extension/v1/s3.pb.go index 254fd3aba2..aa1cf0dc10 100644 --- a/spec/proto/extension/v1/s3.pb.go +++ b/spec/proto/extension/v1/s3.pb.go @@ -614,7 +614,8 @@ type PutBucketTaggingInput struct { unknownFields protoimpl.UnknownFields Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Tags map[string]string `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Tags map[string]string `protobuf:"bytes,3,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 *PutBucketTaggingInput) Reset() { @@ -656,6 +657,13 @@ func (x *PutBucketTaggingInput) GetBucket() string { return "" } +func (x *PutBucketTaggingInput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + func (x *PutBucketTaggingInput) GetTags() map[string]string { if x != nil { return x.Tags @@ -1007,20 +1015,129 @@ func (*CopyObjectOutput) Descriptor() ([]byte, []int) { return file_s3_proto_rawDescGZIP(), []int{14} } +type Delete struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Objects []*ObjectIdentifier `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` + Quiet bool `protobuf:"varint,2,opt,name=quiet,proto3" json:"quiet,omitempty"` +} + +func (x *Delete) Reset() { + *x = Delete{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Delete) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Delete) ProtoMessage() {} + +func (x *Delete) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[15] + 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 Delete.ProtoReflect.Descriptor instead. +func (*Delete) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{15} +} + +func (x *Delete) GetObjects() []*ObjectIdentifier { + if x != nil { + return x.Objects + } + return nil +} + +func (x *Delete) GetQuiet() bool { + if x != nil { + return x.Quiet + } + return false +} + +type ObjectIdentifier struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + VersionId string `protobuf:"bytes,2,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` +} + +func (x *ObjectIdentifier) Reset() { + *x = ObjectIdentifier{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ObjectIdentifier) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ObjectIdentifier) ProtoMessage() {} + +func (x *ObjectIdentifier) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[16] + 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 ObjectIdentifier.ProtoReflect.Descriptor instead. +func (*ObjectIdentifier) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{16} +} + +func (x *ObjectIdentifier) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *ObjectIdentifier) GetVersionId() string { + if x != nil { + return x.VersionId + } + return "" +} + type DeleteObjectsInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The bucket name containing the objects from which to remove the tags. - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Objects []string `protobuf:"bytes,2,rep,name=objects,proto3" json:"objects,omitempty"` + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Delete *Delete `protobuf:"bytes,2,opt,name=Delete,proto3" json:"Delete,omitempty"` } func (x *DeleteObjectsInput) Reset() { *x = DeleteObjectsInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[15] + mi := &file_s3_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1033,7 +1150,7 @@ func (x *DeleteObjectsInput) String() string { func (*DeleteObjectsInput) ProtoMessage() {} func (x *DeleteObjectsInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[15] + mi := &file_s3_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1046,7 +1163,7 @@ func (x *DeleteObjectsInput) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteObjectsInput.ProtoReflect.Descriptor instead. func (*DeleteObjectsInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{15} + return file_s3_proto_rawDescGZIP(), []int{17} } func (x *DeleteObjectsInput) GetBucket() string { @@ -1056,9 +1173,9 @@ func (x *DeleteObjectsInput) GetBucket() string { return "" } -func (x *DeleteObjectsInput) GetObjects() []string { +func (x *DeleteObjectsInput) GetDelete() *Delete { if x != nil { - return x.Objects + return x.Delete } return nil } @@ -1072,7 +1189,7 @@ type DeleteObjectsOutput struct { func (x *DeleteObjectsOutput) Reset() { *x = DeleteObjectsOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[16] + mi := &file_s3_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1085,7 +1202,7 @@ func (x *DeleteObjectsOutput) String() string { func (*DeleteObjectsOutput) ProtoMessage() {} func (x *DeleteObjectsOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[16] + mi := &file_s3_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1098,7 +1215,7 @@ func (x *DeleteObjectsOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteObjectsOutput.ProtoReflect.Descriptor instead. func (*DeleteObjectsOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{16} + return file_s3_proto_rawDescGZIP(), []int{18} } type ListObjectsInput struct { @@ -1106,13 +1223,20 @@ type ListObjectsInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Delimiter string `protobuf:"bytes,2,opt,name=delimiter,proto3" json:"delimiter,omitempty"` + EncodingType string `protobuf:"bytes,3,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,4,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + Marker string `protobuf:"bytes,5,opt,name=marker,proto3" json:"marker,omitempty"` + MaxKeys int32 `protobuf:"varint,6,opt,name=maxKeys,proto3" json:"maxKeys,omitempty"` + Prefix string `protobuf:"bytes,7,opt,name=prefix,proto3" json:"prefix,omitempty"` + RequestPayer string `protobuf:"bytes,8,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` } func (x *ListObjectsInput) Reset() { *x = ListObjectsInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[17] + mi := &file_s3_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1125,7 +1249,7 @@ func (x *ListObjectsInput) String() string { func (*ListObjectsInput) ProtoMessage() {} func (x *ListObjectsInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[17] + mi := &file_s3_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1138,7 +1262,7 @@ func (x *ListObjectsInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListObjectsInput.ProtoReflect.Descriptor instead. func (*ListObjectsInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{17} + return file_s3_proto_rawDescGZIP(), []int{19} } func (x *ListObjectsInput) GetBucket() string { @@ -1148,6 +1272,55 @@ func (x *ListObjectsInput) GetBucket() string { return "" } +func (x *ListObjectsInput) GetDelimiter() string { + if x != nil { + return x.Delimiter + } + return "" +} + +func (x *ListObjectsInput) GetEncodingType() string { + if x != nil { + return x.EncodingType + } + return "" +} + +func (x *ListObjectsInput) GetExpectedBucketOwner() string { + if x != nil { + return x.ExpectedBucketOwner + } + return "" +} + +func (x *ListObjectsInput) GetMarker() string { + if x != nil { + return x.Marker + } + return "" +} + +func (x *ListObjectsInput) GetMaxKeys() int32 { + if x != nil { + return x.MaxKeys + } + return 0 +} + +func (x *ListObjectsInput) GetPrefix() string { + if x != nil { + return x.Prefix + } + return "" +} + +func (x *ListObjectsInput) GetRequestPayer() string { + if x != nil { + return x.RequestPayer + } + return "" +} + type ListObjectsOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1159,7 +1332,7 @@ type ListObjectsOutput struct { EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` IsTruncated bool `protobuf:"varint,5,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` Marker string `protobuf:"bytes,6,opt,name=marker,proto3" json:"marker,omitempty"` - MaxKeys int64 `protobuf:"varint,7,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` + MaxKeys int32 `protobuf:"varint,7,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` Name string `protobuf:"bytes,8,opt,name=name,proto3" json:"name,omitempty"` NextMarker string `protobuf:"bytes,9,opt,name=next_marker,json=nextMarker,proto3" json:"next_marker,omitempty"` Prefix string `protobuf:"bytes,10,opt,name=prefix,proto3" json:"prefix,omitempty"` @@ -1168,7 +1341,7 @@ type ListObjectsOutput struct { func (x *ListObjectsOutput) Reset() { *x = ListObjectsOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[18] + mi := &file_s3_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1181,7 +1354,7 @@ func (x *ListObjectsOutput) String() string { func (*ListObjectsOutput) ProtoMessage() {} func (x *ListObjectsOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[18] + mi := &file_s3_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1194,7 +1367,7 @@ func (x *ListObjectsOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListObjectsOutput.ProtoReflect.Descriptor instead. func (*ListObjectsOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{18} + return file_s3_proto_rawDescGZIP(), []int{20} } func (x *ListObjectsOutput) GetCommonPrefixes() []string { @@ -1239,7 +1412,7 @@ func (x *ListObjectsOutput) GetMarker() string { return "" } -func (x *ListObjectsOutput) GetMaxKeys() int64 { +func (x *ListObjectsOutput) GetMaxKeys() int32 { if x != nil { return x.MaxKeys } @@ -1279,7 +1452,7 @@ type Owner struct { func (x *Owner) Reset() { *x = Owner{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[19] + mi := &file_s3_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1292,7 +1465,7 @@ func (x *Owner) String() string { func (*Owner) ProtoMessage() {} func (x *Owner) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[19] + mi := &file_s3_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1305,7 +1478,7 @@ func (x *Owner) ProtoReflect() protoreflect.Message { // Deprecated: Use Owner.ProtoReflect.Descriptor instead. func (*Owner) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{19} + return file_s3_proto_rawDescGZIP(), []int{21} } func (x *Owner) GetDisplayName() string { @@ -1338,7 +1511,7 @@ type Object struct { func (x *Object) Reset() { *x = Object{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[20] + mi := &file_s3_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1351,7 +1524,7 @@ func (x *Object) String() string { func (*Object) ProtoMessage() {} func (x *Object) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[20] + mi := &file_s3_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1364,7 +1537,7 @@ func (x *Object) ProtoReflect() protoreflect.Message { // Deprecated: Use Object.ProtoReflect.Descriptor instead. func (*Object) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{20} + return file_s3_proto_rawDescGZIP(), []int{22} } func (x *Object) GetEtag() string { @@ -1424,7 +1597,7 @@ type Grantee struct { func (x *Grantee) Reset() { *x = Grantee{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[21] + mi := &file_s3_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1437,7 +1610,7 @@ func (x *Grantee) String() string { func (*Grantee) ProtoMessage() {} func (x *Grantee) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[21] + mi := &file_s3_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1450,7 +1623,7 @@ func (x *Grantee) ProtoReflect() protoreflect.Message { // Deprecated: Use Grantee.ProtoReflect.Descriptor instead. func (*Grantee) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{21} + return file_s3_proto_rawDescGZIP(), []int{23} } func (x *Grantee) GetDisplayName() string { @@ -1500,7 +1673,7 @@ type Grant struct { func (x *Grant) Reset() { *x = Grant{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[22] + mi := &file_s3_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1513,7 +1686,7 @@ func (x *Grant) String() string { func (*Grant) ProtoMessage() {} func (x *Grant) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[22] + mi := &file_s3_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1526,7 +1699,7 @@ func (x *Grant) ProtoReflect() protoreflect.Message { // Deprecated: Use Grant.ProtoReflect.Descriptor instead. func (*Grant) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{22} + return file_s3_proto_rawDescGZIP(), []int{24} } func (x *Grant) GetGrantee() *Grantee { @@ -1555,7 +1728,7 @@ type GetObjectAclInput struct { func (x *GetObjectAclInput) Reset() { *x = GetObjectAclInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[23] + mi := &file_s3_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1568,7 +1741,7 @@ func (x *GetObjectAclInput) String() string { func (*GetObjectAclInput) ProtoMessage() {} func (x *GetObjectAclInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[23] + mi := &file_s3_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1581,7 +1754,7 @@ func (x *GetObjectAclInput) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObjectAclInput.ProtoReflect.Descriptor instead. func (*GetObjectAclInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{23} + return file_s3_proto_rawDescGZIP(), []int{25} } func (x *GetObjectAclInput) GetBucket() string { @@ -1611,7 +1784,7 @@ type GetObjectAclOutput struct { func (x *GetObjectAclOutput) Reset() { *x = GetObjectAclOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[24] + mi := &file_s3_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1624,7 +1797,7 @@ func (x *GetObjectAclOutput) String() string { func (*GetObjectAclOutput) ProtoMessage() {} func (x *GetObjectAclOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[24] + mi := &file_s3_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1637,7 +1810,7 @@ func (x *GetObjectAclOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObjectAclOutput.ProtoReflect.Descriptor instead. func (*GetObjectAclOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{24} + return file_s3_proto_rawDescGZIP(), []int{26} } func (x *GetObjectAclOutput) GetGrants() []*Grant { @@ -1674,7 +1847,7 @@ type PutObjectAclInput struct { func (x *PutObjectAclInput) Reset() { *x = PutObjectAclInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[25] + mi := &file_s3_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1687,7 +1860,7 @@ func (x *PutObjectAclInput) String() string { func (*PutObjectAclInput) ProtoMessage() {} func (x *PutObjectAclInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[25] + mi := &file_s3_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1700,7 +1873,7 @@ func (x *PutObjectAclInput) ProtoReflect() protoreflect.Message { // Deprecated: Use PutObjectAclInput.ProtoReflect.Descriptor instead. func (*PutObjectAclInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{25} + return file_s3_proto_rawDescGZIP(), []int{27} } func (x *PutObjectAclInput) GetBucket() string { @@ -1735,7 +1908,7 @@ type PutObjectAclOutput struct { func (x *PutObjectAclOutput) Reset() { *x = PutObjectAclOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[26] + mi := &file_s3_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1748,7 +1921,7 @@ func (x *PutObjectAclOutput) String() string { func (*PutObjectAclOutput) ProtoMessage() {} func (x *PutObjectAclOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[26] + mi := &file_s3_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1761,7 +1934,7 @@ func (x *PutObjectAclOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use PutObjectAclOutput.ProtoReflect.Descriptor instead. func (*PutObjectAclOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{26} + return file_s3_proto_rawDescGZIP(), []int{28} } func (x *PutObjectAclOutput) GetRequestCharged() string { @@ -1783,7 +1956,7 @@ type RestoreObjectInput struct { func (x *RestoreObjectInput) Reset() { *x = RestoreObjectInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[27] + mi := &file_s3_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1796,7 +1969,7 @@ func (x *RestoreObjectInput) String() string { func (*RestoreObjectInput) ProtoMessage() {} func (x *RestoreObjectInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[27] + mi := &file_s3_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1809,7 +1982,7 @@ func (x *RestoreObjectInput) ProtoReflect() protoreflect.Message { // Deprecated: Use RestoreObjectInput.ProtoReflect.Descriptor instead. func (*RestoreObjectInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{27} + return file_s3_proto_rawDescGZIP(), []int{29} } func (x *RestoreObjectInput) GetBucket() string { @@ -1838,7 +2011,7 @@ type RestoreObjectOutput struct { func (x *RestoreObjectOutput) Reset() { *x = RestoreObjectOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[28] + mi := &file_s3_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1851,7 +2024,7 @@ func (x *RestoreObjectOutput) String() string { func (*RestoreObjectOutput) ProtoMessage() {} func (x *RestoreObjectOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[28] + mi := &file_s3_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1864,7 +2037,7 @@ func (x *RestoreObjectOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use RestoreObjectOutput.ProtoReflect.Descriptor instead. func (*RestoreObjectOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{28} + return file_s3_proto_rawDescGZIP(), []int{30} } func (x *RestoreObjectOutput) GetRequestCharged() string { @@ -1920,7 +2093,7 @@ type CreateMultipartUploadInput struct { func (x *CreateMultipartUploadInput) Reset() { *x = CreateMultipartUploadInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[29] + mi := &file_s3_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1933,7 +2106,7 @@ func (x *CreateMultipartUploadInput) String() string { func (*CreateMultipartUploadInput) ProtoMessage() {} func (x *CreateMultipartUploadInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[29] + mi := &file_s3_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1946,7 +2119,7 @@ func (x *CreateMultipartUploadInput) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateMultipartUploadInput.ProtoReflect.Descriptor instead. func (*CreateMultipartUploadInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{29} + return file_s3_proto_rawDescGZIP(), []int{31} } func (x *CreateMultipartUploadInput) GetBucket() string { @@ -2174,7 +2347,7 @@ type CreateMultipartUploadOutput struct { func (x *CreateMultipartUploadOutput) Reset() { *x = CreateMultipartUploadOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[30] + mi := &file_s3_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2187,7 +2360,7 @@ func (x *CreateMultipartUploadOutput) String() string { func (*CreateMultipartUploadOutput) ProtoMessage() {} func (x *CreateMultipartUploadOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[30] + mi := &file_s3_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2200,7 +2373,7 @@ func (x *CreateMultipartUploadOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateMultipartUploadOutput.ProtoReflect.Descriptor instead. func (*CreateMultipartUploadOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{30} + return file_s3_proto_rawDescGZIP(), []int{32} } func (x *CreateMultipartUploadOutput) GetBucket() string { @@ -2309,7 +2482,7 @@ type UploadPartInput struct { func (x *UploadPartInput) Reset() { *x = UploadPartInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[31] + mi := &file_s3_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2322,7 +2495,7 @@ func (x *UploadPartInput) String() string { func (*UploadPartInput) ProtoMessage() {} func (x *UploadPartInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[31] + mi := &file_s3_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2335,7 +2508,7 @@ func (x *UploadPartInput) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadPartInput.ProtoReflect.Descriptor instead. func (*UploadPartInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{31} + return file_s3_proto_rawDescGZIP(), []int{33} } func (x *UploadPartInput) GetBucket() string { @@ -2439,7 +2612,7 @@ type UploadPartOutput struct { func (x *UploadPartOutput) Reset() { *x = UploadPartOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[32] + mi := &file_s3_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2452,7 +2625,7 @@ func (x *UploadPartOutput) String() string { func (*UploadPartOutput) ProtoMessage() {} func (x *UploadPartOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[32] + mi := &file_s3_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2465,7 +2638,7 @@ func (x *UploadPartOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadPartOutput.ProtoReflect.Descriptor instead. func (*UploadPartOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{32} + return file_s3_proto_rawDescGZIP(), []int{34} } func (x *UploadPartOutput) GetBucketKeyEnabled() bool { @@ -2532,7 +2705,7 @@ type UploadPartCopyInput struct { func (x *UploadPartCopyInput) Reset() { *x = UploadPartCopyInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[33] + mi := &file_s3_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2545,7 +2718,7 @@ func (x *UploadPartCopyInput) String() string { func (*UploadPartCopyInput) ProtoMessage() {} func (x *UploadPartCopyInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[33] + mi := &file_s3_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2558,7 +2731,7 @@ func (x *UploadPartCopyInput) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadPartCopyInput.ProtoReflect.Descriptor instead. func (*UploadPartCopyInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{33} + return file_s3_proto_rawDescGZIP(), []int{35} } func (x *UploadPartCopyInput) GetBucket() string { @@ -2608,7 +2781,7 @@ type CopyPartResult struct { func (x *CopyPartResult) Reset() { *x = CopyPartResult{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[34] + mi := &file_s3_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2621,7 +2794,7 @@ func (x *CopyPartResult) String() string { func (*CopyPartResult) ProtoMessage() {} func (x *CopyPartResult) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[34] + mi := &file_s3_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2634,7 +2807,7 @@ func (x *CopyPartResult) ProtoReflect() protoreflect.Message { // Deprecated: Use CopyPartResult.ProtoReflect.Descriptor instead. func (*CopyPartResult) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{34} + return file_s3_proto_rawDescGZIP(), []int{36} } func (x *CopyPartResult) GetEtag() string { @@ -2669,7 +2842,7 @@ type UploadPartCopyOutput struct { func (x *UploadPartCopyOutput) Reset() { *x = UploadPartCopyOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[35] + mi := &file_s3_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2682,7 +2855,7 @@ func (x *UploadPartCopyOutput) String() string { func (*UploadPartCopyOutput) ProtoMessage() {} func (x *UploadPartCopyOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[35] + mi := &file_s3_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2695,7 +2868,7 @@ func (x *UploadPartCopyOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadPartCopyOutput.ProtoReflect.Descriptor instead. func (*UploadPartCopyOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{35} + return file_s3_proto_rawDescGZIP(), []int{37} } func (x *UploadPartCopyOutput) GetBucketKeyEnabled() bool { @@ -2766,7 +2939,7 @@ type CompletedPart struct { func (x *CompletedPart) Reset() { *x = CompletedPart{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[36] + mi := &file_s3_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2779,7 +2952,7 @@ func (x *CompletedPart) String() string { func (*CompletedPart) ProtoMessage() {} func (x *CompletedPart) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[36] + mi := &file_s3_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2792,7 +2965,7 @@ func (x *CompletedPart) ProtoReflect() protoreflect.Message { // Deprecated: Use CompletedPart.ProtoReflect.Descriptor instead. func (*CompletedPart) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{36} + return file_s3_proto_rawDescGZIP(), []int{38} } func (x *CompletedPart) GetEtag() string { @@ -2820,7 +2993,7 @@ type CompletedMultipartUpload struct { func (x *CompletedMultipartUpload) Reset() { *x = CompletedMultipartUpload{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[37] + mi := &file_s3_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2833,7 +3006,7 @@ func (x *CompletedMultipartUpload) String() string { func (*CompletedMultipartUpload) ProtoMessage() {} func (x *CompletedMultipartUpload) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[37] + mi := &file_s3_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2846,7 +3019,7 @@ func (x *CompletedMultipartUpload) ProtoReflect() protoreflect.Message { // Deprecated: Use CompletedMultipartUpload.ProtoReflect.Descriptor instead. func (*CompletedMultipartUpload) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{37} + return file_s3_proto_rawDescGZIP(), []int{39} } func (x *CompletedMultipartUpload) GetParts() []*CompletedPart { @@ -2872,7 +3045,7 @@ type CompleteMultipartUploadInput struct { func (x *CompleteMultipartUploadInput) Reset() { *x = CompleteMultipartUploadInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[38] + mi := &file_s3_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2885,7 +3058,7 @@ func (x *CompleteMultipartUploadInput) String() string { func (*CompleteMultipartUploadInput) ProtoMessage() {} func (x *CompleteMultipartUploadInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[38] + mi := &file_s3_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2898,7 +3071,7 @@ func (x *CompleteMultipartUploadInput) ProtoReflect() protoreflect.Message { // Deprecated: Use CompleteMultipartUploadInput.ProtoReflect.Descriptor instead. func (*CompleteMultipartUploadInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{38} + return file_s3_proto_rawDescGZIP(), []int{40} } func (x *CompleteMultipartUploadInput) GetBucket() string { @@ -2963,7 +3136,7 @@ type CompleteMultipartUploadOutput struct { func (x *CompleteMultipartUploadOutput) Reset() { *x = CompleteMultipartUploadOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[39] + mi := &file_s3_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2976,7 +3149,7 @@ func (x *CompleteMultipartUploadOutput) String() string { func (*CompleteMultipartUploadOutput) ProtoMessage() {} func (x *CompleteMultipartUploadOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[39] + mi := &file_s3_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2989,7 +3162,7 @@ func (x *CompleteMultipartUploadOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use CompleteMultipartUploadOutput.ProtoReflect.Descriptor instead. func (*CompleteMultipartUploadOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{39} + return file_s3_proto_rawDescGZIP(), []int{41} } func (x *CompleteMultipartUploadOutput) GetBucket() string { @@ -3077,7 +3250,7 @@ type AbortMultipartUploadInput struct { func (x *AbortMultipartUploadInput) Reset() { *x = AbortMultipartUploadInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[40] + mi := &file_s3_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3090,7 +3263,7 @@ func (x *AbortMultipartUploadInput) String() string { func (*AbortMultipartUploadInput) ProtoMessage() {} func (x *AbortMultipartUploadInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[40] + mi := &file_s3_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3103,7 +3276,7 @@ func (x *AbortMultipartUploadInput) ProtoReflect() protoreflect.Message { // Deprecated: Use AbortMultipartUploadInput.ProtoReflect.Descriptor instead. func (*AbortMultipartUploadInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{40} + return file_s3_proto_rawDescGZIP(), []int{42} } func (x *AbortMultipartUploadInput) GetBucket() string { @@ -3152,7 +3325,7 @@ type AbortMultipartUploadOutput struct { func (x *AbortMultipartUploadOutput) Reset() { *x = AbortMultipartUploadOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[41] + mi := &file_s3_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3165,7 +3338,7 @@ func (x *AbortMultipartUploadOutput) String() string { func (*AbortMultipartUploadOutput) ProtoMessage() {} func (x *AbortMultipartUploadOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[41] + mi := &file_s3_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3178,7 +3351,7 @@ func (x *AbortMultipartUploadOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use AbortMultipartUploadOutput.ProtoReflect.Descriptor instead. func (*AbortMultipartUploadOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{41} + return file_s3_proto_rawDescGZIP(), []int{43} } func (x *AbortMultipartUploadOutput) GetRequestCharged() string { @@ -3206,7 +3379,7 @@ type ListMultipartUploadsInput struct { func (x *ListMultipartUploadsInput) Reset() { *x = ListMultipartUploadsInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[42] + mi := &file_s3_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3219,7 +3392,7 @@ func (x *ListMultipartUploadsInput) String() string { func (*ListMultipartUploadsInput) ProtoMessage() {} func (x *ListMultipartUploadsInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[42] + mi := &file_s3_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3232,7 +3405,7 @@ func (x *ListMultipartUploadsInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMultipartUploadsInput.ProtoReflect.Descriptor instead. func (*ListMultipartUploadsInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{42} + return file_s3_proto_rawDescGZIP(), []int{44} } func (x *ListMultipartUploadsInput) GetBucket() string { @@ -3303,7 +3476,7 @@ type Initiator struct { func (x *Initiator) Reset() { *x = Initiator{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[43] + mi := &file_s3_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3316,7 +3489,7 @@ func (x *Initiator) String() string { func (*Initiator) ProtoMessage() {} func (x *Initiator) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[43] + mi := &file_s3_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3329,7 +3502,7 @@ func (x *Initiator) ProtoReflect() protoreflect.Message { // Deprecated: Use Initiator.ProtoReflect.Descriptor instead. func (*Initiator) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{43} + return file_s3_proto_rawDescGZIP(), []int{45} } func (x *Initiator) GetDisplayName() string { @@ -3362,7 +3535,7 @@ type MultipartUpload struct { func (x *MultipartUpload) Reset() { *x = MultipartUpload{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[44] + mi := &file_s3_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3375,7 +3548,7 @@ func (x *MultipartUpload) String() string { func (*MultipartUpload) ProtoMessage() {} func (x *MultipartUpload) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[44] + mi := &file_s3_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3388,7 +3561,7 @@ func (x *MultipartUpload) ProtoReflect() protoreflect.Message { // Deprecated: Use MultipartUpload.ProtoReflect.Descriptor instead. func (*MultipartUpload) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{44} + return file_s3_proto_rawDescGZIP(), []int{46} } func (x *MultipartUpload) GetInitiated() *timestamppb.Timestamp { @@ -3455,7 +3628,7 @@ type ListMultipartUploadsOutput struct { func (x *ListMultipartUploadsOutput) Reset() { *x = ListMultipartUploadsOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[45] + mi := &file_s3_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3468,7 +3641,7 @@ func (x *ListMultipartUploadsOutput) String() string { func (*ListMultipartUploadsOutput) ProtoMessage() {} func (x *ListMultipartUploadsOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[45] + mi := &file_s3_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3481,7 +3654,7 @@ func (x *ListMultipartUploadsOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMultipartUploadsOutput.ProtoReflect.Descriptor instead. func (*ListMultipartUploadsOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{45} + return file_s3_proto_rawDescGZIP(), []int{47} } func (x *ListMultipartUploadsOutput) GetBucket() string { @@ -3586,7 +3759,7 @@ type ListObjectVersionsInput struct { func (x *ListObjectVersionsInput) Reset() { *x = ListObjectVersionsInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[46] + mi := &file_s3_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3599,7 +3772,7 @@ func (x *ListObjectVersionsInput) String() string { func (*ListObjectVersionsInput) ProtoMessage() {} func (x *ListObjectVersionsInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[46] + mi := &file_s3_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3612,7 +3785,7 @@ func (x *ListObjectVersionsInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListObjectVersionsInput.ProtoReflect.Descriptor instead. func (*ListObjectVersionsInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{46} + return file_s3_proto_rawDescGZIP(), []int{48} } func (x *ListObjectVersionsInput) GetBucket() string { @@ -3686,7 +3859,7 @@ type DeleteMarkerEntry struct { func (x *DeleteMarkerEntry) Reset() { *x = DeleteMarkerEntry{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[47] + mi := &file_s3_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3699,7 +3872,7 @@ func (x *DeleteMarkerEntry) String() string { func (*DeleteMarkerEntry) ProtoMessage() {} func (x *DeleteMarkerEntry) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[47] + mi := &file_s3_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3712,7 +3885,7 @@ func (x *DeleteMarkerEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteMarkerEntry.ProtoReflect.Descriptor instead. func (*DeleteMarkerEntry) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{47} + return file_s3_proto_rawDescGZIP(), []int{49} } func (x *DeleteMarkerEntry) GetIsLatest() bool { @@ -3768,7 +3941,7 @@ type ObjectVersion struct { func (x *ObjectVersion) Reset() { *x = ObjectVersion{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[48] + mi := &file_s3_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3781,7 +3954,7 @@ func (x *ObjectVersion) String() string { func (*ObjectVersion) ProtoMessage() {} func (x *ObjectVersion) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[48] + mi := &file_s3_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3794,7 +3967,7 @@ func (x *ObjectVersion) ProtoReflect() protoreflect.Message { // Deprecated: Use ObjectVersion.ProtoReflect.Descriptor instead. func (*ObjectVersion) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{48} + return file_s3_proto_rawDescGZIP(), []int{50} } func (x *ObjectVersion) GetEtag() string { @@ -3876,7 +4049,7 @@ type ListObjectVersionsOutput struct { func (x *ListObjectVersionsOutput) Reset() { *x = ListObjectVersionsOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[49] + mi := &file_s3_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3889,7 +4062,7 @@ func (x *ListObjectVersionsOutput) String() string { func (*ListObjectVersionsOutput) ProtoMessage() {} func (x *ListObjectVersionsOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[49] + mi := &file_s3_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3902,7 +4075,7 @@ func (x *ListObjectVersionsOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListObjectVersionsOutput.ProtoReflect.Descriptor instead. func (*ListObjectVersionsOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{49} + return file_s3_proto_rawDescGZIP(), []int{51} } func (x *ListObjectVersionsOutput) GetCommonPrefixes() []string { @@ -4106,721 +4279,749 @@ var file_s3_proto_rawDesc = []byte{ 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, 0xb4, 0x01, 0x0a, 0x15, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x6e, 0x49, 0x64, 0x22, 0xc6, 0x01, 0x0a, 0x15, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 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, 0x4a, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, - 0x75, 0x63, 0x6b, 0x65, 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, 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, 0x18, 0x0a, 0x16, 0x50, 0x75, - 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x22, 0x44, 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, 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, 0x22, 0x3a, 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, 0x22, 0x41, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 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, 0x22, 0x9e, 0x01, 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, 0x4b, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 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, 0x5c, 0x0a, 0x0f, 0x43, 0x6f, - 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 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, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, - 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x46, 0x0a, 0x12, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4a, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, + 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 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, 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, 0x18, 0x0a, 0x16, + 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x44, 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, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x2a, 0x0a, 0x10, 0x4c, - 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, + 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, 0x22, 0x3a, 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, 0x22, 0x41, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 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, 0x22, 0x9e, 0x01, 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, 0x4b, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 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, 0x5c, 0x0a, 0x0f, + 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 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, 0x22, 0xdd, 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, 0x39, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 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, - 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, 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, 0xdc, 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, 0x3f, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, - 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, - 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x87, 0x01, 0x0a, 0x07, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x12, 0x21, + 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, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x70, + 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x43, 0x6f, + 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x61, + 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x41, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 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, 0x63, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 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, 0x35, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x22, 0x90, 0x02, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x49, 0x6e, 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, + 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x02, 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, 0x03, + 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, 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, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x18, + 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x07, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x18, 0x07, 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, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x50, 0x61, 0x79, 0x65, 0x72, 0x22, 0xdd, 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, 0x39, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, - 0x69, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x22, 0x61, 0x0a, 0x05, - 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x52, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x12, - 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x3d, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, - 0x6e, 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, 0x22, 0xa7, - 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x34, 0x0a, 0x06, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, - 0x61, 0x6e, 0x74, 0x52, 0x06, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x05, 0x6f, - 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 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, 0x4f, 0x0a, 0x11, 0x50, 0x75, 0x74, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, 0x6e, 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, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x22, 0x3d, 0x0a, 0x12, 0x50, 0x75, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x3e, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 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, 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, 0xd0, 0x0a, 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, 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, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x03, 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, 0x04, 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, 0x05, 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, 0x06, 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, 0x07, 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, 0x08, 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, 0x09, 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, 0x0a, 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, - 0x0b, 0x20, 0x01, 0x28, 0x09, 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, 0x0c, 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, 0x0d, 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, 0x0e, 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, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x67, 0x72, 0x61, 0x6e, - 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x63, 0x70, 0x12, 0x5c, 0x0a, 0x09, 0x6d, 0x65, 0x74, - 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x6d, - 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 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, 0x11, 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, 0x12, 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, 0x13, 0x20, 0x01, 0x28, 0x09, 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, 0x14, 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, 0x15, 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, 0x16, 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, 0x17, 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, 0x18, 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, 0x19, 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, 0x1a, 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, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, - 0x69, 0x6e, 0x67, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 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, - 0x1d, 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, 0x99, 0x04, 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, 0x39, 0x0a, 0x0a, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x5f, 0x64, - 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x22, 0xdc, 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, 0x3f, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 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, 0xbf, 0x03, 0x0a, 0x0f, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x62, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x87, 0x01, 0x0a, 0x07, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 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, + 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x22, 0x61, 0x0a, 0x05, 0x47, 0x72, + 0x61, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, + 0x6e, 0x74, 0x65, 0x65, 0x52, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x12, 0x1e, 0x0a, + 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x0a, + 0x11, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, 0x6e, 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, 0x22, 0xa7, 0x01, 0x0a, + 0x12, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x12, 0x34, 0x0a, 0x06, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x6e, + 0x74, 0x52, 0x06, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, + 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 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, 0x4f, 0x0a, 0x11, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, 0x6e, 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, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 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, 0x04, 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, - 0x05, 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, 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, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 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, 0x08, 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, 0x09, 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, 0x0a, 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, 0x0b, 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, 0x0c, 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, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x22, 0x3d, 0x0a, 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 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, 0x3e, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 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, 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, 0xd0, 0x0a, 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, 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, + 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x03, 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, 0x04, 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, 0x05, 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, 0x06, 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, 0x07, 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, 0x08, 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, 0x09, 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, 0x0a, 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, 0x0b, 0x20, + 0x01, 0x28, 0x09, 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, 0x0c, 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, 0x0d, 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, 0x0e, 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, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x41, 0x63, 0x70, 0x12, 0x5c, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 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, 0x11, 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, 0x12, 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, 0x13, 0x20, 0x01, 0x28, 0x09, 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, 0x14, 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, 0x15, 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, 0x16, 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, 0x17, 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, 0x18, 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, 0x19, 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, 0x1a, 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, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, + 0x67, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 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, 0x1d, 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, 0x99, 0x04, 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, 0x39, 0x0a, 0x0a, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 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, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, + 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, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x73, 0x65, 0x43, 0x75, + 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, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, + 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, 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, 0x9e, 0x01, 0x0a, 0x13, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x49, 0x6e, - 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, 0x1f, 0x0a, - 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 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, 0x04, 0x20, - 0x01, 0x28, 0x03, 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, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x22, 0x65, 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, 0x3f, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, - 0x69, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, - 0x69, 0x65, 0x64, 0x22, 0xb5, 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, 0x4f, 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, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, + 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, 0xbf, 0x03, 0x0a, 0x0f, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x61, 0x72, 0x74, 0x49, 0x6e, 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, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 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, 0x04, 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, 0x05, 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, 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, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 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, 0x08, 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, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x73, 0x65, 0x43, 0x75, + 0x74, 0x68, 0x6d, 0x18, 0x09, 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, + 0x28, 0x0a, 0x10, 0x73, 0x73, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x0a, 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, 0x0b, 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, 0x0c, 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, 0x9e, 0x01, 0x0a, 0x13, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x49, 0x6e, 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, 0x1f, 0x0a, 0x0b, 0x63, + 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 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, 0x04, 0x20, 0x01, 0x28, + 0x03, 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, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x22, 0x65, 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, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x22, 0x56, 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, 0x3a, 0x0a, - 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, - 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, - 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x22, 0x9a, 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, 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, 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, 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, 0x5a, 0x0a, 0x10, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, + 0x12, 0x3f, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x22, 0xb5, 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, 0x4f, 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, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, + 0x56, 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, 0x3a, 0x0a, 0x05, 0x70, + 0x61, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, + 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x22, 0x9a, 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, 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, 0xbb, 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, 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, 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, 0x03, 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, - 0x04, 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, 0x05, 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, + 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, + 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, 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, 0x5a, 0x0a, 0x10, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x22, 0xac, 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, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, - 0x01, 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, 0x02, 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, 0x03, 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, 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, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x61, 0x72, 0x6b, - 0x65, 0x72, 0x18, 0x05, 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, 0x06, 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, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x28, 0x0a, 0x10, + 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, 0xbb, 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, 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, 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, 0x03, 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, 0x04, 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, 0x05, + 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, 0xac, 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, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 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, 0x02, 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, 0x03, 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, 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, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, + 0x18, 0x05, 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, 0x06, 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, 0x07, 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, 0x08, + 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, 0x92, 0x02, 0x0a, 0x0f, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, + 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x49, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, + 0x65, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x1a, 0x0a, + 0x08, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x22, 0xe2, 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, 0x03, 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, 0x08, 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, 0x92, 0x02, 0x0a, 0x0f, 0x4d, 0x75, 0x6c, 0x74, 0x69, - 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x49, 0x6e, - 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x49, 0x6e, 0x69, 0x74, 0x69, - 0x61, 0x74, 0x65, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, - 0x1a, 0x0a, 0x08, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x22, 0xe2, 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, + 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, 0x40, 0x0a, 0x07, + 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xa6, + 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, 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, 0x03, 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, 0x40, - 0x0a, 0x07, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xa6, 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, 0x16, 0x0a, 0x06, - 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 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, 0x02, 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, 0x03, 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, 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, 0x1d, 0x0a, 0x0a, 0x6b, - 0x65, 0x79, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x05, 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, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x61, - 0x78, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, - 0x07, 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, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x22, 0xd6, 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, 0x3f, - 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, - 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x9f, 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, 0x3f, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, + 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, + 0x02, 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, 0x03, 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, 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, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, + 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x05, 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, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x4b, + 0x65, 0x79, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x07, 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, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x22, 0xd6, 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, 0x3f, 0x0a, 0x0d, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x32, 0x0a, + 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, + 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 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, 0x9f, 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, 0x3f, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, + 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, + 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xab, 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, 0x4f, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 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, 0x40, + 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x24, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x32, 0x93, 0x11, 0x0a, 0x02, 0x53, 0x33, 0x12, 0x4a, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, + 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x5e, 0x0a, 0x09, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xab, 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, 0x4f, 0x0a, 0x0e, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 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, 0x40, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x32, 0x93, 0x11, 0x0a, 0x02, 0x53, 0x33, 0x12, 0x4a, 0x0a, 0x0a, 0x49, 0x6e, 0x69, - 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, + 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, + 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x5e, 0x0a, 0x09, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, - 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x10, - 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, - 0x12, 0x2c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, + 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, + 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, + 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x10, 0x50, 0x75, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, - 0x7a, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, - 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x71, 0x0a, 0x10, 0x47, - 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, - 0x2c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, + 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x6d, + 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, + 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7a, 0x0a, + 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, + 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x71, 0x0a, 0x10, 0x47, 0x65, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x5f, - 0x0a, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x26, 0x2e, 0x6d, - 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, - 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, - 0x68, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x12, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, + 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x0b, 0x4c, 0x69, 0x73, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x1a, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x65, 0x0a, - 0x0c, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x12, 0x28, 0x2e, - 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, - 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x41, 0x63, 0x6c, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, + 0x2e, 0x76, 0x31, 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, 0x5f, 0x0a, 0x0a, + 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, 0x0a, + 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0d, 0x52, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x29, 0x2e, 0x6d, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, + 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x47, + 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x12, 0x28, 0x2e, 0x6d, 0x6f, + 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, + 0x63, 0x6c, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x80, 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, - 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x32, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x61, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, - 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, - 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6b, 0x0a, 0x0e, 0x55, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x2e, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, + 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0d, 0x52, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x29, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x22, 0x00, 0x12, 0x80, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, - 0x43, 0x6f, 0x70, 0x79, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2b, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x86, 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, 0x33, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x34, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 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, 0x7d, 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, - 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x32, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x61, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x61, 0x72, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x6d, + 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6b, 0x0a, 0x0e, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x2e, 0x6d, 0x6f, + 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, + 0x70, 0x79, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2b, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x86, 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, 0x33, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x34, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, + 0x7d, 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, + 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x31, 0x2e, 0x6d, 0x6f, - 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 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, 0x7d, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, - 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7d, + 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 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, - 0x77, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x77, 0x0a, + 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4835,7 +5036,7 @@ func file_s3_proto_rawDescGZIP() []byte { return file_s3_proto_rawDescData } -var file_s3_proto_msgTypes = make([]protoimpl.MessageInfo, 54) +var file_s3_proto_msgTypes = make([]protoimpl.MessageInfo, 56) var file_s3_proto_goTypes = []interface{}{ (*InitRequest)(nil), // 0: mosn.proto.runtime.v1.InitRequest (*GetObjectInput)(nil), // 1: mosn.proto.runtime.v1.GetObjectInput @@ -4852,119 +5053,123 @@ var file_s3_proto_goTypes = []interface{}{ (*GetObjectTaggingOutput)(nil), // 12: mosn.proto.runtime.v1.GetObjectTaggingOutput (*CopyObjectInput)(nil), // 13: mosn.proto.runtime.v1.CopyObjectInput (*CopyObjectOutput)(nil), // 14: mosn.proto.runtime.v1.CopyObjectOutput - (*DeleteObjectsInput)(nil), // 15: mosn.proto.runtime.v1.DeleteObjectsInput - (*DeleteObjectsOutput)(nil), // 16: mosn.proto.runtime.v1.DeleteObjectsOutput - (*ListObjectsInput)(nil), // 17: mosn.proto.runtime.v1.ListObjectsInput - (*ListObjectsOutput)(nil), // 18: mosn.proto.runtime.v1.ListObjectsOutput - (*Owner)(nil), // 19: mosn.proto.runtime.v1.Owner - (*Object)(nil), // 20: mosn.proto.runtime.v1.Object - (*Grantee)(nil), // 21: mosn.proto.runtime.v1.Grantee - (*Grant)(nil), // 22: mosn.proto.runtime.v1.Grant - (*GetObjectAclInput)(nil), // 23: mosn.proto.runtime.v1.GetObjectAclInput - (*GetObjectAclOutput)(nil), // 24: mosn.proto.runtime.v1.GetObjectAclOutput - (*PutObjectAclInput)(nil), // 25: mosn.proto.runtime.v1.PutObjectAclInput - (*PutObjectAclOutput)(nil), // 26: mosn.proto.runtime.v1.PutObjectAclOutput - (*RestoreObjectInput)(nil), // 27: mosn.proto.runtime.v1.RestoreObjectInput - (*RestoreObjectOutput)(nil), // 28: mosn.proto.runtime.v1.RestoreObjectOutput - (*CreateMultipartUploadInput)(nil), // 29: mosn.proto.runtime.v1.CreateMultipartUploadInput - (*CreateMultipartUploadOutput)(nil), // 30: mosn.proto.runtime.v1.CreateMultipartUploadOutput - (*UploadPartInput)(nil), // 31: mosn.proto.runtime.v1.UploadPartInput - (*UploadPartOutput)(nil), // 32: mosn.proto.runtime.v1.UploadPartOutput - (*UploadPartCopyInput)(nil), // 33: mosn.proto.runtime.v1.UploadPartCopyInput - (*CopyPartResult)(nil), // 34: mosn.proto.runtime.v1.CopyPartResult - (*UploadPartCopyOutput)(nil), // 35: mosn.proto.runtime.v1.UploadPartCopyOutput - (*CompletedPart)(nil), // 36: mosn.proto.runtime.v1.CompletedPart - (*CompletedMultipartUpload)(nil), // 37: mosn.proto.runtime.v1.CompletedMultipartUpload - (*CompleteMultipartUploadInput)(nil), // 38: mosn.proto.runtime.v1.CompleteMultipartUploadInput - (*CompleteMultipartUploadOutput)(nil), // 39: mosn.proto.runtime.v1.CompleteMultipartUploadOutput - (*AbortMultipartUploadInput)(nil), // 40: mosn.proto.runtime.v1.AbortMultipartUploadInput - (*AbortMultipartUploadOutput)(nil), // 41: mosn.proto.runtime.v1.AbortMultipartUploadOutput - (*ListMultipartUploadsInput)(nil), // 42: mosn.proto.runtime.v1.ListMultipartUploadsInput - (*Initiator)(nil), // 43: mosn.proto.runtime.v1.Initiator - (*MultipartUpload)(nil), // 44: mosn.proto.runtime.v1.MultipartUpload - (*ListMultipartUploadsOutput)(nil), // 45: mosn.proto.runtime.v1.ListMultipartUploadsOutput - (*ListObjectVersionsInput)(nil), // 46: mosn.proto.runtime.v1.ListObjectVersionsInput - (*DeleteMarkerEntry)(nil), // 47: mosn.proto.runtime.v1.DeleteMarkerEntry - (*ObjectVersion)(nil), // 48: mosn.proto.runtime.v1.ObjectVersion - (*ListObjectVersionsOutput)(nil), // 49: mosn.proto.runtime.v1.ListObjectVersionsOutput - nil, // 50: mosn.proto.runtime.v1.InitRequest.MetadataEntry - nil, // 51: mosn.proto.runtime.v1.PutBucketTaggingInput.TagsEntry - nil, // 52: mosn.proto.runtime.v1.GetObjectTaggingOutput.TagsEntry - nil, // 53: mosn.proto.runtime.v1.CreateMultipartUploadInput.MetaDataEntry - (*timestamppb.Timestamp)(nil), // 54: google.protobuf.Timestamp - (*emptypb.Empty)(nil), // 55: google.protobuf.Empty + (*Delete)(nil), // 15: mosn.proto.runtime.v1.Delete + (*ObjectIdentifier)(nil), // 16: mosn.proto.runtime.v1.ObjectIdentifier + (*DeleteObjectsInput)(nil), // 17: mosn.proto.runtime.v1.DeleteObjectsInput + (*DeleteObjectsOutput)(nil), // 18: mosn.proto.runtime.v1.DeleteObjectsOutput + (*ListObjectsInput)(nil), // 19: mosn.proto.runtime.v1.ListObjectsInput + (*ListObjectsOutput)(nil), // 20: mosn.proto.runtime.v1.ListObjectsOutput + (*Owner)(nil), // 21: mosn.proto.runtime.v1.Owner + (*Object)(nil), // 22: mosn.proto.runtime.v1.Object + (*Grantee)(nil), // 23: mosn.proto.runtime.v1.Grantee + (*Grant)(nil), // 24: mosn.proto.runtime.v1.Grant + (*GetObjectAclInput)(nil), // 25: mosn.proto.runtime.v1.GetObjectAclInput + (*GetObjectAclOutput)(nil), // 26: mosn.proto.runtime.v1.GetObjectAclOutput + (*PutObjectAclInput)(nil), // 27: mosn.proto.runtime.v1.PutObjectAclInput + (*PutObjectAclOutput)(nil), // 28: mosn.proto.runtime.v1.PutObjectAclOutput + (*RestoreObjectInput)(nil), // 29: mosn.proto.runtime.v1.RestoreObjectInput + (*RestoreObjectOutput)(nil), // 30: mosn.proto.runtime.v1.RestoreObjectOutput + (*CreateMultipartUploadInput)(nil), // 31: mosn.proto.runtime.v1.CreateMultipartUploadInput + (*CreateMultipartUploadOutput)(nil), // 32: mosn.proto.runtime.v1.CreateMultipartUploadOutput + (*UploadPartInput)(nil), // 33: mosn.proto.runtime.v1.UploadPartInput + (*UploadPartOutput)(nil), // 34: mosn.proto.runtime.v1.UploadPartOutput + (*UploadPartCopyInput)(nil), // 35: mosn.proto.runtime.v1.UploadPartCopyInput + (*CopyPartResult)(nil), // 36: mosn.proto.runtime.v1.CopyPartResult + (*UploadPartCopyOutput)(nil), // 37: mosn.proto.runtime.v1.UploadPartCopyOutput + (*CompletedPart)(nil), // 38: mosn.proto.runtime.v1.CompletedPart + (*CompletedMultipartUpload)(nil), // 39: mosn.proto.runtime.v1.CompletedMultipartUpload + (*CompleteMultipartUploadInput)(nil), // 40: mosn.proto.runtime.v1.CompleteMultipartUploadInput + (*CompleteMultipartUploadOutput)(nil), // 41: mosn.proto.runtime.v1.CompleteMultipartUploadOutput + (*AbortMultipartUploadInput)(nil), // 42: mosn.proto.runtime.v1.AbortMultipartUploadInput + (*AbortMultipartUploadOutput)(nil), // 43: mosn.proto.runtime.v1.AbortMultipartUploadOutput + (*ListMultipartUploadsInput)(nil), // 44: mosn.proto.runtime.v1.ListMultipartUploadsInput + (*Initiator)(nil), // 45: mosn.proto.runtime.v1.Initiator + (*MultipartUpload)(nil), // 46: mosn.proto.runtime.v1.MultipartUpload + (*ListMultipartUploadsOutput)(nil), // 47: mosn.proto.runtime.v1.ListMultipartUploadsOutput + (*ListObjectVersionsInput)(nil), // 48: mosn.proto.runtime.v1.ListObjectVersionsInput + (*DeleteMarkerEntry)(nil), // 49: mosn.proto.runtime.v1.DeleteMarkerEntry + (*ObjectVersion)(nil), // 50: mosn.proto.runtime.v1.ObjectVersion + (*ListObjectVersionsOutput)(nil), // 51: mosn.proto.runtime.v1.ListObjectVersionsOutput + nil, // 52: mosn.proto.runtime.v1.InitRequest.MetadataEntry + nil, // 53: mosn.proto.runtime.v1.PutBucketTaggingInput.TagsEntry + nil, // 54: mosn.proto.runtime.v1.GetObjectTaggingOutput.TagsEntry + nil, // 55: mosn.proto.runtime.v1.CreateMultipartUploadInput.MetaDataEntry + (*timestamppb.Timestamp)(nil), // 56: google.protobuf.Timestamp + (*emptypb.Empty)(nil), // 57: google.protobuf.Empty } var file_s3_proto_depIdxs = []int32{ - 50, // 0: mosn.proto.runtime.v1.InitRequest.metadata:type_name -> mosn.proto.runtime.v1.InitRequest.MetadataEntry - 51, // 1: mosn.proto.runtime.v1.PutBucketTaggingInput.tags:type_name -> mosn.proto.runtime.v1.PutBucketTaggingInput.TagsEntry - 52, // 2: mosn.proto.runtime.v1.GetObjectTaggingOutput.tags:type_name -> mosn.proto.runtime.v1.GetObjectTaggingOutput.TagsEntry - 20, // 3: mosn.proto.runtime.v1.ListObjectsOutput.contents:type_name -> mosn.proto.runtime.v1.Object - 54, // 4: mosn.proto.runtime.v1.Object.last_modified:type_name -> google.protobuf.Timestamp - 19, // 5: mosn.proto.runtime.v1.Object.owner:type_name -> mosn.proto.runtime.v1.Owner - 21, // 6: mosn.proto.runtime.v1.Grant.grantee:type_name -> mosn.proto.runtime.v1.Grantee - 22, // 7: mosn.proto.runtime.v1.GetObjectAclOutput.grants:type_name -> mosn.proto.runtime.v1.Grant - 19, // 8: mosn.proto.runtime.v1.GetObjectAclOutput.owner:type_name -> mosn.proto.runtime.v1.Owner - 53, // 9: mosn.proto.runtime.v1.CreateMultipartUploadInput.meta_data:type_name -> mosn.proto.runtime.v1.CreateMultipartUploadInput.MetaDataEntry - 54, // 10: mosn.proto.runtime.v1.CreateMultipartUploadOutput.abort_date:type_name -> google.protobuf.Timestamp - 54, // 11: mosn.proto.runtime.v1.CopyPartResult.last_modified:type_name -> google.protobuf.Timestamp - 34, // 12: mosn.proto.runtime.v1.UploadPartCopyOutput.copy_part_result:type_name -> mosn.proto.runtime.v1.CopyPartResult - 36, // 13: mosn.proto.runtime.v1.CompletedMultipartUpload.parts:type_name -> mosn.proto.runtime.v1.CompletedPart - 37, // 14: mosn.proto.runtime.v1.CompleteMultipartUploadInput.multipart_upload:type_name -> mosn.proto.runtime.v1.CompletedMultipartUpload - 54, // 15: mosn.proto.runtime.v1.MultipartUpload.Initiated:type_name -> google.protobuf.Timestamp - 43, // 16: mosn.proto.runtime.v1.MultipartUpload.initiator:type_name -> mosn.proto.runtime.v1.Initiator - 19, // 17: mosn.proto.runtime.v1.MultipartUpload.owner:type_name -> mosn.proto.runtime.v1.Owner - 44, // 18: mosn.proto.runtime.v1.ListMultipartUploadsOutput.uploads:type_name -> mosn.proto.runtime.v1.MultipartUpload - 54, // 19: mosn.proto.runtime.v1.DeleteMarkerEntry.last_modified:type_name -> google.protobuf.Timestamp - 19, // 20: mosn.proto.runtime.v1.DeleteMarkerEntry.owner:type_name -> mosn.proto.runtime.v1.Owner - 54, // 21: mosn.proto.runtime.v1.ObjectVersion.last_modified:type_name -> google.protobuf.Timestamp - 19, // 22: mosn.proto.runtime.v1.ObjectVersion.owner:type_name -> mosn.proto.runtime.v1.Owner - 47, // 23: mosn.proto.runtime.v1.ListObjectVersionsOutput.delete_markers:type_name -> mosn.proto.runtime.v1.DeleteMarkerEntry - 48, // 24: mosn.proto.runtime.v1.ListObjectVersionsOutput.versions:type_name -> mosn.proto.runtime.v1.ObjectVersion - 0, // 25: mosn.proto.runtime.v1.S3.InitClient:input_type -> mosn.proto.runtime.v1.InitRequest - 3, // 26: mosn.proto.runtime.v1.S3.PutObject:input_type -> mosn.proto.runtime.v1.PutObjectInput - 1, // 27: mosn.proto.runtime.v1.S3.GetObject:input_type -> mosn.proto.runtime.v1.GetObjectInput - 5, // 28: mosn.proto.runtime.v1.S3.DeleteObject:input_type -> mosn.proto.runtime.v1.DeleteObjectInput - 7, // 29: mosn.proto.runtime.v1.S3.PutObjectTagging:input_type -> mosn.proto.runtime.v1.PutBucketTaggingInput - 9, // 30: mosn.proto.runtime.v1.S3.DeleteObjectTagging:input_type -> mosn.proto.runtime.v1.DeleteObjectTaggingInput - 11, // 31: mosn.proto.runtime.v1.S3.GetObjectTagging:input_type -> mosn.proto.runtime.v1.GetObjectTaggingInput - 13, // 32: mosn.proto.runtime.v1.S3.CopyObject:input_type -> mosn.proto.runtime.v1.CopyObjectInput - 15, // 33: mosn.proto.runtime.v1.S3.DeleteObjects:input_type -> mosn.proto.runtime.v1.DeleteObjectsInput - 17, // 34: mosn.proto.runtime.v1.S3.ListObjects:input_type -> mosn.proto.runtime.v1.ListObjectsInput - 23, // 35: mosn.proto.runtime.v1.S3.GetObjectAcl:input_type -> mosn.proto.runtime.v1.GetObjectAclInput - 25, // 36: mosn.proto.runtime.v1.S3.PutObjectAcl:input_type -> mosn.proto.runtime.v1.PutObjectAclInput - 27, // 37: mosn.proto.runtime.v1.S3.RestoreObject:input_type -> mosn.proto.runtime.v1.RestoreObjectInput - 29, // 38: mosn.proto.runtime.v1.S3.CreateMultipartUpload:input_type -> mosn.proto.runtime.v1.CreateMultipartUploadInput - 31, // 39: mosn.proto.runtime.v1.S3.UploadPart:input_type -> mosn.proto.runtime.v1.UploadPartInput - 33, // 40: mosn.proto.runtime.v1.S3.UploadPartCopy:input_type -> mosn.proto.runtime.v1.UploadPartCopyInput - 38, // 41: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:input_type -> mosn.proto.runtime.v1.CompleteMultipartUploadInput - 40, // 42: mosn.proto.runtime.v1.S3.AbortMultipartUpload:input_type -> mosn.proto.runtime.v1.AbortMultipartUploadInput - 42, // 43: mosn.proto.runtime.v1.S3.ListMultipartUploads:input_type -> mosn.proto.runtime.v1.ListMultipartUploadsInput - 46, // 44: mosn.proto.runtime.v1.S3.ListObjectVersions:input_type -> mosn.proto.runtime.v1.ListObjectVersionsInput - 55, // 45: mosn.proto.runtime.v1.S3.InitClient:output_type -> google.protobuf.Empty - 4, // 46: mosn.proto.runtime.v1.S3.PutObject:output_type -> mosn.proto.runtime.v1.PutObjectOutput - 2, // 47: mosn.proto.runtime.v1.S3.GetObject:output_type -> mosn.proto.runtime.v1.GetObjectOutput - 6, // 48: mosn.proto.runtime.v1.S3.DeleteObject:output_type -> mosn.proto.runtime.v1.DeleteObjectOutput - 8, // 49: mosn.proto.runtime.v1.S3.PutObjectTagging:output_type -> mosn.proto.runtime.v1.PutBucketTaggingOutput - 10, // 50: mosn.proto.runtime.v1.S3.DeleteObjectTagging:output_type -> mosn.proto.runtime.v1.DeleteObjectTaggingOutput - 12, // 51: mosn.proto.runtime.v1.S3.GetObjectTagging:output_type -> mosn.proto.runtime.v1.GetObjectTaggingOutput - 14, // 52: mosn.proto.runtime.v1.S3.CopyObject:output_type -> mosn.proto.runtime.v1.CopyObjectOutput - 16, // 53: mosn.proto.runtime.v1.S3.DeleteObjects:output_type -> mosn.proto.runtime.v1.DeleteObjectsOutput - 18, // 54: mosn.proto.runtime.v1.S3.ListObjects:output_type -> mosn.proto.runtime.v1.ListObjectsOutput - 24, // 55: mosn.proto.runtime.v1.S3.GetObjectAcl:output_type -> mosn.proto.runtime.v1.GetObjectAclOutput - 26, // 56: mosn.proto.runtime.v1.S3.PutObjectAcl:output_type -> mosn.proto.runtime.v1.PutObjectAclOutput - 28, // 57: mosn.proto.runtime.v1.S3.RestoreObject:output_type -> mosn.proto.runtime.v1.RestoreObjectOutput - 30, // 58: mosn.proto.runtime.v1.S3.CreateMultipartUpload:output_type -> mosn.proto.runtime.v1.CreateMultipartUploadOutput - 32, // 59: mosn.proto.runtime.v1.S3.UploadPart:output_type -> mosn.proto.runtime.v1.UploadPartOutput - 35, // 60: mosn.proto.runtime.v1.S3.UploadPartCopy:output_type -> mosn.proto.runtime.v1.UploadPartCopyOutput - 39, // 61: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:output_type -> mosn.proto.runtime.v1.CompleteMultipartUploadOutput - 41, // 62: mosn.proto.runtime.v1.S3.AbortMultipartUpload:output_type -> mosn.proto.runtime.v1.AbortMultipartUploadOutput - 45, // 63: mosn.proto.runtime.v1.S3.ListMultipartUploads:output_type -> mosn.proto.runtime.v1.ListMultipartUploadsOutput - 49, // 64: mosn.proto.runtime.v1.S3.ListObjectVersions:output_type -> mosn.proto.runtime.v1.ListObjectVersionsOutput - 45, // [45:65] is the sub-list for method output_type - 25, // [25:45] is the sub-list for method input_type - 25, // [25:25] is the sub-list for extension type_name - 25, // [25:25] is the sub-list for extension extendee - 0, // [0:25] is the sub-list for field type_name + 52, // 0: mosn.proto.runtime.v1.InitRequest.metadata:type_name -> mosn.proto.runtime.v1.InitRequest.MetadataEntry + 53, // 1: mosn.proto.runtime.v1.PutBucketTaggingInput.tags:type_name -> mosn.proto.runtime.v1.PutBucketTaggingInput.TagsEntry + 54, // 2: mosn.proto.runtime.v1.GetObjectTaggingOutput.tags:type_name -> mosn.proto.runtime.v1.GetObjectTaggingOutput.TagsEntry + 16, // 3: mosn.proto.runtime.v1.Delete.objects:type_name -> mosn.proto.runtime.v1.ObjectIdentifier + 15, // 4: mosn.proto.runtime.v1.DeleteObjectsInput.Delete:type_name -> mosn.proto.runtime.v1.Delete + 22, // 5: mosn.proto.runtime.v1.ListObjectsOutput.contents:type_name -> mosn.proto.runtime.v1.Object + 56, // 6: mosn.proto.runtime.v1.Object.last_modified:type_name -> google.protobuf.Timestamp + 21, // 7: mosn.proto.runtime.v1.Object.owner:type_name -> mosn.proto.runtime.v1.Owner + 23, // 8: mosn.proto.runtime.v1.Grant.grantee:type_name -> mosn.proto.runtime.v1.Grantee + 24, // 9: mosn.proto.runtime.v1.GetObjectAclOutput.grants:type_name -> mosn.proto.runtime.v1.Grant + 21, // 10: mosn.proto.runtime.v1.GetObjectAclOutput.owner:type_name -> mosn.proto.runtime.v1.Owner + 55, // 11: mosn.proto.runtime.v1.CreateMultipartUploadInput.meta_data:type_name -> mosn.proto.runtime.v1.CreateMultipartUploadInput.MetaDataEntry + 56, // 12: mosn.proto.runtime.v1.CreateMultipartUploadOutput.abort_date:type_name -> google.protobuf.Timestamp + 56, // 13: mosn.proto.runtime.v1.CopyPartResult.last_modified:type_name -> google.protobuf.Timestamp + 36, // 14: mosn.proto.runtime.v1.UploadPartCopyOutput.copy_part_result:type_name -> mosn.proto.runtime.v1.CopyPartResult + 38, // 15: mosn.proto.runtime.v1.CompletedMultipartUpload.parts:type_name -> mosn.proto.runtime.v1.CompletedPart + 39, // 16: mosn.proto.runtime.v1.CompleteMultipartUploadInput.multipart_upload:type_name -> mosn.proto.runtime.v1.CompletedMultipartUpload + 56, // 17: mosn.proto.runtime.v1.MultipartUpload.Initiated:type_name -> google.protobuf.Timestamp + 45, // 18: mosn.proto.runtime.v1.MultipartUpload.initiator:type_name -> mosn.proto.runtime.v1.Initiator + 21, // 19: mosn.proto.runtime.v1.MultipartUpload.owner:type_name -> mosn.proto.runtime.v1.Owner + 46, // 20: mosn.proto.runtime.v1.ListMultipartUploadsOutput.uploads:type_name -> mosn.proto.runtime.v1.MultipartUpload + 56, // 21: mosn.proto.runtime.v1.DeleteMarkerEntry.last_modified:type_name -> google.protobuf.Timestamp + 21, // 22: mosn.proto.runtime.v1.DeleteMarkerEntry.owner:type_name -> mosn.proto.runtime.v1.Owner + 56, // 23: mosn.proto.runtime.v1.ObjectVersion.last_modified:type_name -> google.protobuf.Timestamp + 21, // 24: mosn.proto.runtime.v1.ObjectVersion.owner:type_name -> mosn.proto.runtime.v1.Owner + 49, // 25: mosn.proto.runtime.v1.ListObjectVersionsOutput.delete_markers:type_name -> mosn.proto.runtime.v1.DeleteMarkerEntry + 50, // 26: mosn.proto.runtime.v1.ListObjectVersionsOutput.versions:type_name -> mosn.proto.runtime.v1.ObjectVersion + 0, // 27: mosn.proto.runtime.v1.S3.InitClient:input_type -> mosn.proto.runtime.v1.InitRequest + 3, // 28: mosn.proto.runtime.v1.S3.PutObject:input_type -> mosn.proto.runtime.v1.PutObjectInput + 1, // 29: mosn.proto.runtime.v1.S3.GetObject:input_type -> mosn.proto.runtime.v1.GetObjectInput + 5, // 30: mosn.proto.runtime.v1.S3.DeleteObject:input_type -> mosn.proto.runtime.v1.DeleteObjectInput + 7, // 31: mosn.proto.runtime.v1.S3.PutObjectTagging:input_type -> mosn.proto.runtime.v1.PutBucketTaggingInput + 9, // 32: mosn.proto.runtime.v1.S3.DeleteObjectTagging:input_type -> mosn.proto.runtime.v1.DeleteObjectTaggingInput + 11, // 33: mosn.proto.runtime.v1.S3.GetObjectTagging:input_type -> mosn.proto.runtime.v1.GetObjectTaggingInput + 13, // 34: mosn.proto.runtime.v1.S3.CopyObject:input_type -> mosn.proto.runtime.v1.CopyObjectInput + 17, // 35: mosn.proto.runtime.v1.S3.DeleteObjects:input_type -> mosn.proto.runtime.v1.DeleteObjectsInput + 19, // 36: mosn.proto.runtime.v1.S3.ListObjects:input_type -> mosn.proto.runtime.v1.ListObjectsInput + 25, // 37: mosn.proto.runtime.v1.S3.GetObjectAcl:input_type -> mosn.proto.runtime.v1.GetObjectAclInput + 27, // 38: mosn.proto.runtime.v1.S3.PutObjectAcl:input_type -> mosn.proto.runtime.v1.PutObjectAclInput + 29, // 39: mosn.proto.runtime.v1.S3.RestoreObject:input_type -> mosn.proto.runtime.v1.RestoreObjectInput + 31, // 40: mosn.proto.runtime.v1.S3.CreateMultipartUpload:input_type -> mosn.proto.runtime.v1.CreateMultipartUploadInput + 33, // 41: mosn.proto.runtime.v1.S3.UploadPart:input_type -> mosn.proto.runtime.v1.UploadPartInput + 35, // 42: mosn.proto.runtime.v1.S3.UploadPartCopy:input_type -> mosn.proto.runtime.v1.UploadPartCopyInput + 40, // 43: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:input_type -> mosn.proto.runtime.v1.CompleteMultipartUploadInput + 42, // 44: mosn.proto.runtime.v1.S3.AbortMultipartUpload:input_type -> mosn.proto.runtime.v1.AbortMultipartUploadInput + 44, // 45: mosn.proto.runtime.v1.S3.ListMultipartUploads:input_type -> mosn.proto.runtime.v1.ListMultipartUploadsInput + 48, // 46: mosn.proto.runtime.v1.S3.ListObjectVersions:input_type -> mosn.proto.runtime.v1.ListObjectVersionsInput + 57, // 47: mosn.proto.runtime.v1.S3.InitClient:output_type -> google.protobuf.Empty + 4, // 48: mosn.proto.runtime.v1.S3.PutObject:output_type -> mosn.proto.runtime.v1.PutObjectOutput + 2, // 49: mosn.proto.runtime.v1.S3.GetObject:output_type -> mosn.proto.runtime.v1.GetObjectOutput + 6, // 50: mosn.proto.runtime.v1.S3.DeleteObject:output_type -> mosn.proto.runtime.v1.DeleteObjectOutput + 8, // 51: mosn.proto.runtime.v1.S3.PutObjectTagging:output_type -> mosn.proto.runtime.v1.PutBucketTaggingOutput + 10, // 52: mosn.proto.runtime.v1.S3.DeleteObjectTagging:output_type -> mosn.proto.runtime.v1.DeleteObjectTaggingOutput + 12, // 53: mosn.proto.runtime.v1.S3.GetObjectTagging:output_type -> mosn.proto.runtime.v1.GetObjectTaggingOutput + 14, // 54: mosn.proto.runtime.v1.S3.CopyObject:output_type -> mosn.proto.runtime.v1.CopyObjectOutput + 18, // 55: mosn.proto.runtime.v1.S3.DeleteObjects:output_type -> mosn.proto.runtime.v1.DeleteObjectsOutput + 20, // 56: mosn.proto.runtime.v1.S3.ListObjects:output_type -> mosn.proto.runtime.v1.ListObjectsOutput + 26, // 57: mosn.proto.runtime.v1.S3.GetObjectAcl:output_type -> mosn.proto.runtime.v1.GetObjectAclOutput + 28, // 58: mosn.proto.runtime.v1.S3.PutObjectAcl:output_type -> mosn.proto.runtime.v1.PutObjectAclOutput + 30, // 59: mosn.proto.runtime.v1.S3.RestoreObject:output_type -> mosn.proto.runtime.v1.RestoreObjectOutput + 32, // 60: mosn.proto.runtime.v1.S3.CreateMultipartUpload:output_type -> mosn.proto.runtime.v1.CreateMultipartUploadOutput + 34, // 61: mosn.proto.runtime.v1.S3.UploadPart:output_type -> mosn.proto.runtime.v1.UploadPartOutput + 37, // 62: mosn.proto.runtime.v1.S3.UploadPartCopy:output_type -> mosn.proto.runtime.v1.UploadPartCopyOutput + 41, // 63: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:output_type -> mosn.proto.runtime.v1.CompleteMultipartUploadOutput + 43, // 64: mosn.proto.runtime.v1.S3.AbortMultipartUpload:output_type -> mosn.proto.runtime.v1.AbortMultipartUploadOutput + 47, // 65: mosn.proto.runtime.v1.S3.ListMultipartUploads:output_type -> mosn.proto.runtime.v1.ListMultipartUploadsOutput + 51, // 66: mosn.proto.runtime.v1.S3.ListObjectVersions:output_type -> mosn.proto.runtime.v1.ListObjectVersionsOutput + 47, // [47:67] is the sub-list for method output_type + 27, // [27:47] is the sub-list for method input_type + 27, // [27:27] is the sub-list for extension type_name + 27, // [27:27] is the sub-list for extension extendee + 0, // [0:27] is the sub-list for field type_name } func init() { file_s3_proto_init() } @@ -5154,7 +5359,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteObjectsInput); i { + switch v := v.(*Delete); i { case 0: return &v.state case 1: @@ -5166,7 +5371,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteObjectsOutput); i { + switch v := v.(*ObjectIdentifier); i { case 0: return &v.state case 1: @@ -5178,7 +5383,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListObjectsInput); i { + switch v := v.(*DeleteObjectsInput); i { case 0: return &v.state case 1: @@ -5190,7 +5395,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListObjectsOutput); i { + switch v := v.(*DeleteObjectsOutput); i { case 0: return &v.state case 1: @@ -5202,7 +5407,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Owner); i { + switch v := v.(*ListObjectsInput); i { case 0: return &v.state case 1: @@ -5214,7 +5419,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Object); i { + switch v := v.(*ListObjectsOutput); i { case 0: return &v.state case 1: @@ -5226,7 +5431,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Grantee); i { + switch v := v.(*Owner); i { case 0: return &v.state case 1: @@ -5238,7 +5443,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Grant); i { + switch v := v.(*Object); i { case 0: return &v.state case 1: @@ -5250,7 +5455,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObjectAclInput); i { + switch v := v.(*Grantee); i { case 0: return &v.state case 1: @@ -5262,7 +5467,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObjectAclOutput); i { + switch v := v.(*Grant); i { case 0: return &v.state case 1: @@ -5274,7 +5479,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutObjectAclInput); i { + switch v := v.(*GetObjectAclInput); i { case 0: return &v.state case 1: @@ -5286,7 +5491,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutObjectAclOutput); i { + switch v := v.(*GetObjectAclOutput); i { case 0: return &v.state case 1: @@ -5298,7 +5503,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RestoreObjectInput); i { + switch v := v.(*PutObjectAclInput); i { case 0: return &v.state case 1: @@ -5310,7 +5515,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RestoreObjectOutput); i { + switch v := v.(*PutObjectAclOutput); i { case 0: return &v.state case 1: @@ -5322,7 +5527,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateMultipartUploadInput); i { + switch v := v.(*RestoreObjectInput); i { case 0: return &v.state case 1: @@ -5334,7 +5539,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateMultipartUploadOutput); i { + switch v := v.(*RestoreObjectOutput); i { case 0: return &v.state case 1: @@ -5346,7 +5551,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UploadPartInput); i { + switch v := v.(*CreateMultipartUploadInput); i { case 0: return &v.state case 1: @@ -5358,7 +5563,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UploadPartOutput); i { + switch v := v.(*CreateMultipartUploadOutput); i { case 0: return &v.state case 1: @@ -5370,7 +5575,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UploadPartCopyInput); i { + switch v := v.(*UploadPartInput); i { case 0: return &v.state case 1: @@ -5382,7 +5587,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CopyPartResult); i { + switch v := v.(*UploadPartOutput); i { case 0: return &v.state case 1: @@ -5394,7 +5599,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UploadPartCopyOutput); i { + switch v := v.(*UploadPartCopyInput); i { case 0: return &v.state case 1: @@ -5406,7 +5611,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CompletedPart); i { + switch v := v.(*CopyPartResult); i { case 0: return &v.state case 1: @@ -5418,7 +5623,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CompletedMultipartUpload); i { + switch v := v.(*UploadPartCopyOutput); i { case 0: return &v.state case 1: @@ -5430,7 +5635,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CompleteMultipartUploadInput); i { + switch v := v.(*CompletedPart); i { case 0: return &v.state case 1: @@ -5442,7 +5647,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CompleteMultipartUploadOutput); i { + switch v := v.(*CompletedMultipartUpload); i { case 0: return &v.state case 1: @@ -5454,7 +5659,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AbortMultipartUploadInput); i { + switch v := v.(*CompleteMultipartUploadInput); i { case 0: return &v.state case 1: @@ -5466,7 +5671,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AbortMultipartUploadOutput); i { + switch v := v.(*CompleteMultipartUploadOutput); i { case 0: return &v.state case 1: @@ -5478,7 +5683,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMultipartUploadsInput); i { + switch v := v.(*AbortMultipartUploadInput); i { case 0: return &v.state case 1: @@ -5490,7 +5695,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Initiator); i { + switch v := v.(*AbortMultipartUploadOutput); i { case 0: return &v.state case 1: @@ -5502,7 +5707,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MultipartUpload); i { + switch v := v.(*ListMultipartUploadsInput); i { case 0: return &v.state case 1: @@ -5514,7 +5719,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMultipartUploadsOutput); i { + switch v := v.(*Initiator); i { case 0: return &v.state case 1: @@ -5526,7 +5731,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListObjectVersionsInput); i { + switch v := v.(*MultipartUpload); i { case 0: return &v.state case 1: @@ -5538,7 +5743,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMarkerEntry); i { + switch v := v.(*ListMultipartUploadsOutput); i { case 0: return &v.state case 1: @@ -5550,7 +5755,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObjectVersion); i { + switch v := v.(*ListObjectVersionsInput); i { case 0: return &v.state case 1: @@ -5562,6 +5767,30 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteMarkerEntry); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ObjectVersion); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListObjectVersionsOutput); i { case 0: return &v.state @@ -5580,7 +5809,7 @@ func file_s3_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_s3_proto_rawDesc, NumEnums: 0, - NumMessages: 54, + NumMessages: 56, NumExtensions: 0, NumServices: 1, }, diff --git a/spec/proto/extension/v1/s3.proto b/spec/proto/extension/v1/s3.proto index c0d3e9801e..5fd6a63f77 100644 --- a/spec/proto/extension/v1/s3.proto +++ b/spec/proto/extension/v1/s3.proto @@ -88,7 +88,8 @@ message DeleteObjectOutput{ message PutBucketTaggingInput{ string bucket = 1; - map tags = 2; + string key = 2; + map tags = 3; } message PutBucketTaggingOutput{ @@ -120,10 +121,18 @@ message CopyObjectOutput{ } + +message Delete{ + repeated ObjectIdentifier objects = 1; + bool quiet = 2; +} +message ObjectIdentifier{ + string key = 1; + string version_id = 2; +} message DeleteObjectsInput{ - // The bucket name containing the objects from which to remove the tags. string bucket = 1; - repeated string objects = 2; + Delete Delete = 2; } message DeleteObjectsOutput{ @@ -131,6 +140,13 @@ message DeleteObjectsOutput{ message ListObjectsInput{ string bucket = 1; + string delimiter = 2; + string encoding_type = 3; + string expected_bucket_owner = 4; + string marker = 5; + int32 maxKeys = 6; + string prefix = 7; + string request_payer = 8; } message ListObjectsOutput{ repeated string common_prefixes = 1; @@ -139,7 +155,7 @@ message ListObjectsOutput{ string encoding_type = 4; bool is_truncated = 5; string marker = 6; - int64 max_keys = 7; + int32 max_keys = 7; string name = 8; string next_marker = 9; string prefix = 10; From 95adea1efe8c274beaeba27f22f267392f2366c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Fri, 27 May 2022 17:36:04 +0800 Subject: [PATCH 010/126] add implement for s3 --- components/file/aws/oss.go | 321 ++++- components/file/aws/oss_test.go | 10 +- components/file/s3def.go | 100 +- components/go.mod | 11 +- components/go.sum | 60 +- go.mod | 1 + go.sum | 86 +- pkg/grpc/extension/s3/s3.go | 12 +- spec/proto/extension/v1/s3.pb.go | 2004 ++++++++++++++++-------------- spec/proto/extension/v1/s3.proto | 228 ++-- 10 files changed, 1633 insertions(+), 1200 deletions(-) diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index 352e11e61c..4b9cca742b 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -21,7 +21,11 @@ import ( "encoding/json" "errors" "fmt" + "github.com/aws/aws-sdk-go-v2/aws" + 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" "google.golang.org/protobuf/types/known/timestamppb" "io" @@ -29,11 +33,6 @@ import ( "mosn.io/layotto/components/file/util" "strings" - "github.com/aws/aws-sdk-go-v2/aws" - 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/service/s3" - "mosn.io/layotto/components/file" ) @@ -498,7 +497,7 @@ func (a *AwsOss) CopyObject(ctx context.Context, req *file.CopyObjectInput) (*fi Key: &req.Key, CopySource: &req.CopySource, } - resp, err := client.CopyObject(ctx, input) + _, err = client.CopyObject(ctx, input) if err != nil { return nil, err } @@ -560,7 +559,6 @@ func (a *AwsOss) ListObjects(ctx context.Context, req *file.ListObjectsInput) (* return output, err } func (a *AwsOss) GetObjectAcl(ctx context.Context, req *file.GetObjectAclInput) (*file.GetObjectAclOutput, error) { - client, err := a.selectClient(map[string]string{}, endpointKey) if err != nil { return nil, err @@ -575,34 +573,303 @@ func (a *AwsOss) GetObjectAcl(ctx context.Context, req *file.GetObjectAclInput) } output := &file.GetObjectAclOutput{Owner: &file.Owner{}, RequestCharged: string(resp.RequestCharged)} for _, v := range resp.Grants { - + output.Grants = append(output.Grants, &file.Grant{Grantee: &file.Grantee{DisplayName: *v.Grantee.DisplayName, EmailAddress: *v.Grantee.DisplayName, + Id: *v.Grantee.ID, Type: v.Grantee.Type, Uri: *v.Grantee.URI, + }, Permission: string(v.Permission)}) } - return &file.DeleteObjectsOutput{}, err + return output, err } -func (a *AwsOss) PutObjectAcl(context.Context, *file.PutObjectAclInput) (*file.PutObjectAclOutput, error) { - return nil, nil +func (a *AwsOss) PutObjectAcl(ctx context.Context, req *file.PutObjectAclInput) (*file.PutObjectAclOutput, error) { + client, err := a.selectClient(map[string]string{}, endpointKey) + 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 &file.PutObjectAclOutput{RequestCharged: string(resp.RequestCharged)}, err } -func (a *AwsOss) RestoreObject(context.Context, *file.RestoreObjectInput) (*file.RestoreObjectOutput, error) { - return nil, nil +func (a *AwsOss) RestoreObject(ctx context.Context, req *file.RestoreObjectInput) (*file.RestoreObjectOutput, error) { + client, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + input := &s3.RestoreObjectInput{ + Bucket: &req.Bucket, + Key: &req.Key, + } + resp, err := client.RestoreObject(ctx, input) + if err != nil { + return nil, err + } + return &file.RestoreObjectOutput{RequestCharged: string(resp.RequestCharged), RestoreOutputPath: *resp.RestoreOutputPath}, err } -func (a *AwsOss) CreateMultipartUpload(context.Context, *file.CreateMultipartUploadInput) (*file.CreateMultipartUploadOutput, error) { - return nil, nil +func (a *AwsOss) CreateMultipartUpload(ctx context.Context, req *file.CreateMultipartUploadInput) (*file.CreateMultipartUploadOutput, error) { + client, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + input := &s3.CreateMultipartUploadInput{ + Bucket: &req.Bucket, + Key: &req.Key, + ACL: types.ObjectCannedACL(req.Acl), + BucketKeyEnabled: req.BucketKeyEnabled, + CacheControl: &req.CacheControl, + ContentDisposition: &req.ContentDisposition, + ContentEncoding: &req.ContentEncoding, + ContentLanguage: &req.ContentLanguage, + ContentType: &req.ContentType, + ExpectedBucketOwner: &req.ExpectedBucketOwner, + GrantFullControl: &req.GrantFullControl, + GrantRead: &req.GrantRead, + GrantReadACP: &req.GrantReadAcp, + GrantWriteACP: &req.GrantWriteAcp, + Metadata: req.MetaData, + ObjectLockLegalHoldStatus: types.ObjectLockLegalHoldStatus(req.ObjectLockLegalHoldStatus), + ObjectLockMode: types.ObjectLockMode(req.ObjectLockMode), + RequestPayer: types.RequestPayer(req.RequestPayer), + SSECustomerAlgorithm: &req.SseCustomerAlgorithm, + SSECustomerKey: &req.SseCustomerKey, + SSECustomerKeyMD5: &req.SseCustomerKeyMd5, + SSEKMSEncryptionContext: &req.SseKmsEncryptionContext, + SSEKMSKeyId: &req.SseKmsKeyId, + ServerSideEncryption: types.ServerSideEncryption(req.ServerSideEncryption), + StorageClass: types.StorageClass(req.StorageClass), + Tagging: &req.Tagging, + WebsiteRedirectLocation: &req.WebsiteRedirectLocation, + } + expire := req.Expires.AsTime() + input.Expires = &expire + + retain := req.ObjectLockRetainUntilDate.AsTime() + input.ObjectLockRetainUntilDate = &retain + resp, err := client.CreateMultipartUpload(ctx, input) + if err != nil { + return nil, err + } + output := &file.CreateMultipartUploadOutput{Bucket: *resp.Bucket, Key: *resp.Key, + AbortDate: ×tamppb.Timestamp{Seconds: int64(resp.AbortDate.Second()), Nanos: int32(resp.AbortDate.Nanosecond())}, + AbortRuleId: *resp.AbortRuleId, BucketKeyEnabled: resp.BucketKeyEnabled, RequestCharged: string(resp.RequestCharged), + SseCustomerAlgorithm: *resp.SSECustomerAlgorithm, SseCustomerKeyMd5: *resp.SSECustomerKeyMD5, SseKmsEncryptionContext: *resp.SSEKMSEncryptionContext, + SseKmsKeyId: *resp.SSEKMSKeyId, ServerSideEncryption: string(resp.ServerSideEncryption), UploadId: *resp.UploadId, + } + + return output, err } -func (a *AwsOss) UploadPart(context.Context, *file.UploadPartInput) (*file.UploadPartOutput, error) { - return nil, nil +func (a *AwsOss) UploadPart(ctx context.Context, req *file.UploadPartInput) (*file.UploadPartOutput, error) { + client, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + input := &s3.UploadPartInput{ + Body: req.DataStream, + Bucket: &req.Bucket, + Key: &req.Key, + ContentLength: req.ContentLength, + ContentMD5: &req.ContentMd5, + ExpectedBucketOwner: &req.ExpectedBucketOwner, + PartNumber: req.PartNumber, + RequestPayer: types.RequestPayer(req.RequestPayer), + SSECustomerAlgorithm: &req.SseCustomerAlgorithm, + SSECustomerKey: &req.SseCustomerKey, + SSECustomerKeyMD5: &req.SseCustomerKeyMd5, + UploadId: &req.UploadId, + } + resp, err := client.UploadPart(ctx, input) + if err != nil { + return nil, err + } + output := &file.UploadPartOutput{BucketKeyEnabled: resp.BucketKeyEnabled, Etag: *resp.ETag, RequestCharged: string(resp.RequestCharged), + SseCustomerAlgorithm: *resp.SSECustomerAlgorithm, SseCustomerKeyMd5: *resp.SSECustomerKeyMD5, SseKmsKeyId: *resp.SSECustomerKeyMD5, + ServerSideEncryption: string(resp.ServerSideEncryption), + } + return output, err } -func (a *AwsOss) UploadPartCopy(context.Context, *file.UploadPartCopyInput) (*file.UploadPartCopyOutput, error) { - return nil, nil +func (a *AwsOss) UploadPartCopy(ctx context.Context, req *file.UploadPartCopyInput) (*file.UploadPartCopyOutput, error) { + client, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + input := &s3.UploadPartCopyInput{ + Bucket: &req.Bucket, + Key: &req.Key, + CopySource: &req.CopySource, + PartNumber: req.PartNumber, + UploadId: &req.UploadId, + } + resp, err := client.UploadPartCopy(ctx, input) + if err != nil { + return nil, err + } + LastModified := ×tamppb.Timestamp{Seconds: int64(resp.CopyPartResult.LastModified.Second()), Nanos: int32(resp.CopyPartResult.LastModified.Nanosecond())} + output := &file.UploadPartCopyOutput{BucketKeyEnabled: resp.BucketKeyEnabled, RequestCharged: string(resp.RequestCharged), + CopyPartResult: &file.CopyPartResult{Etag: *resp.CopyPartResult.ETag, LastModified: LastModified}, + CopySourceVersionId: *resp.CopySourceVersionId, + SseCustomerAlgorithm: *resp.SSECustomerAlgorithm, SseCustomerKeyMd5: *resp.SSECustomerKeyMD5, SseKmsKeyId: *resp.SSECustomerKeyMD5, + ServerSideEncryption: string(resp.ServerSideEncryption), + } + return output, err } -func (a *AwsOss) CompleteMultipartUpload(context.Context, *file.CompleteMultipartUploadInput) (*file.CompleteMultipartUploadOutput, error) { - return nil, nil +func (a *AwsOss) CompleteMultipartUpload(ctx context.Context, req *file.CompleteMultipartUploadInput) (*file.CompleteMultipartUploadOutput, error) { + client, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + input := &s3.CompleteMultipartUploadInput{ + Bucket: &req.Bucket, + Key: &req.Key, + UploadId: &req.UploadId, + RequestPayer: types.RequestPayer(req.RequestPayer), + ExpectedBucketOwner: &req.ExpectedBucketOwner, + MultipartUpload: &types.CompletedMultipartUpload{}, + } + for _, v := range req.MultipartUpload.Parts { + input.MultipartUpload.Parts = append(input.MultipartUpload.Parts, types.CompletedPart{ETag: &v.Etag, PartNumber: v.PartNumber}) + } + resp, err := client.CompleteMultipartUpload(ctx, input) + if err != nil { + return nil, err + } + output := &file.CompleteMultipartUploadOutput{ + Bucket: *resp.Bucket, + Key: *resp.Key, + BucketKeyEnabled: resp.BucketKeyEnabled, + Etag: *resp.ETag, + Expiration: *resp.Expiration, + Location: *resp.Location, + RequestCharged: string(resp.RequestCharged), + SseKmsKeyId: *resp.SSEKMSKeyId, + ServerSideEncryption: string(resp.ServerSideEncryption), + VersionId: *resp.VersionId, + } + return output, err } -func (a *AwsOss) AbortMultipartUpload(context.Context, *file.AbortMultipartUploadInput) (*file.AbortMultipartUploadOutput, error) { - return nil, nil +func (a *AwsOss) AbortMultipartUpload(ctx context.Context, req *file.AbortMultipartUploadInput) (*file.AbortMultipartUploadOutput, error) { + client, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + input := &s3.AbortMultipartUploadInput{ + Bucket: &req.Bucket, + Key: &req.Key, + UploadId: &req.UploadId, + RequestPayer: types.RequestPayer(req.RequestPayer), + ExpectedBucketOwner: &req.ExpectedBucketOwner, + } + resp, err := client.AbortMultipartUpload(ctx, input) + if err != nil { + return nil, err + } + output := &file.AbortMultipartUploadOutput{ + RequestCharged: string(resp.RequestCharged), + } + return output, err } -func (a *AwsOss) ListMultipartUploads(context.Context, *file.ListMultipartUploadsInput) (*file.ListMultipartUploadsOutput, error) { - return nil, nil +func (a *AwsOss) ListMultipartUploads(ctx context.Context, req *file.ListMultipartUploadsInput) (*file.ListMultipartUploadsOutput, error) { + client, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + input := &s3.ListMultipartUploadsInput{ + Bucket: &req.Bucket, + ExpectedBucketOwner: &req.ExpectedBucketOwner, + } + resp, err := client.ListMultipartUploads(ctx, input) + if err != nil { + return nil, err + } + output := &file.ListMultipartUploadsOutput{ + Bucket: *resp.Bucket, + Delimiter: *resp.Delimiter, + EncodingType: string(resp.EncodingType), + IsTruncated: resp.IsTruncated, + KeyMarker: *resp.KeyMarker, + MaxUploads: resp.MaxUploads, + NextKeyMarker: *resp.NextKeyMarker, + NextUploadIdMarker: *resp.NextUploadIdMarker, + Prefix: *resp.Prefix, + UploadIdMarker: *resp.UploadIdMarker, + } + + for _, v := range resp.CommonPrefixes { + output.CommonPrefixes = append(output.CommonPrefixes, *v.Prefix) + } + for _, v := range resp.Uploads { + upload := &file.MultipartUpload{ + Initiated: timestamppb.New(*v.Initiated), + Initiator: &file.Initiator{DisplayName: *v.Initiator.DisplayName, Id: *v.Initiator.ID}, + Key: *v.Key, + Owner: &file.Owner{Id: *v.Owner.ID, DisplayName: *v.Owner.DisplayName}, + StorageClass: string(v.StorageClass), + UploadId: *v.UploadId, + } + output.Uploads = append(output.Uploads, upload) + } + return output, err } -func (a *AwsOss) ListObjectVersions(context.Context, *file.ListObjectVersionsInput) (*file.ListObjectVersionsOutput, error) { - return nil, nil +func (a *AwsOss) ListObjectVersions(ctx context.Context, req *file.ListObjectVersionsInput) (*file.ListObjectVersionsOutput, error) { + client, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + input := &s3.ListObjectVersionsInput{ + Bucket: &req.Bucket, + Delimiter: &req.Delimiter, + EncodingType: types.EncodingType(req.EncodingType), + ExpectedBucketOwner: &req.ExpectedBucketOwner, + KeyMarker: &req.KeyMarker, + MaxKeys: req.MaxKeys, + Prefix: &req.Prefix, + VersionIdMarker: &req.VersionIdMarker, + } + resp, err := client.ListObjectVersions(ctx, input) + if err != nil { + return nil, err + } + output := &file.ListObjectVersionsOutput{ + Delimiter: *resp.Delimiter, + EncodingType: string(resp.EncodingType), + IsTruncated: resp.IsTruncated, + KeyMarker: *resp.KeyMarker, + MaxKeys: resp.MaxKeys, + Name: *resp.Name, + NextKeyMarker: *resp.NextKeyMarker, + NextVersionIdMarker: *resp.NextVersionIdMarker, + Prefix: *resp.Prefix, + VersionIdMarker: *resp.VersionIdMarker, + } + + for _, v := range resp.CommonPrefixes { + output.CommonPrefixes = append(output.CommonPrefixes, *v.Prefix) + } + for _, v := range resp.DeleteMarkers { + entry := &file.DeleteMarkerEntry{ + IsLatest: v.IsLatest, + Key: *v.Key, + LastModified: timestamppb.New(*v.LastModified), + Owner: &file.Owner{DisplayName: *v.Owner.DisplayName, Id: *v.Owner.ID}, + VersionId: *v.VersionId, + } + output.DeleteMarkers = append(output.DeleteMarkers, entry) + } + for _, v := range resp.Versions { + version := &file.ObjectVersion{ + Etag: *v.ETag, + IsLatest: v.IsLatest, + Key: *v.Key, + LastModified: timestamppb.New(*v.LastModified), + Owner: &file.Owner{DisplayName: *v.Owner.DisplayName, Id: *v.Owner.ID}, + Size: v.Size, + StorageClass: string(v.StorageClass), + VersionId: *v.VersionId, + } + output.Versions = append(output.Versions, version) + } + return output, err } diff --git a/components/file/aws/oss_test.go b/components/file/aws/oss_test.go index 77e3d8df3a..276371aa8f 100644 --- a/components/file/aws/oss_test.go +++ b/components/file/aws/oss_test.go @@ -53,22 +53,22 @@ func TestAwsOss_SelectClient(t *testing.T) { // not specify endpoint, select default client meta := map[string]string{} - _, err = oss.selectClient(meta) + _, err = oss.selectClient(meta, endpointKey) assert.Nil(t, err) // specify endpoint equal config meta["endpoint"] = "protocol://service-code.region-code.amazonaws.com" - client, _ := oss.selectClient(meta) + client, _ := oss.selectClient(meta, endpointKey) assert.NotNil(t, client) // specicy not exist endpoint, select default one meta["endpoint"] = "protocol://cn-northwest-1.region-code.amazonaws.com" - client, err = oss.selectClient(meta) + client, err = oss.selectClient(meta, endpointKey) assert.Nil(t, err) // new client with endpoint oss.client["protocol://cn-northwest-1.region-code.amazonaws.com"] = &s3.Client{} - client, _ = oss.selectClient(meta) + client, _ = oss.selectClient(meta, endpointKey) assert.NotNil(t, client) } @@ -100,7 +100,7 @@ func TestAwsOss_Put(t *testing.T) { } func TestAwsOss_Get(t *testing.T) { - oss := NewAwsOss() + oss := NewAwsFile() err := oss.Init(context.TODO(), &file.FileConfig{Metadata: []byte(cfg)}) assert.Equal(t, nil, err) diff --git a/components/file/s3def.go b/components/file/s3def.go index 4cc72094b7..39d1124dd2 100644 --- a/components/file/s3def.go +++ b/components/file/s3def.go @@ -223,35 +223,35 @@ type RestoreObjectOutput struct { } type CreateMultipartUploadInput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - Acl string `protobuf:"bytes,3,opt,name=acl,proto3" json:"acl,omitempty"` - BucketKeyEnabled bool `protobuf:"varint,4,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - CacheControl string `protobuf:"bytes,5,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` - ContentDisposition string `protobuf:"bytes,6,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` - ContentEncoding string `protobuf:"bytes,7,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` - ContentLanguage string `protobuf:"bytes,8,opt,name=content_language,json=contentLanguage,proto3" json:"content_language,omitempty"` - ContentType string `protobuf:"bytes,9,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,10,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - Expires string `protobuf:"bytes,11,opt,name=expires,proto3" json:"expires,omitempty"` - GrantFullControl string `protobuf:"bytes,12,opt,name=grant_full_control,json=grantFullControl,proto3" json:"grant_full_control,omitempty"` - GrantRead string `protobuf:"bytes,13,opt,name=grant_read,json=grantRead,proto3" json:"grant_read,omitempty"` - GrantReadAcp string `protobuf:"bytes,14,opt,name=grant_read_acp,json=grantReadAcp,proto3" json:"grant_read_acp,omitempty"` - GrantWriteAcp string `protobuf:"bytes,15,opt,name=grant_write_acp,json=grantWriteAcp,proto3" json:"grant_write_acp,omitempty"` - MetaData map[string]string `protobuf:"bytes,16,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"` - ObjectLockLegalHoldStatus string `protobuf:"bytes,17,opt,name=object_lock_legal_hold_status,json=objectLockLegalHoldStatus,proto3" json:"object_lock_legal_hold_status,omitempty"` - ObjectLockMode string `protobuf:"bytes,18,opt,name=object_lock_mode,json=objectLockMode,proto3" json:"object_lock_mode,omitempty"` - ObjectLockRetainUntilDate string `protobuf:"bytes,19,opt,name=object_lock_retain_until_date,json=objectLockRetainUntilDate,proto3" json:"object_lock_retain_until_date,omitempty"` - RequestPayer string `protobuf:"bytes,20,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - SseCustomerAlgorithm string `protobuf:"bytes,21,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - SseCustomerKey string `protobuf:"bytes,22,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` - SseCustomerKeyMd5 string `protobuf:"bytes,23,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - SseKmsEncryptionContext string `protobuf:"bytes,24,opt,name=sse_kms_encryption_context,json=sseKmsEncryptionContext,proto3" json:"sse_kms_encryption_context,omitempty"` - SseKmsKeyId string `protobuf:"bytes,25,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` - ServerSideEncryption string `protobuf:"bytes,26,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` - StorageClass string `protobuf:"bytes,27,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` - Tagging string `protobuf:"bytes,28,opt,name=tagging,proto3" json:"tagging,omitempty"` - WebsiteRedirectLocation string `protobuf:"bytes,29,opt,name=website_redirect_location,json=websiteRedirectLocation,proto3" json:"website_redirect_location,omitempty"` + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Acl string `protobuf:"bytes,3,opt,name=acl,proto3" json:"acl,omitempty"` + BucketKeyEnabled bool `protobuf:"varint,4,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + CacheControl string `protobuf:"bytes,5,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` + ContentDisposition string `protobuf:"bytes,6,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` + ContentEncoding string `protobuf:"bytes,7,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` + ContentLanguage string `protobuf:"bytes,8,opt,name=content_language,json=contentLanguage,proto3" json:"content_language,omitempty"` + ContentType string `protobuf:"bytes,9,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,10,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + Expires *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=expires,proto3" json:"expires,omitempty"` + GrantFullControl string `protobuf:"bytes,12,opt,name=grant_full_control,json=grantFullControl,proto3" json:"grant_full_control,omitempty"` + GrantRead string `protobuf:"bytes,13,opt,name=grant_read,json=grantRead,proto3" json:"grant_read,omitempty"` + GrantReadAcp string `protobuf:"bytes,14,opt,name=grant_read_acp,json=grantReadAcp,proto3" json:"grant_read_acp,omitempty"` + GrantWriteAcp string `protobuf:"bytes,15,opt,name=grant_write_acp,json=grantWriteAcp,proto3" json:"grant_write_acp,omitempty"` + MetaData map[string]string `protobuf:"bytes,16,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"` + ObjectLockLegalHoldStatus string `protobuf:"bytes,17,opt,name=object_lock_legal_hold_status,json=objectLockLegalHoldStatus,proto3" json:"object_lock_legal_hold_status,omitempty"` + ObjectLockMode string `protobuf:"bytes,18,opt,name=object_lock_mode,json=objectLockMode,proto3" json:"object_lock_mode,omitempty"` + ObjectLockRetainUntilDate *timestamppb.Timestamp `protobuf:"bytes,19,opt,name=object_lock_retain_until_date,json=objectLockRetainUntilDate,proto3" json:"object_lock_retain_until_date,omitempty"` + RequestPayer string `protobuf:"bytes,20,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + SseCustomerAlgorithm string `protobuf:"bytes,21,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SseCustomerKey string `protobuf:"bytes,22,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` + SseCustomerKeyMd5 string `protobuf:"bytes,23,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + SseKmsEncryptionContext string `protobuf:"bytes,24,opt,name=sse_kms_encryption_context,json=sseKmsEncryptionContext,proto3" json:"sse_kms_encryption_context,omitempty"` + SseKmsKeyId string `protobuf:"bytes,25,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` + ServerSideEncryption string `protobuf:"bytes,26,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` + StorageClass string `protobuf:"bytes,27,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` + Tagging string `protobuf:"bytes,28,opt,name=tagging,proto3" json:"tagging,omitempty"` + WebsiteRedirectLocation string `protobuf:"bytes,29,opt,name=website_redirect_location,json=websiteRedirectLocation,proto3" json:"website_redirect_location,omitempty"` } type CreateMultipartUploadOutput struct { Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` @@ -269,14 +269,14 @@ type CreateMultipartUploadOutput struct { } type UploadPartInput struct { - DataStream io.Reader - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - Body []byte `protobuf:"bytes,3,opt,name=body,proto3" json:"body,omitempty"` + DataStream io.Reader + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + //Body []byte `protobuf:"bytes,3,opt,name=body,proto3" json:"body,omitempty"` ContentLength int64 `protobuf:"varint,4,opt,name=content_length,json=contentLength,proto3" json:"content_length,omitempty"` ContentMd5 string `protobuf:"bytes,5,opt,name=content_md5,json=contentMd5,proto3" json:"content_md5,omitempty"` ExpectedBucketOwner string `protobuf:"bytes,6,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - PartNumber int64 `protobuf:"varint,7,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + PartNumber int32 `protobuf:"varint,7,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` RequestPayer string `protobuf:"bytes,8,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` SseCustomerAlgorithm string `protobuf:"bytes,9,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` SseCustomerKey string `protobuf:"bytes,10,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` @@ -297,7 +297,7 @@ type UploadPartCopyInput struct { Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` CopySource string `protobuf:"bytes,3,opt,name=copy_source,json=copySource,proto3" json:"copy_source,omitempty"` - PartNumber int64 `protobuf:"varint,4,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + PartNumber int32 `protobuf:"varint,4,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` UploadId string `protobuf:"bytes,5,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` } type UploadPartCopyOutput struct { @@ -328,7 +328,7 @@ type CompletedMultipartUpload struct { } type CompletedPart struct { Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` - PartNumber int64 `protobuf:"varint,2,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + PartNumber int32 `protobuf:"varint,2,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` } type CompleteMultipartUploadOutput struct { Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` @@ -365,18 +365,18 @@ type ListMultipartUploadsInput struct { UploadIdMarker string `protobuf:"bytes,8,opt,name=upload_id_marker,json=uploadIdMarker,proto3" json:"upload_id_marker,omitempty"` } type ListMultipartUploadsOutput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - CommonPrefixes []string `protobuf:"bytes,2,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` - Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` - EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` - IsTruncated bool `protobuf:"varint,5,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` - KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` - MaxUploads int64 `protobuf:"varint,7,opt,name=max_uploads,json=maxUploads,proto3" json:"max_uploads,omitempty"` - NextKeyMarker string `protobuf:"bytes,8,opt,name=next_key_marker,json=nextKeyMarker,proto3" json:"next_key_marker,omitempty"` - NextUploadIdMarker string `protobuf:"bytes,9,opt,name=next_upload_id_marker,json=nextUploadIdMarker,proto3" json:"next_upload_id_marker,omitempty"` - Prefix string `protobuf:"bytes,10,opt,name=prefix,proto3" json:"prefix,omitempty"` - UploadIdMarker string `protobuf:"bytes,11,opt,name=upload_id_marker,json=uploadIdMarker,proto3" json:"upload_id_marker,omitempty"` - Uploads *MultipartUpload `protobuf:"bytes,12,opt,name=uploads,proto3" json:"uploads,omitempty"` + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + CommonPrefixes []string `protobuf:"bytes,2,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` + Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` + EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + IsTruncated bool `protobuf:"varint,5,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` + KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` + MaxUploads int32 `protobuf:"varint,7,opt,name=max_uploads,json=maxUploads,proto3" json:"max_uploads,omitempty"` + NextKeyMarker string `protobuf:"bytes,8,opt,name=next_key_marker,json=nextKeyMarker,proto3" json:"next_key_marker,omitempty"` + NextUploadIdMarker string `protobuf:"bytes,9,opt,name=next_upload_id_marker,json=nextUploadIdMarker,proto3" json:"next_upload_id_marker,omitempty"` + Prefix string `protobuf:"bytes,10,opt,name=prefix,proto3" json:"prefix,omitempty"` + UploadIdMarker string `protobuf:"bytes,11,opt,name=upload_id_marker,json=uploadIdMarker,proto3" json:"upload_id_marker,omitempty"` + Uploads []*MultipartUpload `protobuf:"bytes,12,rep,name=uploads,proto3" json:"uploads,omitempty"` } type MultipartUpload struct { Initiated *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=Initiated,proto3" json:"Initiated,omitempty"` @@ -397,7 +397,7 @@ type ListObjectVersionsInput struct { EncodingType string `protobuf:"bytes,3,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` ExpectedBucketOwner string `protobuf:"bytes,4,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` KeyMarker string `protobuf:"bytes,5,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` - MaxKeys int64 `protobuf:"varint,6,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` + MaxKeys int32 `protobuf:"varint,6,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` Prefix string `protobuf:"bytes,7,opt,name=prefix,proto3" json:"prefix,omitempty"` VersionIdMarker string `protobuf:"bytes,8,opt,name=version_id_marker,json=versionIdMarker,proto3" json:"version_id_marker,omitempty"` } @@ -408,7 +408,7 @@ type ListObjectVersionsOutput struct { EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` IsTruncated bool `protobuf:"varint,5,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` - MaxKeys int64 `protobuf:"varint,7,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` + MaxKeys int32 `protobuf:"varint,7,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` Name string `protobuf:"bytes,8,opt,name=name,proto3" json:"name,omitempty"` NextKeyMarker string `protobuf:"bytes,9,opt,name=next_key_marker,json=nextKeyMarker,proto3" json:"next_key_marker,omitempty"` NextVersionIdMarker string `protobuf:"bytes,10,opt,name=next_version_id_marker,json=nextVersionIdMarker,proto3" json:"next_version_id_marker,omitempty"` diff --git a/components/go.mod b/components/go.mod index 6e5b599164..f3038e6af2 100644 --- a/components/go.mod +++ b/components/go.mod @@ -6,11 +6,11 @@ require ( github.com/alicebob/miniredis/v2 v2.16.0 github.com/aliyun/aliyun-oss-go-sdk v2.1.8+incompatible github.com/apache/dubbo-go-hessian2 v1.7.0 - github.com/aws/aws-sdk-go-v2 v1.16.3 - github.com/aws/aws-sdk-go-v2/config v1.15.4 - github.com/aws/aws-sdk-go-v2/credentials v1.12.0 - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.6 - github.com/aws/aws-sdk-go-v2/service/s3 v1.26.6 + github.com/aws/aws-sdk-go-v2 v1.16.4 + github.com/aws/aws-sdk-go-v2/config v1.15.9 + github.com/aws/aws-sdk-go-v2/credentials v1.12.4 + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.14 + github.com/aws/aws-sdk-go-v2/service/s3 v1.26.10 github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f // indirect github.com/go-redis/redis/v8 v8.8.0 github.com/go-zookeeper/zk v1.0.2 @@ -37,6 +37,7 @@ require ( golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5 // indirect google.golang.org/grpc v1.38.0 + google.golang.org/protobuf v1.26.0 mosn.io/api v0.0.0-20211217011300-b851d129be01 mosn.io/mosn v0.25.1-0.20211217125944-69b50c40af81 mosn.io/pkg v0.0.0-20211217101631-d914102d1baf diff --git a/components/go.sum b/components/go.sum index 93428f5f7f..15c8252fe6 100644 --- a/components/go.sum +++ b/components/go.sum @@ -89,40 +89,40 @@ github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6l github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/aws/aws-sdk-go-v2 v1.16.3 h1:0W1TSJ7O6OzwuEvIXAtJGvOeQ0SGAhcpxPN2/NK5EhM= -github.com/aws/aws-sdk-go-v2 v1.16.3/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= +github.com/aws/aws-sdk-go-v2 v1.16.4 h1:swQTEQUyJF/UkEA94/Ga55miiKFoXmm/Zd67XHgmjSg= +github.com/aws/aws-sdk-go-v2 v1.16.4/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1 h1:SdK4Ppk5IzLs64ZMvr6MrSficMtjY2oS0WOORXTlxwU= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= -github.com/aws/aws-sdk-go-v2/config v1.15.4 h1:P4mesY1hYUxru4f9SU0XxNKXmzfxsD0FtMIPRBjkH7Q= -github.com/aws/aws-sdk-go-v2/config v1.15.4/go.mod h1:ZijHHh0xd/A+ZY53az0qzC5tT46kt4JVCePf2NX9Lk4= -github.com/aws/aws-sdk-go-v2/credentials v1.12.0 h1:4R/NqlcRFSkR0wxOhgHi+agGpbEr5qMCjn7VqUIJY+E= -github.com/aws/aws-sdk-go-v2/credentials v1.12.0/go.mod h1:9YWk7VW+eyKsoIL6/CljkTrNVWBSK9pkqOPUuijid4A= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.4 h1:FP8gquGeGHHdfY6G5llaMQDF+HAf20VKc8opRwmjf04= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.4/go.mod h1:u/s5/Z+ohUQOPXl00m2yJVyioWDECsbpXTQlaqSlufc= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.6 h1:6Q/ITRl/PoOAcbLkT3EOpch/6w9n/YNN6a/v+dfuBY8= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.6/go.mod h1:sj1vB2ZjQ1PQOWc89SyhEJs838UIpDcsa3HylyczQO0= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.10 h1:uFWgo6mGJI1n17nbcvSc6fxVuR3xLNqvXt12JCnEcT8= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.10/go.mod h1:F+EZtuIwjlv35kRJPyBGcsA4f7bnSoz15zOQ2lJq1Z4= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.4 h1:cnsvEKSoHN4oAN7spMMr0zhEW2MHnhAVpmqQg8E6UcM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.4/go.mod h1:8glyUqVIM4AmeenIsPo0oVh3+NUwnsQml2OFupfQW+0= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.11 h1:6cZRymlLEIlDTEB0+5+An6Zj1CKt6rSE69tOmFeu1nk= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.11/go.mod h1:0MR+sS1b/yxsfAPvAESrw8NfwUoxMinDyw6EYR9BS2U= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.1 h1:C21IDZCm9Yu5xqjb3fKmxDoYvJXtw1DNlOmLZEIlY1M= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.1/go.mod h1:l/BbcfqDCT3hePawhy4ZRtewjtdkl6GWtd9/U+1penQ= +github.com/aws/aws-sdk-go-v2/config v1.15.9 h1:TK5yNEnFDQ9iaO04gJS/3Y+eW8BioQiCUafW75/Wc3Q= +github.com/aws/aws-sdk-go-v2/config v1.15.9/go.mod h1:rv/l/TbZo67kp99v/3Kb0qV6Fm1KEtKyruEV2GvVfgs= +github.com/aws/aws-sdk-go-v2/credentials v1.12.4 h1:xggwS+qxCukXRVXJBJWQJGyUsvuxGC8+J1kKzv2cxuw= +github.com/aws/aws-sdk-go-v2/credentials v1.12.4/go.mod h1:7g+GGSp7xtR823o1jedxKmqRZGqLdoHQfI4eFasKKxs= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.5 h1:YPxclBeE07HsLQE8vtjC8T2emcTjM9nzqsnDi2fv5UM= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.5/go.mod h1:WAPnuhG5IQ/i6DETFl5NmX3kKqCzw7aau9NHAGcm4QE= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.14 h1:qpJmFbypCfwPok5PGTSnQy1NKbv4Hn8xGsee9l4xOPE= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.14/go.mod h1:IOYB+xOZik8YgdTlnDSwbvKmCkikA3nVue8/Qnfzs0c= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.11 h1:gsqHplNh1DaQunEKZISK56wlpbCg0yKxNVvGWCFuF1k= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.11/go.mod h1:tmUB6jakq5DFNcXsXOA/ZQ7/C8VnSKYkx58OI7Fh79g= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.5 h1:PLFj+M2PgIDHG//hw3T0O0KLI4itVtAjtxrZx4AHPLg= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.5/go.mod h1:fV1AaS2gFc1tM0RCb015FJ0pvWVUfJZANzjwoO4YakM= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.12 h1:j0VqrjtgsY1Bx27tD0ysay36/K4kFMWRp9K3ieO9nLU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.12/go.mod h1:00c7+ALdPh4YeEUPXJzyU0Yy01nPGOq2+9rUaz05z9g= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.2 h1:1fs9WkbFcMawQjxEI0B5L0SqvBhJZebxWM6Z3x/qHWY= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.2/go.mod h1:0jDVeWUFPbI3sOfsXXAsIdiawXcn7VBLx/IlFVTRP64= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1 h1:T4pFel53bkHjL2mMo+4DKE6r6AuoZnM0fg7k1/ratr4= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.4 h1:HXy33+dHXT6WYvnAtIvcQ7Zh4ppeAccz8ofi5bzsQ/A= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.4/go.mod h1:S8TVP66AAkMMdYYCNZGvrdEq9YRm+qLXjio4FqRnrEE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.4 h1:b16QW0XWl0jWjLABFc1A+uh145Oqv+xDcObNk0iQgUk= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.4/go.mod h1:uKkN7qmSIsNJVyMtxNQoCEYMvFEXbOg9fwCJPdfp2u8= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.4 h1:RE/DlZLYrz1OOmq8F28IXHLksuuvlpzUbvJ+SESCZBI= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.4/go.mod h1:oudbsSdDtazNj47z1ut1n37re9hDsKpk2ZI3v7KSxq0= -github.com/aws/aws-sdk-go-v2/service/s3 v1.26.6 h1:RyI53C9+8xxZ3zrllJwzZjI6/FePzxNv3pvh59Ir0aE= -github.com/aws/aws-sdk-go-v2/service/s3 v1.26.6/go.mod h1:FMXuMpmEOLQUDnQLMjsJ2jJGN7jpji1pQ59Kii+IM4U= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.4 h1:Uw5wBybFQ1UeA9ts0Y07gbv0ncZnIAyw858tDW0NP2o= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.4/go.mod h1:cPDwJwsP4Kff9mldCXAmddjJL6JGQqtA3Mzer2zyr88= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.4 h1:+xtV90n3abQmgzk1pS++FdxZTrPEDgQng6e4/56WR2A= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.4/go.mod h1:lfSYenAXtavyX2A1LsViglqlG9eEFYxNryTZS5rn3QE= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.6 h1:9mvDAsMiN+07wcfGM+hJ1J3dOKZ2YOpDiPZ6ufRJcgw= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.6/go.mod h1:Eus+Z2iBIEfhOvhSdMTcscNOMy6n3X9/BJV0Zgax98w= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.5 h1:gRW1ZisKc93EWEORNJRvy/ZydF3o6xLSveJHdi1Oa0U= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.5/go.mod h1:ZbkttHXaVn3bBo/wpJbQGiiIWR90eTBUVBrEHUEQlho= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.5 h1:DyPYkrH4R2zn+Pdu6hM3VTuPsQYAE6x2WB24X85Sgw0= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.5/go.mod h1:XtL92YWo0Yq80iN3AgYRERJqohg4TozrqRlxYhHGJ7g= +github.com/aws/aws-sdk-go-v2/service/s3 v1.26.10 h1:GWdLZK0r1AK5sKb8rhB9bEXqXCK8WNuyv4TBAD6ZviQ= +github.com/aws/aws-sdk-go-v2/service/s3 v1.26.10/go.mod h1:+O7qJxF8nLorAhuIVhYTHse6okjHJJm4EwhhzvpnkT0= +github.com/aws/aws-sdk-go-v2/service/sso v1.11.7 h1:suAGD+RyiHWPPihZzY+jw4mCZlOFWgmdjb2AeTenz7c= +github.com/aws/aws-sdk-go-v2/service/sso v1.11.7/go.mod h1:TFVe6Rr2joVLsYQ1ABACXgOC6lXip/qpX2x5jWg/A9w= +github.com/aws/aws-sdk-go-v2/service/sts v1.16.6 h1:aYToU0/iazkMY67/BYLt3r6/LT/mUtarLAF5mGof1Kg= +github.com/aws/aws-sdk-go-v2/service/sts v1.16.6/go.mod h1:rP1rEOKAGZoXp4iGDxSXFvODAtXpm34Egf0lL0eshaQ= github.com/aws/smithy-go v1.11.2 h1:eG/N+CcUMAvsdffgMvjMKwfyDzIkjM6pfxMJ8Mzc6mE= github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f h1:ZNv7On9kyUzm7fvRZumSyy/IUiSC7AzL0I1jKKtwooA= diff --git a/go.mod b/go.mod index c341efb839..f5dd354813 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( github.com/SkyAPM/go2sky v0.5.0 github.com/agrea/ptr v0.0.0-20180711073057-77a518d99b7b github.com/alicebob/miniredis/v2 v2.16.0 + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.14 // indirect github.com/dapr/components-contrib v1.5.1-rc.1 github.com/dapr/kit v0.0.2-0.20210614175626-b9074b64d233 github.com/dimchansky/utfbom v1.1.1 // indirect diff --git a/go.sum b/go.sum index 293f480a4b..a44439881c 100644 --- a/go.sum +++ b/go.sum @@ -219,64 +219,40 @@ github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/ github.com/aws/aws-sdk-go v1.36.30 h1:hAwyfe7eZa7sM+S5mIJZFiNFwJMia9Whz6CYblioLoU= github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/aws/aws-sdk-go-v2 v1.9.1 h1:ZbovGV/qo40nrOJ4q8G33AGICzaPI45FHQWJ9650pF4= -github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= -github.com/aws/aws-sdk-go-v2 v1.16.3 h1:0W1TSJ7O6OzwuEvIXAtJGvOeQ0SGAhcpxPN2/NK5EhM= -github.com/aws/aws-sdk-go-v2 v1.16.3/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= +github.com/aws/aws-sdk-go-v2 v1.16.4 h1:swQTEQUyJF/UkEA94/Ga55miiKFoXmm/Zd67XHgmjSg= +github.com/aws/aws-sdk-go-v2 v1.16.4/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1 h1:SdK4Ppk5IzLs64ZMvr6MrSficMtjY2oS0WOORXTlxwU= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= -github.com/aws/aws-sdk-go-v2/config v1.8.2 h1:Dqy4ySXFmulRmZhfynm/5CD4Y6aXiTVhDtXLIuUe/r0= -github.com/aws/aws-sdk-go-v2/config v1.8.2/go.mod h1:r0bkX9NyuCuf28qVcsEMtpAQibT7gA1Q0gzkjvgJdLU= -github.com/aws/aws-sdk-go-v2/config v1.15.4 h1:P4mesY1hYUxru4f9SU0XxNKXmzfxsD0FtMIPRBjkH7Q= -github.com/aws/aws-sdk-go-v2/config v1.15.4/go.mod h1:ZijHHh0xd/A+ZY53az0qzC5tT46kt4JVCePf2NX9Lk4= -github.com/aws/aws-sdk-go-v2/credentials v1.4.2 h1:8kVE4Og6wlhVrMGiORQ3p9gRj2exjzhFRB+QzWBUa5Q= -github.com/aws/aws-sdk-go-v2/credentials v1.4.2/go.mod h1:9Sp6u121/f0NnvHyhG7dgoYeUTEFC2vsvJqJ6wXpkaI= -github.com/aws/aws-sdk-go-v2/credentials v1.12.0 h1:4R/NqlcRFSkR0wxOhgHi+agGpbEr5qMCjn7VqUIJY+E= -github.com/aws/aws-sdk-go-v2/credentials v1.12.0/go.mod h1:9YWk7VW+eyKsoIL6/CljkTrNVWBSK9pkqOPUuijid4A= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.5.1 h1:Nm+BxqBtT0r+AnD6byGMCGT4Km0QwHBy8mAYptNPXY4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.5.1/go.mod h1:W1ldHfsgeGlKpJ4xZMKZUI6Wmp6EAstU7PxnhbXWWrI= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.4 h1:FP8gquGeGHHdfY6G5llaMQDF+HAf20VKc8opRwmjf04= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.4/go.mod h1:u/s5/Z+ohUQOPXl00m2yJVyioWDECsbpXTQlaqSlufc= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.6 h1:6Q/ITRl/PoOAcbLkT3EOpch/6w9n/YNN6a/v+dfuBY8= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.6/go.mod h1:sj1vB2ZjQ1PQOWc89SyhEJs838UIpDcsa3HylyczQO0= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.10 h1:uFWgo6mGJI1n17nbcvSc6fxVuR3xLNqvXt12JCnEcT8= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.10/go.mod h1:F+EZtuIwjlv35kRJPyBGcsA4f7bnSoz15zOQ2lJq1Z4= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.4 h1:cnsvEKSoHN4oAN7spMMr0zhEW2MHnhAVpmqQg8E6UcM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.4/go.mod h1:8glyUqVIM4AmeenIsPo0oVh3+NUwnsQml2OFupfQW+0= -github.com/aws/aws-sdk-go-v2/internal/ini v1.2.3 h1:NnXJXUz7oihrSlPKEM0yZ19b+7GQ47MX/LluLlEyE/Y= -github.com/aws/aws-sdk-go-v2/internal/ini v1.2.3/go.mod h1:EES9ToeC3h063zCFDdqWGnARExNdULPaBvARm1FLwxA= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.11 h1:6cZRymlLEIlDTEB0+5+An6Zj1CKt6rSE69tOmFeu1nk= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.11/go.mod h1:0MR+sS1b/yxsfAPvAESrw8NfwUoxMinDyw6EYR9BS2U= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.1 h1:C21IDZCm9Yu5xqjb3fKmxDoYvJXtw1DNlOmLZEIlY1M= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.1/go.mod h1:l/BbcfqDCT3hePawhy4ZRtewjtdkl6GWtd9/U+1penQ= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.3.0 h1:gceOysEWNNwLd6cki65IMBZ4WAM0MwgBQq2n7kejoT8= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.3.0/go.mod h1:v8ygadNyATSm6elwJ/4gzJwcFhri9RqS8skgHKiwXPU= +github.com/aws/aws-sdk-go-v2/config v1.15.9 h1:TK5yNEnFDQ9iaO04gJS/3Y+eW8BioQiCUafW75/Wc3Q= +github.com/aws/aws-sdk-go-v2/config v1.15.9/go.mod h1:rv/l/TbZo67kp99v/3Kb0qV6Fm1KEtKyruEV2GvVfgs= +github.com/aws/aws-sdk-go-v2/credentials v1.12.4 h1:xggwS+qxCukXRVXJBJWQJGyUsvuxGC8+J1kKzv2cxuw= +github.com/aws/aws-sdk-go-v2/credentials v1.12.4/go.mod h1:7g+GGSp7xtR823o1jedxKmqRZGqLdoHQfI4eFasKKxs= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.5 h1:YPxclBeE07HsLQE8vtjC8T2emcTjM9nzqsnDi2fv5UM= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.5/go.mod h1:WAPnuhG5IQ/i6DETFl5NmX3kKqCzw7aau9NHAGcm4QE= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.14 h1:qpJmFbypCfwPok5PGTSnQy1NKbv4Hn8xGsee9l4xOPE= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.14/go.mod h1:IOYB+xOZik8YgdTlnDSwbvKmCkikA3nVue8/Qnfzs0c= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.11 h1:gsqHplNh1DaQunEKZISK56wlpbCg0yKxNVvGWCFuF1k= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.11/go.mod h1:tmUB6jakq5DFNcXsXOA/ZQ7/C8VnSKYkx58OI7Fh79g= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.5 h1:PLFj+M2PgIDHG//hw3T0O0KLI4itVtAjtxrZx4AHPLg= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.5/go.mod h1:fV1AaS2gFc1tM0RCb015FJ0pvWVUfJZANzjwoO4YakM= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.12 h1:j0VqrjtgsY1Bx27tD0ysay36/K4kFMWRp9K3ieO9nLU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.12/go.mod h1:00c7+ALdPh4YeEUPXJzyU0Yy01nPGOq2+9rUaz05z9g= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.2 h1:1fs9WkbFcMawQjxEI0B5L0SqvBhJZebxWM6Z3x/qHWY= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.2/go.mod h1:0jDVeWUFPbI3sOfsXXAsIdiawXcn7VBLx/IlFVTRP64= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1 h1:T4pFel53bkHjL2mMo+4DKE6r6AuoZnM0fg7k1/ratr4= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.4 h1:HXy33+dHXT6WYvnAtIvcQ7Zh4ppeAccz8ofi5bzsQ/A= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.4/go.mod h1:S8TVP66AAkMMdYYCNZGvrdEq9YRm+qLXjio4FqRnrEE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.1 h1:APEjhKZLFlNVLATnA/TJyA+w1r/xd5r5ACWBDZ9aIvc= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.1/go.mod h1:Ve+eJOx9UWaT/lMVebnFhDhO49fSLVedHoA82+Rqme0= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.4 h1:b16QW0XWl0jWjLABFc1A+uh145Oqv+xDcObNk0iQgUk= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.4/go.mod h1:uKkN7qmSIsNJVyMtxNQoCEYMvFEXbOg9fwCJPdfp2u8= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.7.1 h1:YEz2KMyqK2zyG3uOa0l2xBc/H6NUVJir8FhwHQHF3rc= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.7.1/go.mod h1:yg4EN/BKoc7+DLhNOxxdvoO3+iyW2FuynvaKqLcLDUM= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.4 h1:RE/DlZLYrz1OOmq8F28IXHLksuuvlpzUbvJ+SESCZBI= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.4/go.mod h1:oudbsSdDtazNj47z1ut1n37re9hDsKpk2ZI3v7KSxq0= -github.com/aws/aws-sdk-go-v2/service/s3 v1.16.0 h1:dt1JQFj/135ozwGIWeCM3aQ8N/kB3Xu3Uu4r9zuOIyc= -github.com/aws/aws-sdk-go-v2/service/s3 v1.16.0/go.mod h1:Tk23mCmfL3wb3tNIeMk/0diUZ0W4R6uZtjYKguMLW2s= -github.com/aws/aws-sdk-go-v2/service/s3 v1.26.6 h1:RyI53C9+8xxZ3zrllJwzZjI6/FePzxNv3pvh59Ir0aE= -github.com/aws/aws-sdk-go-v2/service/s3 v1.26.6/go.mod h1:FMXuMpmEOLQUDnQLMjsJ2jJGN7jpji1pQ59Kii+IM4U= -github.com/aws/aws-sdk-go-v2/service/sso v1.4.1 h1:RfgQyv3bFT2Js6XokcrNtTjQ6wAVBRpoCgTFsypihHA= -github.com/aws/aws-sdk-go-v2/service/sso v1.4.1/go.mod h1:ycPdbJZlM0BLhuBnd80WX9PucWPG88qps/2jl9HugXs= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.4 h1:Uw5wBybFQ1UeA9ts0Y07gbv0ncZnIAyw858tDW0NP2o= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.4/go.mod h1:cPDwJwsP4Kff9mldCXAmddjJL6JGQqtA3Mzer2zyr88= -github.com/aws/aws-sdk-go-v2/service/sts v1.7.1 h1:7ce9ugapSgBapwLhg7AJTqKW5U92VRX3vX65k2tsB+g= -github.com/aws/aws-sdk-go-v2/service/sts v1.7.1/go.mod h1:r1i8QwKPzwByXqZb3POQfBs7jozrdnHz8PVbsvyx73w= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.4 h1:+xtV90n3abQmgzk1pS++FdxZTrPEDgQng6e4/56WR2A= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.4/go.mod h1:lfSYenAXtavyX2A1LsViglqlG9eEFYxNryTZS5rn3QE= -github.com/aws/smithy-go v1.8.0 h1:AEwwwXQZtUwP5Mz506FeXXrKBe0jA8gVM+1gEcSRooc= -github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.6 h1:9mvDAsMiN+07wcfGM+hJ1J3dOKZ2YOpDiPZ6ufRJcgw= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.6/go.mod h1:Eus+Z2iBIEfhOvhSdMTcscNOMy6n3X9/BJV0Zgax98w= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.5 h1:gRW1ZisKc93EWEORNJRvy/ZydF3o6xLSveJHdi1Oa0U= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.5/go.mod h1:ZbkttHXaVn3bBo/wpJbQGiiIWR90eTBUVBrEHUEQlho= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.5 h1:DyPYkrH4R2zn+Pdu6hM3VTuPsQYAE6x2WB24X85Sgw0= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.5/go.mod h1:XtL92YWo0Yq80iN3AgYRERJqohg4TozrqRlxYhHGJ7g= +github.com/aws/aws-sdk-go-v2/service/s3 v1.26.10 h1:GWdLZK0r1AK5sKb8rhB9bEXqXCK8WNuyv4TBAD6ZviQ= +github.com/aws/aws-sdk-go-v2/service/s3 v1.26.10/go.mod h1:+O7qJxF8nLorAhuIVhYTHse6okjHJJm4EwhhzvpnkT0= +github.com/aws/aws-sdk-go-v2/service/sso v1.11.7 h1:suAGD+RyiHWPPihZzY+jw4mCZlOFWgmdjb2AeTenz7c= +github.com/aws/aws-sdk-go-v2/service/sso v1.11.7/go.mod h1:TFVe6Rr2joVLsYQ1ABACXgOC6lXip/qpX2x5jWg/A9w= +github.com/aws/aws-sdk-go-v2/service/sts v1.16.6 h1:aYToU0/iazkMY67/BYLt3r6/LT/mUtarLAF5mGof1Kg= +github.com/aws/aws-sdk-go-v2/service/sts v1.16.6/go.mod h1:rP1rEOKAGZoXp4iGDxSXFvODAtXpm34Egf0lL0eshaQ= github.com/aws/smithy-go v1.11.2 h1:eG/N+CcUMAvsdffgMvjMKwfyDzIkjM6pfxMJ8Mzc6mE= github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= @@ -677,8 +653,6 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go index 4085b1f8b6..75871b2cf2 100644 --- a/pkg/grpc/extension/s3/s3.go +++ b/pkg/grpc/extension/s3/s3.go @@ -45,11 +45,8 @@ var ( ) const ( - Provider = "provider" - Region = "region" - EndPoint = "endpoint" - AccessKeyID = "accessKeyID" - AccessKeySecret = "accessKeySecret" + Region = "region" + EndPoint = "endpoint" ) type S3Server struct { @@ -199,7 +196,10 @@ func (s *S3Server) PutObject(stream s3.S3_PutObjectServer) error { } } -func (s *S3Server) DeleteObject(context.Context, *s3.DeleteObjectInput) (*s3.DeleteObjectOutput, error) { +func (s *S3Server) DeleteObject(ctx context.Context, req *s3.DeleteObjectInput) (*s3.DeleteObjectOutput, error) { + if s.ossInstance[req.StoreName] == nil { + return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + } return nil, nil } diff --git a/spec/proto/extension/v1/s3.pb.go b/spec/proto/extension/v1/s3.pb.go index aa1cf0dc10..5c18ebd0c4 100644 --- a/spec/proto/extension/v1/s3.pb.go +++ b/spec/proto/extension/v1/s3.pb.go @@ -495,8 +495,9 @@ type DeleteObjectInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` } func (x *DeleteObjectInput) Reset() { @@ -531,6 +532,13 @@ func (*DeleteObjectInput) Descriptor() ([]byte, []int) { return file_s3_proto_rawDescGZIP(), []int{5} } +func (x *DeleteObjectInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + func (x *DeleteObjectInput) GetBucket() string { if x != nil { return x.Bucket @@ -613,9 +621,10 @@ type PutBucketTaggingInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - Tags map[string]string `protobuf:"bytes,3,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + Tags map[string]string `protobuf:"bytes,4,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 *PutBucketTaggingInput) Reset() { @@ -650,6 +659,13 @@ func (*PutBucketTaggingInput) Descriptor() ([]byte, []int) { return file_s3_proto_rawDescGZIP(), []int{7} } +func (x *PutBucketTaggingInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + func (x *PutBucketTaggingInput) GetBucket() string { if x != nil { return x.Bucket @@ -714,9 +730,9 @@ type DeleteObjectTaggingInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The bucket name containing the objects from which to remove the tags. - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` } func (x *DeleteObjectTaggingInput) Reset() { @@ -751,6 +767,13 @@ func (*DeleteObjectTaggingInput) Descriptor() ([]byte, []int) { return file_s3_proto_rawDescGZIP(), []int{9} } +func (x *DeleteObjectTaggingInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + func (x *DeleteObjectTaggingInput) GetBucket() string { if x != nil { return x.Bucket @@ -817,8 +840,9 @@ type GetObjectTaggingInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` } func (x *GetObjectTaggingInput) Reset() { @@ -853,6 +877,13 @@ func (*GetObjectTaggingInput) Descriptor() ([]byte, []int) { return file_s3_proto_rawDescGZIP(), []int{11} } +func (x *GetObjectTaggingInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + func (x *GetObjectTaggingInput) GetBucket() string { if x != nil { return x.Bucket @@ -919,9 +950,10 @@ type CopyObjectInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - CopySource string `protobuf:"bytes,3,opt,name=copy_source,json=copySource,proto3" json:"copy_source,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + CopySource string `protobuf:"bytes,4,opt,name=copy_source,json=copySource,proto3" json:"copy_source,omitempty"` } func (x *CopyObjectInput) Reset() { @@ -956,6 +988,13 @@ func (*CopyObjectInput) Descriptor() ([]byte, []int) { return file_s3_proto_rawDescGZIP(), []int{13} } +func (x *CopyObjectInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + func (x *CopyObjectInput) GetBucket() string { if x != nil { return x.Bucket @@ -1130,8 +1169,9 @@ type DeleteObjectsInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Delete *Delete `protobuf:"bytes,2,opt,name=Delete,proto3" json:"Delete,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Delete *Delete `protobuf:"bytes,3,opt,name=Delete,proto3" json:"Delete,omitempty"` } func (x *DeleteObjectsInput) Reset() { @@ -1166,6 +1206,13 @@ func (*DeleteObjectsInput) Descriptor() ([]byte, []int) { return file_s3_proto_rawDescGZIP(), []int{17} } +func (x *DeleteObjectsInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + func (x *DeleteObjectsInput) GetBucket() string { if x != nil { return x.Bucket @@ -1223,14 +1270,15 @@ type ListObjectsInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Delimiter string `protobuf:"bytes,2,opt,name=delimiter,proto3" json:"delimiter,omitempty"` - EncodingType string `protobuf:"bytes,3,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,4,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - Marker string `protobuf:"bytes,5,opt,name=marker,proto3" json:"marker,omitempty"` - MaxKeys int32 `protobuf:"varint,6,opt,name=maxKeys,proto3" json:"maxKeys,omitempty"` - Prefix string `protobuf:"bytes,7,opt,name=prefix,proto3" json:"prefix,omitempty"` - RequestPayer string `protobuf:"bytes,8,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` + EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + Marker string `protobuf:"bytes,6,opt,name=marker,proto3" json:"marker,omitempty"` + MaxKeys int32 `protobuf:"varint,7,opt,name=maxKeys,proto3" json:"maxKeys,omitempty"` + Prefix string `protobuf:"bytes,8,opt,name=prefix,proto3" json:"prefix,omitempty"` + RequestPayer string `protobuf:"bytes,9,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` } func (x *ListObjectsInput) Reset() { @@ -1265,6 +1313,13 @@ func (*ListObjectsInput) Descriptor() ([]byte, []int) { return file_s3_proto_rawDescGZIP(), []int{19} } +func (x *ListObjectsInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + func (x *ListObjectsInput) GetBucket() string { if x != nil { return x.Bucket @@ -1721,8 +1776,9 @@ type GetObjectAclInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` } func (x *GetObjectAclInput) Reset() { @@ -1757,6 +1813,13 @@ func (*GetObjectAclInput) Descriptor() ([]byte, []int) { return file_s3_proto_rawDescGZIP(), []int{25} } +func (x *GetObjectAclInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + func (x *GetObjectAclInput) GetBucket() string { if x != nil { return x.Bucket @@ -1839,9 +1902,10 @@ type PutObjectAclInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - Acl string `protobuf:"bytes,3,opt,name=acl,proto3" json:"acl,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + Acl string `protobuf:"bytes,4,opt,name=acl,proto3" json:"acl,omitempty"` } func (x *PutObjectAclInput) Reset() { @@ -1876,6 +1940,13 @@ func (*PutObjectAclInput) Descriptor() ([]byte, []int) { return file_s3_proto_rawDescGZIP(), []int{27} } +func (x *PutObjectAclInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + func (x *PutObjectAclInput) GetBucket() string { if x != nil { return x.Bucket @@ -1949,8 +2020,9 @@ type RestoreObjectInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` } func (x *RestoreObjectInput) Reset() { @@ -1985,6 +2057,13 @@ func (*RestoreObjectInput) Descriptor() ([]byte, []int) { return file_s3_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 @@ -2059,35 +2138,36 @@ type CreateMultipartUploadInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - Acl string `protobuf:"bytes,3,opt,name=acl,proto3" json:"acl,omitempty"` - BucketKeyEnabled bool `protobuf:"varint,4,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - CacheControl string `protobuf:"bytes,5,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` - ContentDisposition string `protobuf:"bytes,6,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` - ContentEncoding string `protobuf:"bytes,7,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` - ContentLanguage string `protobuf:"bytes,8,opt,name=content_language,json=contentLanguage,proto3" json:"content_language,omitempty"` - ContentType string `protobuf:"bytes,9,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,10,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - Expires string `protobuf:"bytes,11,opt,name=expires,proto3" json:"expires,omitempty"` - GrantFullControl string `protobuf:"bytes,12,opt,name=grant_full_control,json=grantFullControl,proto3" json:"grant_full_control,omitempty"` - GrantRead string `protobuf:"bytes,13,opt,name=grant_read,json=grantRead,proto3" json:"grant_read,omitempty"` - GrantReadAcp string `protobuf:"bytes,14,opt,name=grant_read_acp,json=grantReadAcp,proto3" json:"grant_read_acp,omitempty"` - GrantWriteAcp string `protobuf:"bytes,15,opt,name=grant_write_acp,json=grantWriteAcp,proto3" json:"grant_write_acp,omitempty"` - MetaData map[string]string `protobuf:"bytes,16,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"` - ObjectLockLegalHoldStatus string `protobuf:"bytes,17,opt,name=object_lock_legal_hold_status,json=objectLockLegalHoldStatus,proto3" json:"object_lock_legal_hold_status,omitempty"` - ObjectLockMode string `protobuf:"bytes,18,opt,name=object_lock_mode,json=objectLockMode,proto3" json:"object_lock_mode,omitempty"` - ObjectLockRetainUntilDate string `protobuf:"bytes,19,opt,name=object_lock_retain_until_date,json=objectLockRetainUntilDate,proto3" json:"object_lock_retain_until_date,omitempty"` - RequestPayer string `protobuf:"bytes,20,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - SseCustomerAlgorithm string `protobuf:"bytes,21,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - SseCustomerKey string `protobuf:"bytes,22,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` - SseCustomerKeyMd5 string `protobuf:"bytes,23,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - SseKmsEncryptionContext string `protobuf:"bytes,24,opt,name=sse_kms_encryption_context,json=sseKmsEncryptionContext,proto3" json:"sse_kms_encryption_context,omitempty"` - SseKmsKeyId string `protobuf:"bytes,25,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` - ServerSideEncryption string `protobuf:"bytes,26,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` - StorageClass string `protobuf:"bytes,27,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` - Tagging string `protobuf:"bytes,28,opt,name=tagging,proto3" json:"tagging,omitempty"` - WebsiteRedirectLocation string `protobuf:"bytes,29,opt,name=website_redirect_location,json=websiteRedirectLocation,proto3" json:"website_redirect_location,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + Acl string `protobuf:"bytes,4,opt,name=acl,proto3" json:"acl,omitempty"` + BucketKeyEnabled bool `protobuf:"varint,5,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + CacheControl string `protobuf:"bytes,6,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` + ContentDisposition string `protobuf:"bytes,7,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` + ContentEncoding string `protobuf:"bytes,8,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` + ContentLanguage string `protobuf:"bytes,9,opt,name=content_language,json=contentLanguage,proto3" json:"content_language,omitempty"` + ContentType string `protobuf:"bytes,10,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,11,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + Expires *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=expires,proto3" json:"expires,omitempty"` + GrantFullControl string `protobuf:"bytes,13,opt,name=grant_full_control,json=grantFullControl,proto3" json:"grant_full_control,omitempty"` + GrantRead string `protobuf:"bytes,14,opt,name=grant_read,json=grantRead,proto3" json:"grant_read,omitempty"` + GrantReadAcp string `protobuf:"bytes,15,opt,name=grant_read_acp,json=grantReadAcp,proto3" json:"grant_read_acp,omitempty"` + GrantWriteAcp string `protobuf:"bytes,16,opt,name=grant_write_acp,json=grantWriteAcp,proto3" json:"grant_write_acp,omitempty"` + 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"` + ObjectLockLegalHoldStatus string `protobuf:"bytes,18,opt,name=object_lock_legal_hold_status,json=objectLockLegalHoldStatus,proto3" json:"object_lock_legal_hold_status,omitempty"` + ObjectLockMode string `protobuf:"bytes,19,opt,name=object_lock_mode,json=objectLockMode,proto3" json:"object_lock_mode,omitempty"` + ObjectLockRetainUntilDate *timestamppb.Timestamp `protobuf:"bytes,20,opt,name=object_lock_retain_until_date,json=objectLockRetainUntilDate,proto3" json:"object_lock_retain_until_date,omitempty"` + RequestPayer string `protobuf:"bytes,21,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + SseCustomerAlgorithm string `protobuf:"bytes,22,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SseCustomerKey string `protobuf:"bytes,23,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` + SseCustomerKeyMd5 string `protobuf:"bytes,24,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + SseKmsEncryptionContext string `protobuf:"bytes,25,opt,name=sse_kms_encryption_context,json=sseKmsEncryptionContext,proto3" json:"sse_kms_encryption_context,omitempty"` + SseKmsKeyId string `protobuf:"bytes,26,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` + ServerSideEncryption string `protobuf:"bytes,27,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` + StorageClass string `protobuf:"bytes,28,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` + Tagging string `protobuf:"bytes,29,opt,name=tagging,proto3" json:"tagging,omitempty"` + WebsiteRedirectLocation string `protobuf:"bytes,30,opt,name=website_redirect_location,json=websiteRedirectLocation,proto3" json:"website_redirect_location,omitempty"` } func (x *CreateMultipartUploadInput) Reset() { @@ -2122,6 +2202,13 @@ func (*CreateMultipartUploadInput) Descriptor() ([]byte, []int) { return file_s3_proto_rawDescGZIP(), []int{31} } +func (x *CreateMultipartUploadInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + func (x *CreateMultipartUploadInput) GetBucket() string { if x != nil { return x.Bucket @@ -2192,11 +2279,11 @@ func (x *CreateMultipartUploadInput) GetExpectedBucketOwner() string { return "" } -func (x *CreateMultipartUploadInput) GetExpires() string { +func (x *CreateMultipartUploadInput) GetExpires() *timestamppb.Timestamp { if x != nil { return x.Expires } - return "" + return nil } func (x *CreateMultipartUploadInput) GetGrantFullControl() string { @@ -2248,11 +2335,11 @@ func (x *CreateMultipartUploadInput) GetObjectLockMode() string { return "" } -func (x *CreateMultipartUploadInput) GetObjectLockRetainUntilDate() string { +func (x *CreateMultipartUploadInput) GetObjectLockRetainUntilDate() *timestamppb.Timestamp { if x != nil { return x.ObjectLockRetainUntilDate } - return "" + return nil } func (x *CreateMultipartUploadInput) GetRequestPayer() string { @@ -2465,18 +2552,19 @@ type UploadPartInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - Body []byte `protobuf:"bytes,3,opt,name=body,proto3" json:"body,omitempty"` - ContentLength int64 `protobuf:"varint,4,opt,name=content_length,json=contentLength,proto3" json:"content_length,omitempty"` - ContentMd5 string `protobuf:"bytes,5,opt,name=content_md5,json=contentMd5,proto3" json:"content_md5,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,6,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - PartNumber int64 `protobuf:"varint,7,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` - RequestPayer string `protobuf:"bytes,8,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - SseCustomerAlgorithm string `protobuf:"bytes,9,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - SseCustomerKey string `protobuf:"bytes,10,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` - SseCustomerKeyMd5 string `protobuf:"bytes,11,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - UploadId string `protobuf:"bytes,12,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + Body []byte `protobuf:"bytes,4,opt,name=body,proto3" json:"body,omitempty"` + ContentLength int64 `protobuf:"varint,5,opt,name=content_length,json=contentLength,proto3" json:"content_length,omitempty"` + ContentMd5 string `protobuf:"bytes,6,opt,name=content_md5,json=contentMd5,proto3" json:"content_md5,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,7,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + PartNumber int32 `protobuf:"varint,8,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + RequestPayer string `protobuf:"bytes,9,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + SseCustomerAlgorithm string `protobuf:"bytes,10,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SseCustomerKey string `protobuf:"bytes,11,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` + SseCustomerKeyMd5 string `protobuf:"bytes,12,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + UploadId string `protobuf:"bytes,13,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` } func (x *UploadPartInput) Reset() { @@ -2511,6 +2599,13 @@ func (*UploadPartInput) Descriptor() ([]byte, []int) { return file_s3_proto_rawDescGZIP(), []int{33} } +func (x *UploadPartInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + func (x *UploadPartInput) GetBucket() string { if x != nil { return x.Bucket @@ -2553,7 +2648,7 @@ func (x *UploadPartInput) GetExpectedBucketOwner() string { return "" } -func (x *UploadPartInput) GetPartNumber() int64 { +func (x *UploadPartInput) GetPartNumber() int32 { if x != nil { return x.PartNumber } @@ -2695,11 +2790,12 @@ type UploadPartCopyInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - CopySource string `protobuf:"bytes,3,opt,name=copy_source,json=copySource,proto3" json:"copy_source,omitempty"` - PartNumber int64 `protobuf:"varint,4,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` - UploadId string `protobuf:"bytes,5,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + CopySource string `protobuf:"bytes,4,opt,name=copy_source,json=copySource,proto3" json:"copy_source,omitempty"` + PartNumber int32 `protobuf:"varint,5,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + UploadId string `protobuf:"bytes,6,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` } func (x *UploadPartCopyInput) Reset() { @@ -2734,6 +2830,13 @@ func (*UploadPartCopyInput) Descriptor() ([]byte, []int) { return file_s3_proto_rawDescGZIP(), []int{35} } +func (x *UploadPartCopyInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + func (x *UploadPartCopyInput) GetBucket() string { if x != nil { return x.Bucket @@ -2755,7 +2858,7 @@ func (x *UploadPartCopyInput) GetCopySource() string { return "" } -func (x *UploadPartCopyInput) GetPartNumber() int64 { +func (x *UploadPartCopyInput) GetPartNumber() int32 { if x != nil { return x.PartNumber } @@ -2933,7 +3036,7 @@ type CompletedPart struct { unknownFields protoimpl.UnknownFields Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` - PartNumber int64 `protobuf:"varint,2,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + PartNumber int32 `protobuf:"varint,2,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` } func (x *CompletedPart) Reset() { @@ -2975,7 +3078,7 @@ func (x *CompletedPart) GetEtag() string { return "" } -func (x *CompletedPart) GetPartNumber() int64 { +func (x *CompletedPart) GetPartNumber() int32 { if x != nil { return x.PartNumber } @@ -3034,12 +3137,13 @@ type CompleteMultipartUploadInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - UploadId string `protobuf:"bytes,3,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` - RequestPayer string `protobuf:"bytes,4,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - MultipartUpload *CompletedMultipartUpload `protobuf:"bytes,6,opt,name=multipart_upload,json=multipartUpload,proto3" json:"multipart_upload,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + UploadId string `protobuf:"bytes,4,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + RequestPayer string `protobuf:"bytes,5,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,6,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + MultipartUpload *CompletedMultipartUpload `protobuf:"bytes,7,opt,name=multipart_upload,json=multipartUpload,proto3" json:"multipart_upload,omitempty"` } func (x *CompleteMultipartUploadInput) Reset() { @@ -3074,6 +3178,13 @@ func (*CompleteMultipartUploadInput) Descriptor() ([]byte, []int) { return file_s3_proto_rawDescGZIP(), []int{40} } +func (x *CompleteMultipartUploadInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + func (x *CompleteMultipartUploadInput) GetBucket() string { if x != nil { return x.Bucket @@ -3240,11 +3351,12 @@ type AbortMultipartUploadInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,3,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - RequestPayer string `protobuf:"bytes,4,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - UploadId string `protobuf:"bytes,5,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,4,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + RequestPayer string `protobuf:"bytes,5,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + UploadId string `protobuf:"bytes,6,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` } func (x *AbortMultipartUploadInput) Reset() { @@ -3279,6 +3391,13 @@ func (*AbortMultipartUploadInput) Descriptor() ([]byte, []int) { return file_s3_proto_rawDescGZIP(), []int{42} } +func (x *AbortMultipartUploadInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + func (x *AbortMultipartUploadInput) GetBucket() string { if x != nil { return x.Bucket @@ -3366,14 +3485,15 @@ type ListMultipartUploadsInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Delimiter string `protobuf:"bytes,2,opt,name=delimiter,proto3" json:"delimiter,omitempty"` - EncodingType string `protobuf:"bytes,3,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,4,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - KeyMarker string `protobuf:"bytes,5,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` - MaxUploads int64 `protobuf:"varint,6,opt,name=max_uploads,json=maxUploads,proto3" json:"max_uploads,omitempty"` - Prefix string `protobuf:"bytes,7,opt,name=prefix,proto3" json:"prefix,omitempty"` - UploadIdMarker string `protobuf:"bytes,8,opt,name=upload_id_marker,json=uploadIdMarker,proto3" json:"upload_id_marker,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` + EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` + MaxUploads int64 `protobuf:"varint,7,opt,name=max_uploads,json=maxUploads,proto3" json:"max_uploads,omitempty"` + Prefix string `protobuf:"bytes,8,opt,name=prefix,proto3" json:"prefix,omitempty"` + UploadIdMarker string `protobuf:"bytes,9,opt,name=upload_id_marker,json=uploadIdMarker,proto3" json:"upload_id_marker,omitempty"` } func (x *ListMultipartUploadsInput) Reset() { @@ -3408,6 +3528,13 @@ func (*ListMultipartUploadsInput) Descriptor() ([]byte, []int) { return file_s3_proto_rawDescGZIP(), []int{44} } +func (x *ListMultipartUploadsInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + func (x *ListMultipartUploadsInput) GetBucket() string { if x != nil { return x.Bucket @@ -3611,18 +3738,18 @@ type ListMultipartUploadsOutput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - CommonPrefixes []string `protobuf:"bytes,2,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` - Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` - EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` - IsTruncated bool `protobuf:"varint,5,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` - KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` - MaxUploads int64 `protobuf:"varint,7,opt,name=max_uploads,json=maxUploads,proto3" json:"max_uploads,omitempty"` - NextKeyMarker string `protobuf:"bytes,8,opt,name=next_key_marker,json=nextKeyMarker,proto3" json:"next_key_marker,omitempty"` - NextUploadIdMarker string `protobuf:"bytes,9,opt,name=next_upload_id_marker,json=nextUploadIdMarker,proto3" json:"next_upload_id_marker,omitempty"` - Prefix string `protobuf:"bytes,10,opt,name=prefix,proto3" json:"prefix,omitempty"` - UploadIdMarker string `protobuf:"bytes,11,opt,name=upload_id_marker,json=uploadIdMarker,proto3" json:"upload_id_marker,omitempty"` - Uploads *MultipartUpload `protobuf:"bytes,12,opt,name=uploads,proto3" json:"uploads,omitempty"` + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + CommonPrefixes []string `protobuf:"bytes,2,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` + Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` + EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + IsTruncated bool `protobuf:"varint,5,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` + KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` + MaxUploads int32 `protobuf:"varint,7,opt,name=max_uploads,json=maxUploads,proto3" json:"max_uploads,omitempty"` + NextKeyMarker string `protobuf:"bytes,8,opt,name=next_key_marker,json=nextKeyMarker,proto3" json:"next_key_marker,omitempty"` + NextUploadIdMarker string `protobuf:"bytes,9,opt,name=next_upload_id_marker,json=nextUploadIdMarker,proto3" json:"next_upload_id_marker,omitempty"` + Prefix string `protobuf:"bytes,10,opt,name=prefix,proto3" json:"prefix,omitempty"` + UploadIdMarker string `protobuf:"bytes,11,opt,name=upload_id_marker,json=uploadIdMarker,proto3" json:"upload_id_marker,omitempty"` + Uploads []*MultipartUpload `protobuf:"bytes,12,rep,name=uploads,proto3" json:"uploads,omitempty"` } func (x *ListMultipartUploadsOutput) Reset() { @@ -3699,7 +3826,7 @@ func (x *ListMultipartUploadsOutput) GetKeyMarker() string { return "" } -func (x *ListMultipartUploadsOutput) GetMaxUploads() int64 { +func (x *ListMultipartUploadsOutput) GetMaxUploads() int32 { if x != nil { return x.MaxUploads } @@ -3734,7 +3861,7 @@ func (x *ListMultipartUploadsOutput) GetUploadIdMarker() string { return "" } -func (x *ListMultipartUploadsOutput) GetUploads() *MultipartUpload { +func (x *ListMultipartUploadsOutput) GetUploads() []*MultipartUpload { if x != nil { return x.Uploads } @@ -3746,14 +3873,15 @@ type ListObjectVersionsInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Delimiter string `protobuf:"bytes,2,opt,name=delimiter,proto3" json:"delimiter,omitempty"` - EncodingType string `protobuf:"bytes,3,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,4,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - KeyMarker string `protobuf:"bytes,5,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` - MaxKeys int64 `protobuf:"varint,6,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` - Prefix string `protobuf:"bytes,7,opt,name=prefix,proto3" json:"prefix,omitempty"` - VersionIdMarker string `protobuf:"bytes,8,opt,name=version_id_marker,json=versionIdMarker,proto3" json:"version_id_marker,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` + EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` + MaxKeys int64 `protobuf:"varint,7,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` + Prefix string `protobuf:"bytes,8,opt,name=prefix,proto3" json:"prefix,omitempty"` + VersionIdMarker string `protobuf:"bytes,9,opt,name=version_id_marker,json=versionIdMarker,proto3" json:"version_id_marker,omitempty"` } func (x *ListObjectVersionsInput) Reset() { @@ -3788,6 +3916,13 @@ func (*ListObjectVersionsInput) Descriptor() ([]byte, []int) { return file_s3_proto_rawDescGZIP(), []int{48} } +func (x *ListObjectVersionsInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + func (x *ListObjectVersionsInput) GetBucket() string { if x != nil { return x.Bucket @@ -4267,557 +4402,139 @@ var file_s3_proto_rawDesc = []byte{ 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, - 0x22, 0x3d, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x49, 0x6e, 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, 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, 0xc6, 0x01, 0x0a, 0x15, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 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, 0x4a, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, - 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 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, 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, 0x18, 0x0a, 0x16, - 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x44, 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, 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, 0x22, 0x3a, 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, 0x22, 0x41, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 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, 0x22, 0x9e, 0x01, 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, 0x4b, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x22, 0x5c, 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, 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, 0xe5, 0x01, 0x0a, 0x15, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 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, 0x4a, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, + 0x75, 0x63, 0x6b, 0x65, 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, 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, 0x18, 0x0a, 0x16, 0x50, 0x75, + 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x22, 0x63, 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, 0x22, 0x3a, 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, 0x22, 0x60, 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, 0x22, 0x9e, 0x01, 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, 0x4b, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x37, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 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, 0x7b, 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, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x70, 0x79, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x61, 0x0a, 0x06, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x12, 0x41, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5c, 0x0a, 0x0f, - 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 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, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x70, - 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x43, 0x6f, - 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x61, - 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x41, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 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, 0x63, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 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, 0x35, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x22, 0x90, 0x02, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x49, 0x6e, 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, - 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x02, 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, 0x03, - 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, 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, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x07, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, - 0x69, 0x78, 0x18, 0x07, 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, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x50, 0x61, 0x79, 0x65, 0x72, 0x22, 0xdd, 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, 0x39, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xdc, 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, 0x3f, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, - 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, - 0x69, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x87, 0x01, 0x0a, 0x07, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 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, - 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x22, 0x61, 0x0a, 0x05, 0x47, 0x72, - 0x61, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, - 0x6e, 0x74, 0x65, 0x65, 0x52, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x12, 0x1e, 0x0a, - 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x0a, - 0x11, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, 0x6e, 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, 0x22, 0xa7, 0x01, 0x0a, - 0x12, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x12, 0x34, 0x0a, 0x06, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x6e, - 0x74, 0x52, 0x06, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, - 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 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, 0x4f, 0x0a, 0x11, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, 0x6e, 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, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x22, 0x3d, 0x0a, 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 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, 0x3e, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 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, 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, 0xd0, 0x0a, 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, 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, - 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x03, 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, 0x04, 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, 0x05, 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, 0x06, 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, 0x07, 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, 0x08, 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, 0x09, 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, 0x0a, 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, 0x0b, 0x20, - 0x01, 0x28, 0x09, 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, 0x0c, 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, 0x0d, 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, 0x0e, 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, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x57, - 0x72, 0x69, 0x74, 0x65, 0x41, 0x63, 0x70, 0x12, 0x5c, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 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, 0x11, 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, 0x12, 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, 0x13, 0x20, 0x01, 0x28, 0x09, 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, 0x14, 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, 0x15, 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, 0x16, 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, 0x17, 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, 0x18, 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, 0x19, 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, 0x1a, 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, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, - 0x67, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 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, 0x1d, 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, 0x99, 0x04, 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, 0x39, 0x0a, 0x0a, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x09, 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, 0xbf, 0x03, 0x0a, 0x0f, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x61, 0x72, 0x74, 0x49, 0x6e, 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, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 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, 0x04, 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, 0x05, 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, 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, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 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, 0x08, 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, 0x09, 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, 0x0a, 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, 0x0b, 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, 0x0c, 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, 0x9e, 0x01, 0x0a, 0x13, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x49, 0x6e, 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, 0x1f, 0x0a, 0x0b, 0x63, - 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 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, 0x04, 0x20, 0x01, 0x28, - 0x03, 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, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x22, 0x65, 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, 0x3f, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x22, 0xb5, 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, 0x4f, 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, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, - 0x56, 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, 0x3a, 0x0a, 0x05, 0x70, - 0x61, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, - 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x22, 0x9a, 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, 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, - 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, 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, 0x5a, 0x0a, 0x10, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xbb, 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, 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, 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, 0x03, 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, 0x04, 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, 0x05, - 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, 0xac, 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, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 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, 0x02, 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, 0x03, 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, 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, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, - 0x18, 0x05, 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, 0x06, 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, 0x07, 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, 0x08, - 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, 0x92, 0x02, 0x0a, 0x0f, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, - 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x49, 0x6e, 0x69, 0x74, - 0x69, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, - 0x65, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x1a, 0x0a, - 0x08, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x22, 0xe2, 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, + 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, 0x82, 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, + 0x35, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x06, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 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, + 0xdd, 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, 0x39, + 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, - 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, - 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, 0x40, 0x0a, 0x07, - 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, - 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xa6, - 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, 0x16, 0x0a, 0x06, 0x62, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 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, - 0x02, 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, 0x03, 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, 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, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, - 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x05, 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, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x4b, - 0x65, 0x79, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x07, 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, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x22, 0xd6, 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, + 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, 0xdc, 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, 0x3f, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, @@ -4826,202 +4543,657 @@ var file_s3_proto_rawDesc = []byte{ 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x9f, 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, 0x3f, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, - 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, - 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xab, 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, 0x4f, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 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, 0x40, - 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x24, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x32, 0x93, 0x11, 0x0a, 0x02, 0x53, 0x33, 0x12, 0x4a, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, - 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x5e, 0x0a, 0x09, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, - 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, - 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, - 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x10, 0x50, 0x75, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2c, + 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, 0x87, 0x01, 0x0a, 0x07, 0x47, + 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 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, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x75, 0x72, 0x69, 0x22, 0x61, 0x0a, 0x05, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x38, 0x0a, + 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x6d, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x52, 0x07, + 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5c, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 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, 0x22, 0xa7, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x34, 0x0a, 0x06, + 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, - 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7a, 0x0a, - 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, - 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x71, 0x0a, 0x10, 0x47, 0x65, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x2e, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x06, 0x67, 0x72, 0x61, 0x6e, + 0x74, 0x73, 0x12, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, + 0x6e, 0x0a, 0x11, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x22, + 0x3d, 0x0a, 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x5d, + 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, 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, 0xa7, 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, 0x34, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, + 0x72, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 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, 0x5c, 0x0a, 0x09, 0x6d, 0x65, 0x74, + 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x6d, + 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 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, 0x5c, 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, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 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, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, + 0x1d, 0x20, 0x01, 0x28, 0x09, 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, 0x99, 0x04, 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, 0x39, 0x0a, 0x0a, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x09, 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, 0xbd, 0x01, 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, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 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, 0x22, 0x65, 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, 0x3f, 0x0a, 0x0d, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x22, 0xb5, 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, 0x4f, 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, 0x25, + 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x56, 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, 0x3a, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, + 0x72, 0x74, 0x73, 0x22, 0xb9, 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, 0x5a, 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, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, - 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x6d, 0x6f, - 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 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, 0x5f, 0x0a, 0x0a, - 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, 0x0a, - 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x29, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x92, 0x02, + 0x0a, 0x0f, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x12, 0x38, 0x0a, 0x09, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x09, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, - 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x47, - 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x12, 0x28, 0x2e, 0x6d, 0x6f, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x32, 0x0a, + 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, + 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 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, 0x1a, 0x0a, 0x08, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x49, 0x64, 0x22, 0xe2, 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, 0x40, 0x0a, 0x07, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, + 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, + 0xd6, 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, 0x3f, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, + 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, + 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x9f, 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, 0x3f, 0x0a, + 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x32, + 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xab, 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, 0x4f, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 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, 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, 0x40, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x32, 0x93, 0x11, 0x0a, 0x02, 0x53, 0x33, 0x12, + 0x4a, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, + 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 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, 0x5e, 0x0a, 0x09, 0x50, + 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, + 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x09, 0x47, + 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, + 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x0c, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, - 0x63, 0x6c, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x12, 0x71, 0x0a, 0x10, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, + 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, + 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, - 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0d, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x29, 0x2e, 0x6d, 0x6f, 0x73, + 0x65, 0x2e, 0x76, 0x31, 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, 0x30, 0x2e, + 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x71, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, + 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x5f, 0x0a, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x22, 0x00, 0x12, 0x80, 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, 0x31, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, + 0x62, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x27, + 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x41, 0x63, 0x6c, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x32, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x61, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x61, 0x72, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, - 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x6d, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, + 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x50, 0x75, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, + 0x00, 0x12, 0x68, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x12, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, + 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x80, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x32, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 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, 0x61, + 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6b, 0x0a, 0x0e, 0x55, 0x70, 0x6c, - 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x2e, 0x6d, 0x6f, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, + 0x01, 0x12, 0x6b, 0x0a, 0x0e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, + 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, + 0x2b, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, + 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x86, + 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, 0x33, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 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, + 0x34, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x7d, 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x7d, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x30, + 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x77, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, - 0x70, 0x79, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2b, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x86, 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, 0x33, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x34, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, - 0x7d, 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, - 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 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, 0x7d, - 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 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, 0x77, 0x0a, - 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x76, 0x31, 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, 0x2f, 0x2e, 0x6d, 0x6f, + 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 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, 0x42, 0x2c, + 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5109,67 +5281,69 @@ var file_s3_proto_depIdxs = []int32{ 23, // 8: mosn.proto.runtime.v1.Grant.grantee:type_name -> mosn.proto.runtime.v1.Grantee 24, // 9: mosn.proto.runtime.v1.GetObjectAclOutput.grants:type_name -> mosn.proto.runtime.v1.Grant 21, // 10: mosn.proto.runtime.v1.GetObjectAclOutput.owner:type_name -> mosn.proto.runtime.v1.Owner - 55, // 11: mosn.proto.runtime.v1.CreateMultipartUploadInput.meta_data:type_name -> mosn.proto.runtime.v1.CreateMultipartUploadInput.MetaDataEntry - 56, // 12: mosn.proto.runtime.v1.CreateMultipartUploadOutput.abort_date:type_name -> google.protobuf.Timestamp - 56, // 13: mosn.proto.runtime.v1.CopyPartResult.last_modified:type_name -> google.protobuf.Timestamp - 36, // 14: mosn.proto.runtime.v1.UploadPartCopyOutput.copy_part_result:type_name -> mosn.proto.runtime.v1.CopyPartResult - 38, // 15: mosn.proto.runtime.v1.CompletedMultipartUpload.parts:type_name -> mosn.proto.runtime.v1.CompletedPart - 39, // 16: mosn.proto.runtime.v1.CompleteMultipartUploadInput.multipart_upload:type_name -> mosn.proto.runtime.v1.CompletedMultipartUpload - 56, // 17: mosn.proto.runtime.v1.MultipartUpload.Initiated:type_name -> google.protobuf.Timestamp - 45, // 18: mosn.proto.runtime.v1.MultipartUpload.initiator:type_name -> mosn.proto.runtime.v1.Initiator - 21, // 19: mosn.proto.runtime.v1.MultipartUpload.owner:type_name -> mosn.proto.runtime.v1.Owner - 46, // 20: mosn.proto.runtime.v1.ListMultipartUploadsOutput.uploads:type_name -> mosn.proto.runtime.v1.MultipartUpload - 56, // 21: mosn.proto.runtime.v1.DeleteMarkerEntry.last_modified:type_name -> google.protobuf.Timestamp - 21, // 22: mosn.proto.runtime.v1.DeleteMarkerEntry.owner:type_name -> mosn.proto.runtime.v1.Owner - 56, // 23: mosn.proto.runtime.v1.ObjectVersion.last_modified:type_name -> google.protobuf.Timestamp - 21, // 24: mosn.proto.runtime.v1.ObjectVersion.owner:type_name -> mosn.proto.runtime.v1.Owner - 49, // 25: mosn.proto.runtime.v1.ListObjectVersionsOutput.delete_markers:type_name -> mosn.proto.runtime.v1.DeleteMarkerEntry - 50, // 26: mosn.proto.runtime.v1.ListObjectVersionsOutput.versions:type_name -> mosn.proto.runtime.v1.ObjectVersion - 0, // 27: mosn.proto.runtime.v1.S3.InitClient:input_type -> mosn.proto.runtime.v1.InitRequest - 3, // 28: mosn.proto.runtime.v1.S3.PutObject:input_type -> mosn.proto.runtime.v1.PutObjectInput - 1, // 29: mosn.proto.runtime.v1.S3.GetObject:input_type -> mosn.proto.runtime.v1.GetObjectInput - 5, // 30: mosn.proto.runtime.v1.S3.DeleteObject:input_type -> mosn.proto.runtime.v1.DeleteObjectInput - 7, // 31: mosn.proto.runtime.v1.S3.PutObjectTagging:input_type -> mosn.proto.runtime.v1.PutBucketTaggingInput - 9, // 32: mosn.proto.runtime.v1.S3.DeleteObjectTagging:input_type -> mosn.proto.runtime.v1.DeleteObjectTaggingInput - 11, // 33: mosn.proto.runtime.v1.S3.GetObjectTagging:input_type -> mosn.proto.runtime.v1.GetObjectTaggingInput - 13, // 34: mosn.proto.runtime.v1.S3.CopyObject:input_type -> mosn.proto.runtime.v1.CopyObjectInput - 17, // 35: mosn.proto.runtime.v1.S3.DeleteObjects:input_type -> mosn.proto.runtime.v1.DeleteObjectsInput - 19, // 36: mosn.proto.runtime.v1.S3.ListObjects:input_type -> mosn.proto.runtime.v1.ListObjectsInput - 25, // 37: mosn.proto.runtime.v1.S3.GetObjectAcl:input_type -> mosn.proto.runtime.v1.GetObjectAclInput - 27, // 38: mosn.proto.runtime.v1.S3.PutObjectAcl:input_type -> mosn.proto.runtime.v1.PutObjectAclInput - 29, // 39: mosn.proto.runtime.v1.S3.RestoreObject:input_type -> mosn.proto.runtime.v1.RestoreObjectInput - 31, // 40: mosn.proto.runtime.v1.S3.CreateMultipartUpload:input_type -> mosn.proto.runtime.v1.CreateMultipartUploadInput - 33, // 41: mosn.proto.runtime.v1.S3.UploadPart:input_type -> mosn.proto.runtime.v1.UploadPartInput - 35, // 42: mosn.proto.runtime.v1.S3.UploadPartCopy:input_type -> mosn.proto.runtime.v1.UploadPartCopyInput - 40, // 43: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:input_type -> mosn.proto.runtime.v1.CompleteMultipartUploadInput - 42, // 44: mosn.proto.runtime.v1.S3.AbortMultipartUpload:input_type -> mosn.proto.runtime.v1.AbortMultipartUploadInput - 44, // 45: mosn.proto.runtime.v1.S3.ListMultipartUploads:input_type -> mosn.proto.runtime.v1.ListMultipartUploadsInput - 48, // 46: mosn.proto.runtime.v1.S3.ListObjectVersions:input_type -> mosn.proto.runtime.v1.ListObjectVersionsInput - 57, // 47: mosn.proto.runtime.v1.S3.InitClient:output_type -> google.protobuf.Empty - 4, // 48: mosn.proto.runtime.v1.S3.PutObject:output_type -> mosn.proto.runtime.v1.PutObjectOutput - 2, // 49: mosn.proto.runtime.v1.S3.GetObject:output_type -> mosn.proto.runtime.v1.GetObjectOutput - 6, // 50: mosn.proto.runtime.v1.S3.DeleteObject:output_type -> mosn.proto.runtime.v1.DeleteObjectOutput - 8, // 51: mosn.proto.runtime.v1.S3.PutObjectTagging:output_type -> mosn.proto.runtime.v1.PutBucketTaggingOutput - 10, // 52: mosn.proto.runtime.v1.S3.DeleteObjectTagging:output_type -> mosn.proto.runtime.v1.DeleteObjectTaggingOutput - 12, // 53: mosn.proto.runtime.v1.S3.GetObjectTagging:output_type -> mosn.proto.runtime.v1.GetObjectTaggingOutput - 14, // 54: mosn.proto.runtime.v1.S3.CopyObject:output_type -> mosn.proto.runtime.v1.CopyObjectOutput - 18, // 55: mosn.proto.runtime.v1.S3.DeleteObjects:output_type -> mosn.proto.runtime.v1.DeleteObjectsOutput - 20, // 56: mosn.proto.runtime.v1.S3.ListObjects:output_type -> mosn.proto.runtime.v1.ListObjectsOutput - 26, // 57: mosn.proto.runtime.v1.S3.GetObjectAcl:output_type -> mosn.proto.runtime.v1.GetObjectAclOutput - 28, // 58: mosn.proto.runtime.v1.S3.PutObjectAcl:output_type -> mosn.proto.runtime.v1.PutObjectAclOutput - 30, // 59: mosn.proto.runtime.v1.S3.RestoreObject:output_type -> mosn.proto.runtime.v1.RestoreObjectOutput - 32, // 60: mosn.proto.runtime.v1.S3.CreateMultipartUpload:output_type -> mosn.proto.runtime.v1.CreateMultipartUploadOutput - 34, // 61: mosn.proto.runtime.v1.S3.UploadPart:output_type -> mosn.proto.runtime.v1.UploadPartOutput - 37, // 62: mosn.proto.runtime.v1.S3.UploadPartCopy:output_type -> mosn.proto.runtime.v1.UploadPartCopyOutput - 41, // 63: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:output_type -> mosn.proto.runtime.v1.CompleteMultipartUploadOutput - 43, // 64: mosn.proto.runtime.v1.S3.AbortMultipartUpload:output_type -> mosn.proto.runtime.v1.AbortMultipartUploadOutput - 47, // 65: mosn.proto.runtime.v1.S3.ListMultipartUploads:output_type -> mosn.proto.runtime.v1.ListMultipartUploadsOutput - 51, // 66: mosn.proto.runtime.v1.S3.ListObjectVersions:output_type -> mosn.proto.runtime.v1.ListObjectVersionsOutput - 47, // [47:67] is the sub-list for method output_type - 27, // [27:47] is the sub-list for method input_type - 27, // [27:27] is the sub-list for extension type_name - 27, // [27:27] is the sub-list for extension extendee - 0, // [0:27] is the sub-list for field type_name + 56, // 11: mosn.proto.runtime.v1.CreateMultipartUploadInput.expires:type_name -> google.protobuf.Timestamp + 55, // 12: mosn.proto.runtime.v1.CreateMultipartUploadInput.meta_data:type_name -> mosn.proto.runtime.v1.CreateMultipartUploadInput.MetaDataEntry + 56, // 13: mosn.proto.runtime.v1.CreateMultipartUploadInput.object_lock_retain_until_date:type_name -> google.protobuf.Timestamp + 56, // 14: mosn.proto.runtime.v1.CreateMultipartUploadOutput.abort_date:type_name -> google.protobuf.Timestamp + 56, // 15: mosn.proto.runtime.v1.CopyPartResult.last_modified:type_name -> google.protobuf.Timestamp + 36, // 16: mosn.proto.runtime.v1.UploadPartCopyOutput.copy_part_result:type_name -> mosn.proto.runtime.v1.CopyPartResult + 38, // 17: mosn.proto.runtime.v1.CompletedMultipartUpload.parts:type_name -> mosn.proto.runtime.v1.CompletedPart + 39, // 18: mosn.proto.runtime.v1.CompleteMultipartUploadInput.multipart_upload:type_name -> mosn.proto.runtime.v1.CompletedMultipartUpload + 56, // 19: mosn.proto.runtime.v1.MultipartUpload.Initiated:type_name -> google.protobuf.Timestamp + 45, // 20: mosn.proto.runtime.v1.MultipartUpload.initiator:type_name -> mosn.proto.runtime.v1.Initiator + 21, // 21: mosn.proto.runtime.v1.MultipartUpload.owner:type_name -> mosn.proto.runtime.v1.Owner + 46, // 22: mosn.proto.runtime.v1.ListMultipartUploadsOutput.uploads:type_name -> mosn.proto.runtime.v1.MultipartUpload + 56, // 23: mosn.proto.runtime.v1.DeleteMarkerEntry.last_modified:type_name -> google.protobuf.Timestamp + 21, // 24: mosn.proto.runtime.v1.DeleteMarkerEntry.owner:type_name -> mosn.proto.runtime.v1.Owner + 56, // 25: mosn.proto.runtime.v1.ObjectVersion.last_modified:type_name -> google.protobuf.Timestamp + 21, // 26: mosn.proto.runtime.v1.ObjectVersion.owner:type_name -> mosn.proto.runtime.v1.Owner + 49, // 27: mosn.proto.runtime.v1.ListObjectVersionsOutput.delete_markers:type_name -> mosn.proto.runtime.v1.DeleteMarkerEntry + 50, // 28: mosn.proto.runtime.v1.ListObjectVersionsOutput.versions:type_name -> mosn.proto.runtime.v1.ObjectVersion + 0, // 29: mosn.proto.runtime.v1.S3.InitClient:input_type -> mosn.proto.runtime.v1.InitRequest + 3, // 30: mosn.proto.runtime.v1.S3.PutObject:input_type -> mosn.proto.runtime.v1.PutObjectInput + 1, // 31: mosn.proto.runtime.v1.S3.GetObject:input_type -> mosn.proto.runtime.v1.GetObjectInput + 5, // 32: mosn.proto.runtime.v1.S3.DeleteObject:input_type -> mosn.proto.runtime.v1.DeleteObjectInput + 7, // 33: mosn.proto.runtime.v1.S3.PutObjectTagging:input_type -> mosn.proto.runtime.v1.PutBucketTaggingInput + 9, // 34: mosn.proto.runtime.v1.S3.DeleteObjectTagging:input_type -> mosn.proto.runtime.v1.DeleteObjectTaggingInput + 11, // 35: mosn.proto.runtime.v1.S3.GetObjectTagging:input_type -> mosn.proto.runtime.v1.GetObjectTaggingInput + 13, // 36: mosn.proto.runtime.v1.S3.CopyObject:input_type -> mosn.proto.runtime.v1.CopyObjectInput + 17, // 37: mosn.proto.runtime.v1.S3.DeleteObjects:input_type -> mosn.proto.runtime.v1.DeleteObjectsInput + 19, // 38: mosn.proto.runtime.v1.S3.ListObjects:input_type -> mosn.proto.runtime.v1.ListObjectsInput + 25, // 39: mosn.proto.runtime.v1.S3.GetObjectAcl:input_type -> mosn.proto.runtime.v1.GetObjectAclInput + 27, // 40: mosn.proto.runtime.v1.S3.PutObjectAcl:input_type -> mosn.proto.runtime.v1.PutObjectAclInput + 29, // 41: mosn.proto.runtime.v1.S3.RestoreObject:input_type -> mosn.proto.runtime.v1.RestoreObjectInput + 31, // 42: mosn.proto.runtime.v1.S3.CreateMultipartUpload:input_type -> mosn.proto.runtime.v1.CreateMultipartUploadInput + 33, // 43: mosn.proto.runtime.v1.S3.UploadPart:input_type -> mosn.proto.runtime.v1.UploadPartInput + 35, // 44: mosn.proto.runtime.v1.S3.UploadPartCopy:input_type -> mosn.proto.runtime.v1.UploadPartCopyInput + 40, // 45: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:input_type -> mosn.proto.runtime.v1.CompleteMultipartUploadInput + 42, // 46: mosn.proto.runtime.v1.S3.AbortMultipartUpload:input_type -> mosn.proto.runtime.v1.AbortMultipartUploadInput + 44, // 47: mosn.proto.runtime.v1.S3.ListMultipartUploads:input_type -> mosn.proto.runtime.v1.ListMultipartUploadsInput + 48, // 48: mosn.proto.runtime.v1.S3.ListObjectVersions:input_type -> mosn.proto.runtime.v1.ListObjectVersionsInput + 57, // 49: mosn.proto.runtime.v1.S3.InitClient:output_type -> google.protobuf.Empty + 4, // 50: mosn.proto.runtime.v1.S3.PutObject:output_type -> mosn.proto.runtime.v1.PutObjectOutput + 2, // 51: mosn.proto.runtime.v1.S3.GetObject:output_type -> mosn.proto.runtime.v1.GetObjectOutput + 6, // 52: mosn.proto.runtime.v1.S3.DeleteObject:output_type -> mosn.proto.runtime.v1.DeleteObjectOutput + 8, // 53: mosn.proto.runtime.v1.S3.PutObjectTagging:output_type -> mosn.proto.runtime.v1.PutBucketTaggingOutput + 10, // 54: mosn.proto.runtime.v1.S3.DeleteObjectTagging:output_type -> mosn.proto.runtime.v1.DeleteObjectTaggingOutput + 12, // 55: mosn.proto.runtime.v1.S3.GetObjectTagging:output_type -> mosn.proto.runtime.v1.GetObjectTaggingOutput + 14, // 56: mosn.proto.runtime.v1.S3.CopyObject:output_type -> mosn.proto.runtime.v1.CopyObjectOutput + 18, // 57: mosn.proto.runtime.v1.S3.DeleteObjects:output_type -> mosn.proto.runtime.v1.DeleteObjectsOutput + 20, // 58: mosn.proto.runtime.v1.S3.ListObjects:output_type -> mosn.proto.runtime.v1.ListObjectsOutput + 26, // 59: mosn.proto.runtime.v1.S3.GetObjectAcl:output_type -> mosn.proto.runtime.v1.GetObjectAclOutput + 28, // 60: mosn.proto.runtime.v1.S3.PutObjectAcl:output_type -> mosn.proto.runtime.v1.PutObjectAclOutput + 30, // 61: mosn.proto.runtime.v1.S3.RestoreObject:output_type -> mosn.proto.runtime.v1.RestoreObjectOutput + 32, // 62: mosn.proto.runtime.v1.S3.CreateMultipartUpload:output_type -> mosn.proto.runtime.v1.CreateMultipartUploadOutput + 34, // 63: mosn.proto.runtime.v1.S3.UploadPart:output_type -> mosn.proto.runtime.v1.UploadPartOutput + 37, // 64: mosn.proto.runtime.v1.S3.UploadPartCopy:output_type -> mosn.proto.runtime.v1.UploadPartCopyOutput + 41, // 65: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:output_type -> mosn.proto.runtime.v1.CompleteMultipartUploadOutput + 43, // 66: mosn.proto.runtime.v1.S3.AbortMultipartUpload:output_type -> mosn.proto.runtime.v1.AbortMultipartUploadOutput + 47, // 67: mosn.proto.runtime.v1.S3.ListMultipartUploads:output_type -> mosn.proto.runtime.v1.ListMultipartUploadsOutput + 51, // 68: mosn.proto.runtime.v1.S3.ListObjectVersions:output_type -> mosn.proto.runtime.v1.ListObjectVersionsOutput + 49, // [49:69] is the sub-list for method output_type + 29, // [29:49] is the sub-list for method input_type + 29, // [29:29] is the sub-list for extension type_name + 29, // [29:29] is the sub-list for extension extendee + 0, // [0:29] is the sub-list for field type_name } func init() { file_s3_proto_init() } diff --git a/spec/proto/extension/v1/s3.proto b/spec/proto/extension/v1/s3.proto index 5fd6a63f77..26a4813016 100644 --- a/spec/proto/extension/v1/s3.proto +++ b/spec/proto/extension/v1/s3.proto @@ -77,8 +77,9 @@ message PutObjectOutput{ } message DeleteObjectInput{ - string bucket = 1; - string key = 2; + string store_name = 1; + string bucket = 2; + string key = 3; } message DeleteObjectOutput{ bool delete_marker = 1; @@ -87,35 +88,38 @@ message DeleteObjectOutput{ } message PutBucketTaggingInput{ - string bucket = 1; - string key = 2; - map tags = 3; + string store_name = 1; + string bucket = 2; + string key = 3; + map tags = 4; } message PutBucketTaggingOutput{ } message DeleteObjectTaggingInput{ - // The bucket name containing the objects from which to remove the tags. - string bucket = 1; - string key = 2; + string store_name = 1; + string bucket = 2; + string key = 3; } message DeleteObjectTaggingOutput{ string version_id = 1; } message GetObjectTaggingInput{ - string bucket = 1; - string key = 2; + string store_name = 1; + string bucket = 2; + string key = 3; } message GetObjectTaggingOutput{ map tags = 1; } message CopyObjectInput{ - string bucket = 1; - string key = 2; - string copy_source = 3; + string store_name = 1; + string bucket = 2; + string key = 3; + string copy_source = 4; } message CopyObjectOutput{ @@ -131,22 +135,24 @@ message ObjectIdentifier{ string version_id = 2; } message DeleteObjectsInput{ - string bucket = 1; - Delete Delete = 2; + string store_name = 1; + string bucket = 2; + Delete Delete = 3; } message DeleteObjectsOutput{ } message ListObjectsInput{ - string bucket = 1; - string delimiter = 2; - string encoding_type = 3; - string expected_bucket_owner = 4; - string marker = 5; - int32 maxKeys = 6; - string prefix = 7; - string request_payer = 8; + string store_name = 1; + string bucket = 2; + string delimiter = 3; + string encoding_type = 4; + string expected_bucket_owner = 5; + string marker = 6; + int32 maxKeys = 7; + string prefix = 8; + string request_payer = 9; } message ListObjectsOutput{ repeated string common_prefixes = 1; @@ -185,8 +191,9 @@ message Grant{ string permission = 2; } message GetObjectAclInput{ - string bucket = 1; - string key = 2; + string store_name = 1; + string bucket = 2; + string key = 3; } message GetObjectAclOutput{ repeated Grant grants = 1; @@ -195,17 +202,19 @@ message GetObjectAclOutput{ } message PutObjectAclInput{ - string bucket = 1; - string key = 2; - string acl = 3; + string store_name = 1; + string bucket = 2; + string key = 3; + string acl = 4; } message PutObjectAclOutput{ string request_charged = 1; } message RestoreObjectInput{ - string bucket = 1; - string key = 2; + string store_name = 1; + string bucket = 2; + string key = 3; } message RestoreObjectOutput{ string request_charged = 1; @@ -213,35 +222,36 @@ message RestoreObjectOutput{ } message CreateMultipartUploadInput{ - string bucket = 1; - string key = 2; - string acl = 3; - bool bucket_key_enabled = 4; - string cache_control = 5; - string content_disposition = 6; - string content_encoding = 7; - string content_language = 8; - string content_type = 9; - string expected_bucket_owner = 10; - string expires = 11; - string grant_full_control = 12; - string grant_read = 13; - string grant_read_acp = 14; - string grant_write_acp = 15; - map meta_data = 16; - string object_lock_legal_hold_status = 17; - string object_lock_mode = 18; - string object_lock_retain_until_date = 19; - string request_payer = 20; - string sse_customer_algorithm = 21; - string sse_customer_key = 22; - string sse_customer_key_md5 = 23; - string sse_kms_encryption_context = 24; - string sse_kms_key_id = 25; - string server_side_encryption = 26; - string storage_class = 27; - string tagging = 28; - string website_redirect_location = 29; + string store_name = 1; + string bucket = 2; + string key = 3; + string acl = 4; + bool bucket_key_enabled = 5; + string cache_control = 6; + string content_disposition = 7; + string content_encoding = 8; + string content_language = 9; + string content_type = 10; + string expected_bucket_owner = 11; + google.protobuf.Timestamp expires = 12; + string grant_full_control = 13; + string grant_read = 14; + string grant_read_acp = 15; + string grant_write_acp = 16; + map meta_data = 17; + string object_lock_legal_hold_status = 18; + string object_lock_mode = 19; + google.protobuf.Timestamp object_lock_retain_until_date = 20; + string request_payer = 21; + string sse_customer_algorithm = 22; + string sse_customer_key = 23; + string sse_customer_key_md5 = 24; + string sse_kms_encryption_context = 25; + string sse_kms_key_id = 26; + string server_side_encryption = 27; + string storage_class = 28; + string tagging = 29; + string website_redirect_location = 30; } message CreateMultipartUploadOutput{ string bucket = 1; @@ -259,18 +269,19 @@ message CreateMultipartUploadOutput{ } message UploadPartInput{ - string bucket = 1; - string key = 2; - bytes body = 3; - int64 content_length = 4; - string content_md5 = 5; - string expected_bucket_owner = 6; - int64 part_number = 7; - string request_payer = 8; - string sse_customer_algorithm = 9; - string sse_customer_key = 10; - string sse_customer_key_md5 = 11; - string upload_id = 12; + string store_name = 1; + string bucket = 2; + string key = 3; + bytes body = 4; + int64 content_length = 5; + string content_md5 = 6; + string expected_bucket_owner = 7; + int32 part_number = 8; + string request_payer = 9; + string sse_customer_algorithm = 10; + string sse_customer_key = 11; + string sse_customer_key_md5 = 12; + string upload_id = 13; } message UploadPartOutput{ bool bucket_key_enabled = 1; @@ -283,11 +294,12 @@ message UploadPartOutput{ } message UploadPartCopyInput{ - string bucket = 1; - string key = 2; - string copy_source = 3; - int64 part_number = 4; - string upload_id = 5; + string store_name = 1; + string bucket = 2; + string key = 3; + string copy_source = 4; + int32 part_number = 5; + string upload_id = 6; } message CopyPartResult{ @@ -307,18 +319,19 @@ message UploadPartCopyOutput{ message CompletedPart{ string etag = 1; - int64 part_number = 2; + int32 part_number = 2; } message CompletedMultipartUpload{ repeated CompletedPart parts = 1; } message CompleteMultipartUploadInput{ - string bucket = 1; - string key = 2; - string upload_id = 3; - string request_payer = 4; - string expected_bucket_owner = 5; - CompletedMultipartUpload multipart_upload = 6; + string store_name = 1; + string bucket = 2; + string key = 3; + string upload_id = 4; + string request_payer = 5; + string expected_bucket_owner = 6; + CompletedMultipartUpload multipart_upload = 7; } message CompleteMultipartUploadOutput{ string bucket = 1; @@ -334,25 +347,27 @@ message CompleteMultipartUploadOutput{ } message AbortMultipartUploadInput{ - string bucket = 1; - string key = 2; - string expected_bucket_owner = 3; - string request_payer = 4; - string upload_id = 5; + string store_name = 1; + string bucket = 2; + string key = 3; + string expected_bucket_owner = 4; + string request_payer = 5; + string upload_id = 6; } message AbortMultipartUploadOutput{ string request_charged = 1; } message ListMultipartUploadsInput{ - string bucket = 1; - string delimiter = 2; - string encoding_type = 3; - string expected_bucket_owner = 4; - string key_marker = 5; - int64 max_uploads = 6; - string prefix = 7; - string upload_id_marker = 8; + string store_name = 1; + string bucket = 2; + string delimiter = 3; + string encoding_type = 4; + string expected_bucket_owner = 5; + string key_marker = 6; + int64 max_uploads = 7; + string prefix = 8; + string upload_id_marker = 9; } message Initiator{ string display_name = 1; @@ -373,23 +388,24 @@ message ListMultipartUploadsOutput{ string encoding_type = 4; bool is_truncated = 5; string key_marker = 6; - int64 max_uploads = 7; + int32 max_uploads = 7; string next_key_marker = 8; string next_upload_id_marker = 9; string prefix = 10; string upload_id_marker = 11; - MultipartUpload uploads = 12; + repeated MultipartUpload uploads = 12; } message ListObjectVersionsInput{ - string bucket = 1; - string delimiter = 2; - string encoding_type = 3; - string expected_bucket_owner = 4; - string key_marker = 5; - int64 max_keys = 6; - string prefix = 7; - string version_id_marker = 8; + string store_name = 1; + string bucket = 2; + string delimiter = 3; + string encoding_type = 4; + string expected_bucket_owner = 5; + string key_marker = 6; + int64 max_keys = 7; + string prefix = 8; + string version_id_marker = 9; } message DeleteMarkerEntry{ bool is_latest = 1; From 0599d2d11c92a467bff92f2cbf685886bf67770e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Fri, 27 May 2022 18:25:51 +0800 Subject: [PATCH 011/126] add implement --- pkg/grpc/extension/s3/s3.go | 398 +++++++++++++++++++++++++++++++++--- 1 file changed, 364 insertions(+), 34 deletions(-) diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go index 75871b2cf2..9310d38575 100644 --- a/pkg/grpc/extension/s3/s3.go +++ b/pkg/grpc/extension/s3/s3.go @@ -200,54 +200,384 @@ func (s *S3Server) DeleteObject(ctx context.Context, req *s3.DeleteObjectInput) if s.ossInstance[req.StoreName] == nil { return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) } - - return nil, nil + st := &l8s3.DeleteObjectInput{} + err := transferData(req, st) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for DeleteObject,err: %+v", err) + } + if resp, err := s.ossInstance[req.StoreName].DeleteObject(ctx, st); err != nil { + return nil, status.Errorf(codes.Internal, err.Error()) + } else { + output := &s3.DeleteObjectOutput{} + err := transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for DeleteObject,err: %+v", err) + } + return output, nil + } } -func (s *S3Server) PutObjectTagging(context.Context, *s3.PutBucketTaggingInput) (*s3.PutBucketTaggingOutput, error) { - return nil, nil +func (s *S3Server) PutObjectTagging(ctx context.Context, req *s3.PutBucketTaggingInput) (*s3.PutBucketTaggingOutput, error) { + if s.ossInstance[req.StoreName] == nil { + return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + } + st := &l8s3.PutBucketTaggingInput{} + err := transferData(req, st) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for PutObjectTagging,err: %+v", err) + } + if resp, err := s.ossInstance[req.StoreName].PutObjectTagging(ctx, st); err != nil { + return nil, status.Errorf(codes.Internal, err.Error()) + } else { + output := &s3.PutBucketTaggingOutput{} + err := transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for PutObjectTagging,err: %+v", err) + } + return output, nil + } } -func (s *S3Server) DeleteObjectTagging(context.Context, *s3.DeleteObjectTaggingInput) (*s3.DeleteObjectTaggingOutput, error) { - return nil, nil +func (s *S3Server) DeleteObjectTagging(ctx context.Context, req *s3.DeleteObjectTaggingInput) (*s3.DeleteObjectTaggingOutput, error) { + if s.ossInstance[req.StoreName] == nil { + return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + } + st := &l8s3.DeleteObjectTaggingInput{} + err := transferData(req, st) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for DeleteObjectTagging,err: %+v", err) + } + if resp, err := s.ossInstance[req.StoreName].DeleteObjectTagging(ctx, st); err != nil { + return nil, status.Errorf(codes.Internal, err.Error()) + } else { + output := &s3.DeleteObjectTaggingOutput{} + err := transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for DeleteObjectTagging,err: %+v", err) + } + return output, nil + } } -func (s *S3Server) GetObjectTagging(context.Context, *s3.GetObjectTaggingInput) (*s3.GetObjectTaggingOutput, error) { - return nil, nil +func (s *S3Server) GetObjectTagging(ctx context.Context, req *s3.GetObjectTaggingInput) (*s3.GetObjectTaggingOutput, error) { + if s.ossInstance[req.StoreName] == nil { + return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + } + st := &l8s3.GetObjectTaggingInput{} + err := transferData(req, st) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for GetObjectTagging,err: %+v", err) + } + if resp, err := s.ossInstance[req.StoreName].GetObjectTagging(ctx, st); err != nil { + return nil, status.Errorf(codes.Internal, err.Error()) + } else { + output := &s3.GetObjectTaggingOutput{} + err := transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for GetObjectTagging,err: %+v", err) + } + return output, nil + } } -func (s *S3Server) CopyObject(context.Context, *s3.CopyObjectInput) (*s3.CopyObjectOutput, error) { - return nil, nil +func (s *S3Server) CopyObject(ctx context.Context, req *s3.CopyObjectInput) (*s3.CopyObjectOutput, error) { + if s.ossInstance[req.StoreName] == nil { + return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + } + st := &l8s3.CopyObjectInput{} + err := transferData(req, st) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for CopyObject,err: %+v", err) + } + if resp, err := s.ossInstance[req.StoreName].CopyObject(ctx, st); err != nil { + return nil, status.Errorf(codes.Internal, err.Error()) + } else { + output := &s3.CopyObjectOutput{} + err := transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for CopyObject,err: %+v", err) + } + return output, nil + } } -func (s *S3Server) DeleteObjects(context.Context, *s3.DeleteObjectsInput) (*s3.DeleteObjectsOutput, error) { - return nil, nil +func (s *S3Server) DeleteObjects(ctx context.Context, req *s3.DeleteObjectsInput) (*s3.DeleteObjectsOutput, error) { + if s.ossInstance[req.StoreName] == nil { + return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + } + st := &l8s3.DeleteObjectsInput{} + err := transferData(req, st) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for DeleteObjects,err: %+v", err) + } + if resp, err := s.ossInstance[req.StoreName].DeleteObjects(ctx, st); err != nil { + return nil, status.Errorf(codes.Internal, err.Error()) + } else { + output := &s3.DeleteObjectsOutput{} + err := transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for DeleteObjects,err: %+v", err) + } + return output, nil + } } -func (s *S3Server) ListObjects(context.Context, *s3.ListObjectsInput) (*s3.ListObjectsOutput, error) { - return nil, nil +func (s *S3Server) ListObjects(ctx context.Context, req *s3.ListObjectsInput) (*s3.ListObjectsOutput, error) { + if s.ossInstance[req.StoreName] == nil { + return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + } + st := &l8s3.ListObjectsInput{} + err := transferData(req, st) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for ListObjects,err: %+v", err) + } + if resp, err := s.ossInstance[req.StoreName].ListObjects(ctx, st); err != nil { + return nil, status.Errorf(codes.Internal, err.Error()) + } else { + output := &s3.ListObjectsOutput{} + err := transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for ListObjects,err: %+v", err) + } + return output, nil + } } -func (s *S3Server) GetObjectAcl(context.Context, *s3.GetObjectAclInput) (*s3.GetObjectAclOutput, error) { - return nil, nil +func (s *S3Server) GetObjectAcl(ctx context.Context, req *s3.GetObjectAclInput) (*s3.GetObjectAclOutput, error) { + if s.ossInstance[req.StoreName] == nil { + return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + } + st := &l8s3.GetObjectAclInput{} + err := transferData(req, st) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for GetObjectAcl,err: %+v", err) + } + if resp, err := s.ossInstance[req.StoreName].GetObjectAcl(ctx, st); err != nil { + return nil, status.Errorf(codes.Internal, err.Error()) + } else { + output := &s3.GetObjectAclOutput{} + err := transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for GetObjectAcl,err: %+v", err) + } + return output, nil + } } -func (s *S3Server) PutObjectAcl(context.Context, *s3.PutObjectAclInput) (*s3.PutObjectAclOutput, error) { - return nil, nil +func (s *S3Server) PutObjectAcl(ctx context.Context, req *s3.PutObjectAclInput) (*s3.PutObjectAclOutput, error) { + if s.ossInstance[req.StoreName] == nil { + return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + } + st := &l8s3.PutObjectAclInput{} + err := transferData(req, st) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for PutObjectAcl,err: %+v", err) + } + if resp, err := s.ossInstance[req.StoreName].PutObjectAcl(ctx, st); err != nil { + return nil, status.Errorf(codes.Internal, err.Error()) + } else { + output := &s3.PutObjectAclOutput{} + err := transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for PutObjectAcl,err: %+v", err) + } + return output, nil + } } -func (s *S3Server) RestoreObject(context.Context, *s3.RestoreObjectInput) (*s3.RestoreObjectOutput, error) { - return nil, nil +func (s *S3Server) RestoreObject(ctx context.Context, req *s3.RestoreObjectInput) (*s3.RestoreObjectOutput, error) { + if s.ossInstance[req.StoreName] == nil { + return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + } + st := &l8s3.RestoreObjectInput{} + err := transferData(req, st) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for RestoreObject,err: %+v", err) + } + if resp, err := s.ossInstance[req.StoreName].RestoreObject(ctx, st); err != nil { + return nil, status.Errorf(codes.Internal, err.Error()) + } else { + output := &s3.RestoreObjectOutput{} + err := transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for RestoreObject,err: %+v", err) + } + return output, nil + } } -func (s *S3Server) CreateMultipartUpload(context.Context, *s3.CreateMultipartUploadInput) (*s3.CreateMultipartUploadOutput, error) { - return nil, nil +func (s *S3Server) CreateMultipartUpload(ctx context.Context, req *s3.CreateMultipartUploadInput) (*s3.CreateMultipartUploadOutput, error) { + if s.ossInstance[req.StoreName] == nil { + return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + } + st := &l8s3.CreateMultipartUploadInput{} + err := transferData(req, st) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for CreateMultipartUpload,err: %+v", err) + } + if resp, err := s.ossInstance[req.StoreName].CreateMultipartUpload(ctx, st); err != nil { + return nil, status.Errorf(codes.Internal, err.Error()) + } else { + output := &s3.CreateMultipartUploadOutput{} + err := transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for CreateMultipartUpload,err: %+v", err) + } + return output, nil + } } -func (s *S3Server) UploadPart(s3.S3_UploadPartServer) error { - return nil + +type uploadPartStreamReader struct { + data []byte + server s3.S3_UploadPartServer } -func (s *S3Server) UploadPartCopy(context.Context, *s3.UploadPartCopyInput) (*s3.UploadPartCopyOutput, error) { - return nil, nil + +func newUploadPartStreamReader(data []byte, server s3.S3_UploadPartServer) *uploadPartStreamReader { + return &uploadPartStreamReader{data: data, server: server} } -func (s *S3Server) CompleteMultipartUpload(context.Context, *s3.CompleteMultipartUploadInput) (*s3.CompleteMultipartUploadOutput, error) { - return nil, nil + +func (r *uploadPartStreamReader) Read(p []byte) (int, error) { + var count int + total := len(p) + for { + if len(r.data) > 0 { + n := copy(p[count:], r.data) + r.data = r.data[n:] + count += n + if count == total { + return count, nil + } + } + req, err := r.server.Recv() + if err != nil { + if err != io.EOF { + log.DefaultLogger.Errorf("recv data from grpc stream fail, err:%+v", err) + } + return count, err + } + r.data = req.Body + } } -func (s *S3Server) AbortMultipartUpload(context.Context, *s3.AbortMultipartUploadInput) (*s3.AbortMultipartUploadOutput, error) { - return nil, nil + +func (s *S3Server) UploadPart(stream s3.S3_UploadPartServer) error { + req, err := stream.Recv() + if err != nil { + //if client send eof error directly, return nil + if err == io.EOF { + return nil + } + return status.Errorf(codes.Internal, "receive file data fail: err: %+v", err) + } + + if s.ossInstance[req.StoreName] == nil { + return status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + } + fileReader := newUploadPartStreamReader(req.Body, stream) + + st := &l8s3.UploadPartInput{} + err = transferData(req, st) + if err != nil { + return status.Errorf(codes.InvalidArgument, "transfer request data fail for UploadPart,err: %+v", err) + } + st.DataStream = fileReader + if resp, err := s.ossInstance[req.StoreName].UploadPart(stream.Context(), st); err != nil { + return status.Errorf(codes.Internal, err.Error()) + } else { + output := &s3.UploadPartOutput{} + err := transferData(resp, output) + if err != nil { + return status.Errorf(codes.Internal, "transfer response data fail for UploadPart,err: %+v", err) + } + return stream.SendAndClose(output) + } } -func (s *S3Server) ListMultipartUploads(context.Context, *s3.ListMultipartUploadsInput) (*s3.ListMultipartUploadsOutput, error) { - return nil, nil +func (s *S3Server) UploadPartCopy(ctx context.Context, req *s3.UploadPartCopyInput) (*s3.UploadPartCopyOutput, error) { + if s.ossInstance[req.StoreName] == nil { + return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + } + st := &l8s3.UploadPartCopyInput{} + err := transferData(req, st) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for UploadPartCopy,err: %+v", err) + } + if resp, err := s.ossInstance[req.StoreName].UploadPartCopy(ctx, st); err != nil { + return nil, status.Errorf(codes.Internal, err.Error()) + } else { + output := &s3.UploadPartCopyOutput{} + err := transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for UploadPartCopy,err: %+v", err) + } + return output, nil + } +} +func (s *S3Server) CompleteMultipartUpload(ctx context.Context, req *s3.CompleteMultipartUploadInput) (*s3.CompleteMultipartUploadOutput, error) { + if s.ossInstance[req.StoreName] == nil { + return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + } + st := &l8s3.CompleteMultipartUploadInput{} + err := transferData(req, st) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for CompleteMultipartUpload,err: %+v", err) + } + if resp, err := s.ossInstance[req.StoreName].CompleteMultipartUpload(ctx, st); err != nil { + return nil, status.Errorf(codes.Internal, err.Error()) + } else { + output := &s3.CompleteMultipartUploadOutput{} + err := transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for CompleteMultipartUpload,err: %+v", err) + } + return output, nil + } +} +func (s *S3Server) AbortMultipartUpload(ctx context.Context, req *s3.AbortMultipartUploadInput) (*s3.AbortMultipartUploadOutput, error) { + if s.ossInstance[req.StoreName] == nil { + return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + } + st := &l8s3.AbortMultipartUploadInput{} + err := transferData(req, st) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for AbortMultipartUpload,err: %+v", err) + } + if resp, err := s.ossInstance[req.StoreName].AbortMultipartUpload(ctx, st); err != nil { + return nil, status.Errorf(codes.Internal, err.Error()) + } else { + output := &s3.AbortMultipartUploadOutput{} + err := transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for AbortMultipartUpload,err: %+v", err) + } + return output, nil + } +} +func (s *S3Server) ListMultipartUploads(ctx context.Context, req *s3.ListMultipartUploadsInput) (*s3.ListMultipartUploadsOutput, error) { + if s.ossInstance[req.StoreName] == nil { + return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + } + st := &l8s3.ListMultipartUploadsInput{} + err := transferData(req, st) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for AbortMultipartUpload,err: %+v", err) + } + if resp, err := s.ossInstance[req.StoreName].ListMultipartUploads(ctx, st); err != nil { + return nil, status.Errorf(codes.Internal, err.Error()) + } else { + output := &s3.ListMultipartUploadsOutput{} + err := transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for AbortMultipartUpload,err: %+v", err) + } + return output, nil + } } -func (s *S3Server) ListObjectVersions(context.Context, *s3.ListObjectVersionsInput) (*s3.ListObjectVersionsOutput, error) { - return nil, nil +func (s *S3Server) ListObjectVersions(ctx context.Context, req *s3.ListObjectVersionsInput) (*s3.ListObjectVersionsOutput, error) { + if s.ossInstance[req.StoreName] == nil { + return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + } + st := &l8s3.ListObjectVersionsInput{} + err := transferData(req, st) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for ListObjectVersions,err: %+v", err) + } + if resp, err := s.ossInstance[req.StoreName].ListObjectVersions(ctx, st); err != nil { + return nil, status.Errorf(codes.Internal, err.Error()) + } else { + output := &s3.ListObjectVersionsOutput{} + err := transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for ListObjectVersions,err: %+v", err) + } + return output, nil + } } From fccdd5c257babfdf66c7eddf5f94fff6048d7390 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Thu, 9 Jun 2022 10:40:36 +0800 Subject: [PATCH 012/126] add aliyun implement --- cmd/layotto/main.go | 7 +- cmd/layotto_multiple_api/main.go | 3 +- .../file/{alicloud/oss.go => aliyun/file.go} | 46 +- .../oss_test.go => aliyun/file_test.go} | 34 +- components/file/aliyun/option.go | 46 + components/file/aliyun/oss.go | 454 +++ components/file/aws/file.go | 290 ++ .../file/aws/{oss_test.go => file_test.go} | 24 + components/file/aws/oss.go | 514 +--- components/file/registry.go | 8 +- components/file/s3def.go | 206 +- components/go.mod | 1 + components/go.sum | 2 + components/pkg/mock/mongo_sequencer_mock.go | 2 +- demo/file/s3/client.go | 407 +++ demo/file/s3/haizei.jpg | Bin 0 -> 267024 bytes go.mod | 1 - go.sum | 2 + pkg/grpc/extension/s3/s3.go | 13 +- pkg/runtime/config_test.go | 3 +- pkg/runtime/runtime.go | 8 +- spec/proto/extension/v1/s3.pb.go | 2732 +++++++++-------- spec/proto/extension/v1/s3.proto | 45 +- 23 files changed, 3080 insertions(+), 1768 deletions(-) rename components/file/{alicloud/oss.go => aliyun/file.go} (79%) rename components/file/{alicloud/oss_test.go => aliyun/file_test.go} (88%) create mode 100644 components/file/aliyun/option.go create mode 100644 components/file/aliyun/oss.go create mode 100644 components/file/aws/file.go rename components/file/aws/{oss_test.go => file_test.go} (87%) create mode 100644 demo/file/s3/client.go create mode 100644 demo/file/s3/haizei.jpg diff --git a/cmd/layotto/main.go b/cmd/layotto/main.go index e89e5dde16..268e2c7937 100644 --- a/cmd/layotto/main.go +++ b/cmd/layotto/main.go @@ -18,6 +18,7 @@ package main import ( "encoding/json" + "mosn.io/layotto/components/file/aliyun" "os" "strconv" "time" @@ -32,7 +33,6 @@ import ( secretstore_env "github.com/dapr/components-contrib/secretstores/local/env" secretstore_file "github.com/dapr/components-contrib/secretstores/local/file" "mosn.io/api" - "mosn.io/layotto/components/file/alicloud" "mosn.io/layotto/components/file/aws" "mosn.io/layotto/components/file/minio" "mosn.io/layotto/components/file/qiniu" @@ -240,7 +240,7 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp // File runtime.WithFileFactory( - file.NewFileFactory("aliOSS", alicloud.NewAliCloudOSS), + file.NewFileFactory("aliyunOSS", aliyun.NewAliCloudFile), file.NewFileFactory("minioOSS", minio.NewMinioOss), file.NewFileFactory("awsOSS", aws.NewAwsFile), file.NewFileFactory("tencentCloudOSS", tencentcloud.NewTencentCloudOSS), @@ -250,6 +250,9 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp runtime.WithOssFactory( file.NewOssFactory("awsOSS", aws.NewAwsOss), ), + runtime.WithOssFactory( + file.NewOssFactory("aliyunOSS", aliyun.NewAliyunOss), + ), // PubSub runtime.WithPubSubFactory( diff --git a/cmd/layotto_multiple_api/main.go b/cmd/layotto_multiple_api/main.go index 946923dcf4..133ccf0ae7 100644 --- a/cmd/layotto_multiple_api/main.go +++ b/cmd/layotto_multiple_api/main.go @@ -42,7 +42,6 @@ import ( helloworld_api "mosn.io/layotto/cmd/layotto_multiple_api/helloworld" "mosn.io/layotto/cmd/layotto_multiple_api/helloworld/component" "mosn.io/layotto/components/custom" - "mosn.io/layotto/components/file/alicloud" "mosn.io/layotto/components/file/aws" "mosn.io/layotto/components/file/minio" "mosn.io/layotto/components/file/qiniu" @@ -250,7 +249,7 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp // File runtime.WithFileFactory( - file.NewFileFactory("aliOSS", alicloud.NewAliCloudOSS), + file.NewFileFactory("aliOSS", aliyun.NewAliCloudFile), file.NewFileFactory("minioOSS", minio.NewMinioOss), file.NewFileFactory("awsOSS", aws.NewAwsFile), file.NewFileFactory("tencentCloudOSS", tencentcloud.NewTencentCloudOSS), diff --git a/components/file/alicloud/oss.go b/components/file/aliyun/file.go similarity index 79% rename from components/file/alicloud/oss.go rename to components/file/aliyun/file.go index 412404fb89..8ffe9565c2 100644 --- a/components/file/alicloud/oss.go +++ b/components/file/aliyun/file.go @@ -14,7 +14,7 @@ * limitations under the License. */ -package alicloud +package aliyun import ( "context" @@ -34,25 +34,28 @@ const ( storageTypeKey = "storageType" ) -// AliCloudOSS is a binding for an AliCloud OSS storage bucketKey -type AliCloudOSS struct { +// AliyunOSS is a binding for an AliCloud OSS storage bucketKey +type AliyunOSS struct { metadata map[string]*OssMetadata client map[string]*oss.Client + method string + rawData json.RawMessage } type OssMetadata struct { Endpoint string `json:"endpoint"` AccessKeyID string `json:"accessKeyID"` AccessKeySecret string `json:"accessKeySecret"` + Region string `json:"region"` } -func NewAliCloudOSS() file.File { - oss := &AliCloudOSS{metadata: make(map[string]*OssMetadata), client: make(map[string]*oss.Client)} +func NewAliCloudFile() file.File { + oss := &AliyunOSS{metadata: make(map[string]*OssMetadata), client: make(map[string]*oss.Client)} return oss } // Init does metadata parsing and connection creation -func (s *AliCloudOSS) Init(ctx context.Context, metadata *file.FileConfig) error { +func (s *AliyunOSS) Init(ctx context.Context, metadata *file.FileConfig) error { m := make([]*OssMetadata, 0) err := json.Unmarshal(metadata.Metadata, &m) if err != nil { @@ -73,7 +76,7 @@ func (s *AliCloudOSS) Init(ctx context.Context, metadata *file.FileConfig) error return nil } -func (s *AliCloudOSS) Put(ctx context.Context, st *file.PutFileStu) error { +func (s *AliyunOSS) Put(ctx context.Context, st *file.PutFileStu) error { storageType := st.Metadata[storageTypeKey] if storageType == "" { storageType = "Standard" @@ -94,7 +97,7 @@ func (s *AliCloudOSS) Put(ctx context.Context, st *file.PutFileStu) error { return nil } -func (s *AliCloudOSS) Get(ctx context.Context, st *file.GetFileStu) (io.ReadCloser, error) { +func (s *AliyunOSS) Get(ctx context.Context, st *file.GetFileStu) (io.ReadCloser, error) { bucket, err := s.getBucket(st.FileName, st.Metadata) if err != nil { return nil, fmt.Errorf("get file[%s] fail, err: %s", st.FileName, err.Error()) @@ -107,7 +110,7 @@ func (s *AliCloudOSS) Get(ctx context.Context, st *file.GetFileStu) (io.ReadClos return bucket.GetObject(fileNameWithoutBucket) } -func (s *AliCloudOSS) List(ctx context.Context, request *file.ListRequest) (*file.ListResp, error) { +func (s *AliyunOSS) List(ctx context.Context, request *file.ListRequest) (*file.ListResp, error) { bucket, err := s.getBucket(request.DirectoryName, request.Metadata) if err != nil { return nil, fmt.Errorf("list directory[%s] fail, err: %s", request.DirectoryName, err.Error()) @@ -134,7 +137,7 @@ func (s *AliCloudOSS) List(ctx context.Context, request *file.ListRequest) (*fil return resp, nil } -func (s *AliCloudOSS) Del(ctx context.Context, request *file.DelRequest) error { +func (s *AliyunOSS) Del(ctx context.Context, request *file.DelRequest) error { bucket, err := s.getBucket(request.FileName, request.Metadata) if err != nil { return fmt.Errorf("del file[%s] fail, err: %s", request.FileName, err.Error()) @@ -150,7 +153,7 @@ func (s *AliCloudOSS) Del(ctx context.Context, request *file.DelRequest) error { return nil } -func (s *AliCloudOSS) Stat(ctx context.Context, request *file.FileMetaRequest) (*file.FileMetaResp, error) { +func (s *AliyunOSS) Stat(ctx context.Context, request *file.FileMetaRequest) (*file.FileMetaResp, error) { resp := &file.FileMetaResp{} resp.Metadata = make(map[string][]string) bucket, err := s.getBucket(request.FileName, request.Metadata) @@ -190,14 +193,14 @@ func (s *AliCloudOSS) Stat(ctx context.Context, request *file.FileMetaRequest) ( return resp, nil } -func (s *AliCloudOSS) checkMetadata(m *OssMetadata) bool { +func (s *AliyunOSS) checkMetadata(m *OssMetadata) bool { if m.AccessKeySecret == "" || m.Endpoint == "" || m.AccessKeyID == "" { return false } return true } -func (s *AliCloudOSS) getClient(metadata *OssMetadata) (*oss.Client, error) { +func (s *AliyunOSS) getClient(metadata *OssMetadata) (*oss.Client, error) { client, err := oss.New(metadata.Endpoint, metadata.AccessKeyID, metadata.AccessKeySecret) if err != nil { return nil, err @@ -205,7 +208,7 @@ func (s *AliCloudOSS) getClient(metadata *OssMetadata) (*oss.Client, error) { return client, nil } -func (s *AliCloudOSS) getBucket(fileName string, metaData map[string]string) (*oss.Bucket, error) { +func (s *AliyunOSS) getBucket(fileName string, metaData map[string]string) (*oss.Bucket, error) { var ossClient *oss.Client var err error // get oss client @@ -213,7 +216,7 @@ func (s *AliCloudOSS) getBucket(fileName string, metaData map[string]string) (*o ossClient = s.client[endpointKey] } else { // if user not specify endpoint, try to use default client - ossClient, err = s.selectClient() + ossClient, err = s.selectClient(map[string]string{}, "") if err != nil { return nil, err } @@ -231,13 +234,18 @@ func (s *AliCloudOSS) getBucket(fileName string, metaData map[string]string) (*o return bucket, nil } -func (s *AliCloudOSS) selectClient() (*oss.Client, error) { +func (s *AliyunOSS) selectClient(meta map[string]string, key string) (*oss.Client, error) { + // exist specific client with key endpoint + if ep, ok := meta[key]; ok { + if client, ok := s.client[ep]; ok { + return client, nil + } + } + // if not specify endpoint, select default one if len(s.client) == 1 { for _, client := range s.client { return client, nil } - } else { - return nil, fmt.Errorf("should specific endpoint in metadata") } - return nil, nil + return nil, file.ErrNotSpecifyEndpoint } diff --git a/components/file/alicloud/oss_test.go b/components/file/aliyun/file_test.go similarity index 88% rename from components/file/alicloud/oss_test.go rename to components/file/aliyun/file_test.go index c7ad7c5da1..9c0dda83e6 100644 --- a/components/file/alicloud/oss_test.go +++ b/components/file/aliyun/file_test.go @@ -14,7 +14,7 @@ * limitations under the License. */ -package alicloud +package aliyun import ( "context" @@ -41,7 +41,7 @@ const ( func TestInit(t *testing.T) { fc := file.FileConfig{} - oss := NewAliCloudOSS() + oss := NewAliCloudFile() err := oss.Init(context.TODO(), &fc) assert.Equal(t, err.Error(), "invalid argument") fc.Metadata = []byte(data) @@ -50,33 +50,33 @@ func TestInit(t *testing.T) { } func TestSelectClient(t *testing.T) { - ossObject := &AliCloudOSS{metadata: make(map[string]*OssMetadata), client: make(map[string]*oss.Client)} + ossObject := &AliyunOSS{metadata: make(map[string]*OssMetadata), client: make(map[string]*oss.Client)} - client, err := ossObject.selectClient() + client, err := ossObject.selectClient(map[string]string{}, "") assert.Equal(t, err.Error(), "should specific endpoint in metadata") assert.Nil(t, client) client1 := &oss.Client{} ossObject.client["127.0.0.1"] = client1 - client, err = ossObject.selectClient() + client, err = ossObject.selectClient(map[string]string{}, "") assert.Equal(t, client, client1) assert.Nil(t, err) client2 := &oss.Client{} ossObject.client["0.0.0.0"] = client2 - client, err = ossObject.selectClient() + client, err = ossObject.selectClient(map[string]string{}, "") assert.Equal(t, err.Error(), "should specific endpoint in metadata") assert.Nil(t, client) } func TestGetBucket(t *testing.T) { fc := file.FileConfig{} - oss := NewAliCloudOSS() + oss := NewAliCloudFile() fc.Metadata = []byte(data) err := oss.Init(context.TODO(), &fc) assert.Nil(t, err) - ac := oss.(*AliCloudOSS) + ac := oss.(*AliyunOSS) mt := make(map[string]string) bucket, err := ac.getBucket("/", mt) @@ -94,12 +94,12 @@ func TestGetBucket(t *testing.T) { func TestGetClient(t *testing.T) { fc := file.FileConfig{} - oss := NewAliCloudOSS() + oss := NewAliCloudFile() fc.Metadata = []byte(data) err := oss.Init(context.TODO(), &fc) assert.Nil(t, err) - ac := oss.(*AliCloudOSS) + ac := oss.(*AliyunOSS) mt := &OssMetadata{ Endpoint: "endpoint", AccessKeyID: "ak", @@ -115,12 +115,12 @@ func TestGetClient(t *testing.T) { func TestCheckMetadata(t *testing.T) { fc := file.FileConfig{} - oss := NewAliCloudOSS() + oss := NewAliCloudFile() fc.Metadata = []byte(data) err := oss.Init(context.TODO(), &fc) assert.Nil(t, err) - ac := oss.(*AliCloudOSS) + ac := oss.(*AliyunOSS) mt := &OssMetadata{ Endpoint: "", AccessKeyID: "", @@ -138,7 +138,7 @@ func TestCheckMetadata(t *testing.T) { func TestPut(t *testing.T) { fc := file.FileConfig{} - oss := NewAliCloudOSS() + oss := NewAliCloudFile() fc.Metadata = []byte(data) err := oss.Init(context.TODO(), &fc) assert.Nil(t, err) @@ -156,7 +156,7 @@ func TestPut(t *testing.T) { func TestGet(t *testing.T) { fc := file.FileConfig{} - oss := NewAliCloudOSS() + oss := NewAliCloudFile() fc.Metadata = []byte(data) err := oss.Init(context.TODO(), &fc) assert.Nil(t, err) @@ -177,7 +177,7 @@ func TestGet(t *testing.T) { func TestStat(t *testing.T) { fc := file.FileConfig{} - oss := NewAliCloudOSS() + oss := NewAliCloudFile() fc.Metadata = []byte(data) err := oss.Init(context.TODO(), &fc) assert.Nil(t, err) @@ -198,7 +198,7 @@ func TestStat(t *testing.T) { func TestList(t *testing.T) { fc := file.FileConfig{} - oss := NewAliCloudOSS() + oss := NewAliCloudFile() fc.Metadata = []byte(data) err := oss.Init(context.TODO(), &fc) assert.Nil(t, err) @@ -220,7 +220,7 @@ func TestList(t *testing.T) { func TestDel(t *testing.T) { fc := file.FileConfig{} - oss := NewAliCloudOSS() + oss := NewAliCloudFile() fc.Metadata = []byte(data) err := oss.Init(context.TODO(), &fc) assert.Nil(t, err) diff --git a/components/file/aliyun/option.go b/components/file/aliyun/option.go new file mode 100644 index 0000000000..05617db064 --- /dev/null +++ b/components/file/aliyun/option.go @@ -0,0 +1,46 @@ +package aliyun + +import "github.com/aliyun/aliyun-oss-go-sdk/oss" + +// Prefix is an option to set prefix parameter +func Prefix(value string) oss.Option { + if value == "" { + return nil + } + return oss.Prefix(value) +} + +func KeyMarker(value string) oss.Option { + if value == "" { + return nil + } + return oss.KeyMarker(value) +} + +func MaxUploads(value int) oss.Option { + if value <= 0 { + return nil + } + return oss.MaxUploads(value) +} + +func Delimiter(value string) oss.Option { + if value == "" { + return nil + } + + return oss.Delimiter(value) +} +func UploadIDMarker(value string) oss.Option { + if value == "" { + return nil + } + return oss.UploadIDMarker(value) +} + +func VersionId(value string) oss.Option { + if value == "" { + return nil + } + return oss.VersionId(value) +} diff --git a/components/file/aliyun/oss.go b/components/file/aliyun/oss.go new file mode 100644 index 0000000000..0638a24811 --- /dev/null +++ b/components/file/aliyun/oss.go @@ -0,0 +1,454 @@ +package aliyun + +import ( + "context" + "encoding/json" + "github.com/aliyun/aliyun-oss-go-sdk/oss" + "io" + "mosn.io/layotto/components/file" + "mosn.io/layotto/components/file/factory" +) + +const ( + DefaultClientInitFunc = "aliyun" +) + +func NewAliyunOss() file.Oss { + return &AliyunOSS{ + client: make(map[string]*oss.Client), + metadata: make(map[string]*OssMetadata), + } +} + +func init() { + factory.RegisterInitFunc(DefaultClientInitFunc, AliyunDefaultInitFunc) +} + +func AliyunDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string) (map[string]interface{}, error) { + m := make([]*OssMetadata, 0) + clients := make(map[string]interface{}) + err := json.Unmarshal(staticConf, &m) + if err != nil { + return nil, file.ErrInvalid + } + + for _, v := range m { + client, err := oss.New(v.Endpoint, v.AccessKeyID, v.AccessKeySecret) + if err != nil { + return nil, err + } + clients[v.Endpoint] = client + } + return clients, nil +} + +func (a *AliyunOSS) InitConfig(ctx context.Context, config *file.FileConfig) error { + a.method = config.Method + a.rawData = config.Metadata + return nil +} + +func (a *AliyunOSS) InitClient(ctx context.Context, req *file.InitRequest) error { + if a.method == "" { + a.method = DefaultClientInitFunc + } + initFunc := factory.GetInitFunc(a.method) + clients, err := initFunc(a.rawData, req.Metadata) + if err != nil { + return err + } + for k, v := range clients { + a.client[k] = v.(*oss.Client) + } + return nil +} + +func (a *AliyunOSS) GetObject(ctx context.Context, req *file.GetObjectInput) (io.ReadCloser, error) { + client, err := a.selectClient(map[string]string{}, "") + if err != nil { + return nil, err + } + bucket, err := client.Bucket(req.Bucket) + if err != nil { + return nil, err + } + body, err := bucket.GetObject(req.Key) + return body, err +} + +func (a *AliyunOSS) PutObject(ctx context.Context, req *file.PutObjectInput) (*file.PutObjectOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + err = bucket.PutObject(req.Key, req.DataStream) + return &file.PutObjectOutput{}, err +} + +func (a *AliyunOSS) DeleteObject(ctx context.Context, req *file.DeleteObjectInput) (*file.DeleteObjectOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + err = bucket.DeleteObject(req.Key) + return &file.DeleteObjectOutput{}, err +} +func (a *AliyunOSS) DeleteObjects(ctx context.Context, req *file.DeleteObjectsInput) (*file.DeleteObjectsOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + var objects []string + for _, v := range req.Delete.Objects { + objects = append(objects, v.Key) + } + resp, err := bucket.DeleteObjects(objects) + if err != nil { + return nil, err + } + out := &file.DeleteObjectsOutput{} + for _, v := range resp.DeletedObjects { + object := &file.DeletedObject{Key: v} + out.Deleted = append(out.Deleted, object) + } + return out, err +} + +//object标签 +func (a *AliyunOSS) PutObjectTagging(ctx context.Context, req *file.PutBucketTaggingInput) (*file.PutBucketTaggingOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + tagging := oss.Tagging{} + for k, v := range req.Tags { + tag := oss.Tag{Key: k, Value: v} + tagging.Tags = append(tagging.Tags, tag) + } + err = bucket.PutObjectTagging(req.Key, tagging) + return nil, err +} + +func (a *AliyunOSS) DeleteObjectTagging(ctx context.Context, req *file.DeleteObjectTaggingInput) (*file.DeleteObjectTaggingOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + err = bucket.DeleteObjectTagging(req.Key) + return nil, err +} + +func (a *AliyunOSS) GetObjectTagging(ctx context.Context, req *file.GetObjectTaggingInput) (*file.GetObjectTaggingOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + resp, err := bucket.GetObjectTagging(req.Key) + if err != nil { + return nil, err + } + out := &file.GetObjectTaggingOutput{Tags: map[string]string{}} + for _, v := range resp.Tags { + out.Tags[v.Key] = v.Value + } + return out, err +} + +func (a *AliyunOSS) GetObjectAcl(ctx context.Context, req *file.GetObjectAclInput) (*file.GetObjectAclOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + resp, err := bucket.GetObjectACL(req.Key) + if err != nil { + return nil, err + } + output := &file.GetObjectAclOutput{Owner: &file.Owner{DisplayName: resp.Owner.DisplayName, ID: resp.Owner.ID}} + grant := &file.Grant{&file.Grantee{DisplayName: resp.Owner.DisplayName, ID: resp.Owner.ID}, resp.ACL} + output.Grants = append(output.Grants, grant) + return output, err +} +func (a *AliyunOSS) PutObjectAcl(ctx context.Context, req *file.PutObjectAclInput) (*file.PutObjectAclOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + err = bucket.SetObjectACL(req.Key, oss.ACLType(req.Acl)) + output := &file.PutObjectAclOutput{} + return output, err +} +func (a *AliyunOSS) ListObjects(ctx context.Context, req *file.ListObjectsInput) (*file.ListObjectsOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + resp, err := bucket.ListObjects() + if err != nil { + return nil, err + } + out := &file.ListObjectsOutput{ + CommonPrefixes: resp.CommonPrefixes, + Delimiter: resp.Delimiter, + IsTruncated: resp.IsTruncated, + Marker: resp.Marker, + MaxKeys: int32(resp.MaxKeys), + NextMarker: resp.NextMarker, + Prefix: resp.Prefix, + } + for _, v := range resp.Objects { + object := &file.Object{ + ETag: v.ETag, + Key: v.Key, + LastModified: v.LastModified.Unix(), + Owner: &file.Owner{ID: v.Owner.ID, DisplayName: v.Owner.DisplayName}, + Size: v.Size, + StorageClass: v.StorageClass, + } + out.Contents = append(out.Contents, object) + } + return out, nil +} +func (a *AliyunOSS) CopyObject(ctx context.Context, req *file.CopyObjectInput) (*file.CopyObjectOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + resp, err := bucket.CopyObject(req.CopySource.CopySourceKey, req.Key, VersionId(req.CopySource.CopySourceVersionId)) + if err != nil { + return nil, err + } + out := &file.CopyObjectOutput{CopyObjectResult: &file.CopyObjectResult{ETag: resp.ETag, LastModified: resp.LastModified.Unix()}} + return out, err +} + +func (a *AliyunOSS) CreateMultipartUpload(ctx context.Context, req *file.CreateMultipartUploadInput) (*file.CreateMultipartUploadOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + resp, err := bucket.InitiateMultipartUpload(req.Key) + output := &file.CreateMultipartUploadOutput{Bucket: resp.Bucket, Key: resp.Key, UploadId: resp.UploadID} + return output, err +} +func (a *AliyunOSS) UploadPart(ctx context.Context, req *file.UploadPartInput) (*file.UploadPartOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + resp, err := bucket.UploadPart( + oss.InitiateMultipartUploadResult{Bucket: req.Bucket, Key: req.Key, UploadID: req.UploadId}, + req.DataStream, + req.ContentLength, + int(req.PartNumber)) + output := &file.UploadPartOutput{ETag: resp.ETag} + return output, err +} +func (a *AliyunOSS) UploadPartCopy(ctx context.Context, req *file.UploadPartCopyInput) (*file.UploadPartCopyOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + resp, err := bucket.UploadPartCopy( + oss.InitiateMultipartUploadResult{Bucket: req.Bucket, Key: req.Key, UploadID: req.UploadId}, + req.CopySource.CopySourceBucket, + req.CopySource.CopySourceKey, + req.StartPosition, + req.PartSize, + int(req.PartNumber), + VersionId(req.CopySource.CopySourceVersionId), + ) + output := &file.UploadPartCopyOutput{CopyPartResult: &file.CopyPartResult{ETag: resp.ETag}} + return output, err +} +func (a *AliyunOSS) CompleteMultipartUpload(ctx context.Context, req *file.CompleteMultipartUploadInput) (*file.CompleteMultipartUploadOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + + parts := make([]oss.UploadPart, 0) + if req.MultipartUpload != nil { + for _, v := range req.MultipartUpload.Parts { + part := oss.UploadPart{PartNumber: int(v.PartNumber), ETag: v.ETag} + parts = append(parts, part) + } + } + resp, err := bucket.CompleteMultipartUpload( + oss.InitiateMultipartUploadResult{Bucket: req.Bucket, Key: req.Key, UploadID: req.UploadId}, + parts, + ) + output := &file.CompleteMultipartUploadOutput{Location: resp.Location, Bucket: resp.Bucket, Key: resp.Key, ETag: resp.ETag} + return output, err +} +func (a *AliyunOSS) AbortMultipartUpload(ctx context.Context, req *file.AbortMultipartUploadInput) (*file.AbortMultipartUploadOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + + err = bucket.AbortMultipartUpload( + oss.InitiateMultipartUploadResult{Bucket: req.Bucket, Key: req.Key, UploadID: req.UploadId}, + ) + output := &file.AbortMultipartUploadOutput{} + return output, err +} +func (a *AliyunOSS) ListMultipartUploads(ctx context.Context, req *file.ListMultipartUploadsInput) (*file.ListMultipartUploadsOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + resp, err := bucket.ListMultipartUploads(Prefix(req.Prefix), KeyMarker(req.KeyMarker), MaxUploads(int(req.MaxUploads)), Delimiter(req.Delimiter), UploadIDMarker(req.UploadIdMarker)) + output := &file.ListMultipartUploadsOutput{ + Bucket: resp.Bucket, + Delimiter: resp.Delimiter, + Prefix: resp.Prefix, + KeyMarker: resp.KeyMarker, + UploadIdMarker: resp.UploadIDMarker, + NextKeyMarker: resp.NextKeyMarker, + NextUploadIdMarker: resp.NextUploadIDMarker, + MaxUploads: int32(resp.MaxUploads), + IsTruncated: resp.IsTruncated, + CommonPrefixes: resp.CommonPrefixes, + } + for _, v := range resp.Uploads { + upload := &file.MultipartUpload{Initiated: v.Initiated.Unix(), UploadId: v.UploadID, Key: v.Key} + output.Uploads = append(output.Uploads, upload) + } + return output, err +} + +//未测试 +func (a *AliyunOSS) RestoreObject(ctx context.Context, req *file.RestoreObjectInput) (*file.RestoreObjectOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + err = bucket.RestoreObject(req.Key) + output := &file.RestoreObjectOutput{} + return output, err +} + +//当前不允许该操作 +func (a *AliyunOSS) ListObjectVersions(ctx context.Context, req *file.ListObjectVersionsInput) (*file.ListObjectVersionsOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + resp, err := bucket.ListObjectVersions() + output := &file.ListObjectVersionsOutput{ + Name: resp.Name, + Prefix: resp.Prefix, + KeyMarker: resp.KeyMarker, + VersionIdMarker: resp.VersionIdMarker, + MaxKeys: int32(resp.MaxKeys), + Delimiter: resp.Delimiter, + IsTruncated: resp.IsTruncated, + NextKeyMarker: resp.NextKeyMarker, + NextVersionIdMarker: resp.NextVersionIdMarker, + CommonPrefixes: resp.CommonPrefixes, + } + for _, v := range resp.ObjectDeleteMarkers { + marker := &file.DeleteMarkerEntry{ + IsLatest: v.IsLatest, + Key: v.Key, + LastModified: v.LastModified.Unix(), + Owner: &file.Owner{ + ID: v.Owner.ID, + DisplayName: v.Owner.DisplayName, + }, + VersionId: v.VersionId, + } + output.DeleteMarkers = append(output.DeleteMarkers, marker) + } + + for _, v := range resp.ObjectVersions { + version := &file.ObjectVersion{ + ETag: v.ETag, + IsLatest: v.IsLatest, + Key: v.Key, + LastModified: v.LastModified.Unix(), + Owner: &file.Owner{ + ID: v.Owner.ID, + DisplayName: v.Owner.DisplayName, + }, + Size: v.Size, + StorageClass: v.StorageClass, + VersionId: v.VersionId, + } + output.Versions = append(output.Versions, version) + } + + return output, err +} diff --git a/components/file/aws/file.go b/components/file/aws/file.go new file mode 100644 index 0000000000..01bc03eb15 --- /dev/null +++ b/components/file/aws/file.go @@ -0,0 +1,290 @@ +/* +* 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 aws + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "github.com/aws/aws-sdk-go-v2/aws" + 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" + "io" + "mosn.io/layotto/components/file" + "mosn.io/layotto/components/file/util" + "strings" +) + +const ( + endpointKey = "endpoint" + bucketKey = "bucket" + defaultCredentialsSource = "provider" + fileLength = "length" +) + +// AwsOss is a binding for aws oss storage. +type AwsOss struct { + client map[string]*s3.Client + meta map[string]*AwsOssMetaData + method string + rawData json.RawMessage +} + +// AwsOssMetaData describe a aws-oss instance. +type AwsOssMetaData struct { + Region string `json:"region"` // eg. us-west-2 + EndPoint string `json:"endpoint"` // eg. protocol://service-code.region-code.amazonaws.com + AccessKeyID string `json:"accessKeyID"` + AccessKeySecret string `json:"accessKeySecret"` +} + +func NewAwsFile() file.File { + return &AwsOss{ + client: make(map[string]*s3.Client), + meta: make(map[string]*AwsOssMetaData), + } +} + +// Init instance by config. +func (a *AwsOss) Init(ctx context.Context, config *file.FileConfig) error { + m := make([]*AwsOssMetaData, 0) + err := json.Unmarshal(config.Metadata, &m) + if err != nil { + return errors.New("invalid config for aws oss") + } + for _, data := range m { + if !data.isAwsMetaValid() { + return errors.New("invalid config for aws oss") + } + client, err := a.createOssClient(data) + if err != nil { + continue + } + a.client[data.EndPoint] = client + a.meta[data.EndPoint] = data + } + return nil +} + +// isAwsMetaValid check if the metadata valid. +func (am *AwsOssMetaData) isAwsMetaValid() bool { + if am.AccessKeySecret == "" || am.EndPoint == "" || am.AccessKeyID == "" { + return false + } + return true +} + +// createOssClient by input meta info. +func (a *AwsOss) createOssClient(meta *AwsOssMetaData) (*s3.Client, error) { + customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) { + if region == meta.Region { + return aws.Endpoint{ + PartitionID: "awsoss", + URL: "https://" + meta.EndPoint, + SigningRegion: meta.Region, + HostnameImmutable: true, + }, nil + } + // returning EndpointNotFoundError will allow the service to fallback to it's default resolution + return aws.Endpoint{}, &aws.EndpointNotFoundError{} + }) + + optFunc := []func(options *aws_config.LoadOptions) error{ + aws_config.WithRegion(meta.Region), + aws_config.WithCredentialsProvider(credentials.StaticCredentialsProvider{ + Value: aws.Credentials{ + AccessKeyID: meta.AccessKeyID, SecretAccessKey: meta.AccessKeySecret, + Source: defaultCredentialsSource, + }, + }), + aws_config.WithEndpointResolverWithOptions(customResolver), + } + + cfg, err := aws_config.LoadDefaultConfig(context.TODO(), optFunc...) + if err != nil { + return nil, err + } + return s3.NewFromConfig(cfg), nil +} + +// Put file to aws oss. +func (a *AwsOss) Put(ctx context.Context, st *file.PutFileStu) error { + //var bodySize int64 + bucket, err := util.GetBucketName(st.FileName) + if err != nil { + return fmt.Errorf("awsoss put file[%s] fail,err: %s", st.FileName, err.Error()) + } + key, err := util.GetFileName(st.FileName) + if err != nil { + return fmt.Errorf("awsoss put file[%s] fail,err: %s", st.FileName, err.Error()) + } + client, err := a.selectClient(st.Metadata, endpointKey) + if err != nil { + return err + } + uploader := manager.NewUploader(client) + _, err = uploader.Upload(context.TODO(), &s3.PutObjectInput{ + Bucket: &bucket, + Key: &key, + Body: st.DataStream, + }) + + if err != nil { + return err + } + return nil +} + +// selectClient choose aws client from exist client-map, key is endpoint, value is client instance. +func (a *AwsOss) selectClient(meta map[string]string, key string) (*s3.Client, error) { + // exist specific client with key endpoint + if ep, ok := meta[key]; ok { + if client, ok := a.client[ep]; ok { + return client, nil + } + } + // if not specify endpoint, select default one + if len(a.client) == 1 { + for _, client := range a.client { + return client, nil + } + } + return nil, file.ErrNotSpecifyEndpoint +} + +// Get object from aws oss. +func (a *AwsOss) Get(ctx context.Context, st *file.GetFileStu) (io.ReadCloser, error) { + bucket, err := util.GetBucketName(st.FileName) + if err != nil { + return nil, fmt.Errorf("awsoss get file[%s] fail,err: %s", st.FileName, err.Error()) + } + key, err := util.GetFileName(st.FileName) + if err != nil { + return nil, fmt.Errorf("awsoss get file[%s] fail,err: %s", st.FileName, err.Error()) + } + input := &s3.GetObjectInput{ + Bucket: &bucket, + Key: &key, + } + client, err := a.selectClient(st.Metadata, endpointKey) + if err != nil { + return nil, err + } + ob, err := client.GetObject(context.TODO(), input) + if err != nil { + return nil, err + } + return ob.Body, nil +} + +// List objects from aws oss. +func (a *AwsOss) List(ctx context.Context, st *file.ListRequest) (*file.ListResp, error) { + bucket, err := util.GetBucketName(st.DirectoryName) + if err != nil { + return nil, fmt.Errorf("list bucket[%s] fail, err: %s", st.DirectoryName, err.Error()) + } + prefix := util.GetFilePrefixName(st.DirectoryName) + input := &s3.ListObjectsInput{ + Bucket: &bucket, + MaxKeys: st.PageSize, + Marker: &st.Marker, + Prefix: &prefix, + } + client, err := a.selectClient(st.Metadata, endpointKey) + if err != nil { + return nil, fmt.Errorf("list bucket[%s] fail, err: %s", st.DirectoryName, err.Error()) + } + out, err := client.ListObjects(context.TODO(), input) + if err != nil { + return nil, fmt.Errorf("list bucket[%s] fail, err: %s", st.DirectoryName, err.Error()) + } + resp := &file.ListResp{} + resp.IsTruncated = out.IsTruncated + marker := "" + for _, v := range out.Contents { + file := &file.FilesInfo{} + file.FileName = *v.Key + file.Size = v.Size + file.LastModified = v.LastModified.String() + resp.Files = append(resp.Files, file) + marker = *v.Key + } + resp.Marker = marker + return resp, nil +} + +// Del object in aws oss. +func (a *AwsOss) Del(ctx context.Context, st *file.DelRequest) error { + bucket, err := util.GetBucketName(st.FileName) + if err != nil { + return fmt.Errorf("awsoss put file[%s] fail,err: %s", st.FileName, err.Error()) + } + key, err := util.GetFileName(st.FileName) + if err != nil { + return fmt.Errorf("awsoss put file[%s] fail,err: %s", st.FileName, err.Error()) + } + input := &s3.DeleteObjectInput{ + Bucket: &bucket, + Key: &key, + } + client, err := a.selectClient(st.Metadata, endpointKey) + if err != nil { + return err + } + _, err = client.DeleteObject(ctx, input) + if err != nil { + return err + } + return nil +} +func (a *AwsOss) Stat(ctx context.Context, st *file.FileMetaRequest) (*file.FileMetaResp, error) { + bucket, err := util.GetBucketName(st.FileName) + if err != nil { + return nil, fmt.Errorf("awsoss stat file[%s] fail,err: %s", st.FileName, err.Error()) + } + key, err := util.GetFileName(st.FileName) + if err != nil { + return nil, fmt.Errorf("awsoss stat file[%s] fail,err: %s", st.FileName, err.Error()) + } + input := &s3.HeadObjectInput{ + Bucket: &bucket, + Key: &key, + } + client, err := a.selectClient(st.Metadata, endpointKey) + if err != nil { + return nil, err + } + out, err := client.HeadObject(ctx, input) + if err != nil { + if strings.Contains(err.Error(), "no such key") { + return nil, file.ErrNotExist + } + return nil, fmt.Errorf("awsoss stat file[%s] fail,err: %s", st.FileName, err.Error()) + } + resp := &file.FileMetaResp{} + resp.Size = out.ContentLength + resp.LastModified = out.LastModified.String() + resp.Metadata = make(map[string][]string) + resp.Metadata[util.ETag] = append(resp.Metadata[util.ETag], *out.ETag) + for k, v := range out.Metadata { + resp.Metadata[k] = append(resp.Metadata[k], v) + } + return resp, nil +} diff --git a/components/file/aws/oss_test.go b/components/file/aws/file_test.go similarity index 87% rename from components/file/aws/oss_test.go rename to components/file/aws/file_test.go index 1176029e1c..74232c8e94 100644 --- a/components/file/aws/oss_test.go +++ b/components/file/aws/file_test.go @@ -18,6 +18,9 @@ package aws import ( "context" + "fmt" + "github.com/jinzhu/copier" + "reflect" "testing" "github.com/aws/aws-sdk-go-v2/service/s3" @@ -122,3 +125,24 @@ func TestAwsOss_Get(t *testing.T) { _, err = oss.Get(context.Background(), req) assert.Equal(t, err.Error(), "awsoss get file[/a.txt] fail,err: invalid fileName format") } + +type fun = func() (string, error) + +func TestCopier(t *testing.T) { + hello := "hello" + target := &file.ListObjectsOutput{} + source := &s3.ListObjectsOutput{Delimiter: &hello, EncodingType: "encoding type"} + re := reflect.TypeOf(source) + h, _ := re.Elem().FieldByName("EncodingType") + fmt.Println(h.Type.Name(), h.Type.Kind()) + err := copier.Copy(target, source) + if err != nil { + t.Fail() + } + var s fun + if s == nil { + fmt.Printf("s is nil \n") + } + fmt.Println(target) + +} diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index 4b9cca742b..c93ee55503 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -1,55 +1,31 @@ -/* -* 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 aws import ( "context" "encoding/json" "errors" - "fmt" "github.com/aws/aws-sdk-go-v2/aws" 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" - "google.golang.org/protobuf/types/known/timestamppb" + "github.com/jinzhu/copier" "io" - "mosn.io/layotto/components/file/factory" - "mosn.io/layotto/components/file/util" - "strings" - "mosn.io/layotto/components/file" + "mosn.io/layotto/components/file/factory" + "mosn.io/pkg/log" + "time" ) const ( - endpointKey = "endpoint" - bucketKey = "bucket" - defaultCredentialsSource = "provider" - fileLength = "length" -) - -var ( - ErrNotSpecifyEndpoint error = errors.New("should specific endpoint in metadata") + DefaultClientInitFunc = "aws" ) func init() { - factory.RegisterInitFunc("", AwsDefaultInitFunc) + factory.RegisterInitFunc(DefaultClientInitFunc, AwsDefaultInitFunc) } + func AwsDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string) (map[string]interface{}, error) { m := make([]*AwsOssMetaData, 0) err := json.Unmarshal(staticConf, &m) @@ -91,274 +67,6 @@ func AwsDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string) ( return clients, nil } -// AwsOss is a binding for aws oss storage. -type AwsOss struct { - client map[string]*s3.Client - meta map[string]*AwsOssMetaData - method string - rawData json.RawMessage -} - -// AwsOssMetaData describe a aws-oss instance. -type AwsOssMetaData struct { - Region string `json:"region"` // eg. us-west-2 - EndPoint string `json:"endpoint"` // eg. protocol://service-code.region-code.amazonaws.com - AccessKeyID string `json:"accessKeyID"` - AccessKeySecret string `json:"accessKeySecret"` -} - -func NewAwsFile() file.File { - return &AwsOss{ - client: make(map[string]*s3.Client), - meta: make(map[string]*AwsOssMetaData), - } -} - -// Init instance by config. -func (a *AwsOss) Init(ctx context.Context, config *file.FileConfig) error { - m := make([]*AwsOssMetaData, 0) - err := json.Unmarshal(config.Metadata, &m) - if err != nil { - return errors.New("invalid config for aws oss") - } - for _, data := range m { - if !data.isAwsMetaValid() { - return errors.New("invalid config for aws oss") - } - client, err := a.createOssClient(data) - if err != nil { - continue - } - a.client[data.EndPoint] = client - a.meta[data.EndPoint] = data - } - return nil -} - -// isAwsMetaValid check if the metadata valid. -func (am *AwsOssMetaData) isAwsMetaValid() bool { - if am.AccessKeySecret == "" || am.EndPoint == "" || am.AccessKeyID == "" { - return false - } - return true -} - -// createOssClient by input meta info. -func (a *AwsOss) createOssClient(meta *AwsOssMetaData) (*s3.Client, error) { - customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) { - if region == meta.Region { - return aws.Endpoint{ - PartitionID: "awsoss", - URL: "https://" + meta.EndPoint, - SigningRegion: meta.Region, - HostnameImmutable: true, - }, nil - } - // returning EndpointNotFoundError will allow the service to fallback to it's default resolution - return aws.Endpoint{}, &aws.EndpointNotFoundError{} - }) - - optFunc := []func(options *aws_config.LoadOptions) error{ - aws_config.WithRegion(meta.Region), - aws_config.WithCredentialsProvider(credentials.StaticCredentialsProvider{ - Value: aws.Credentials{ - AccessKeyID: meta.AccessKeyID, SecretAccessKey: meta.AccessKeySecret, - Source: defaultCredentialsSource, - }, - }), - aws_config.WithEndpointResolverWithOptions(customResolver), - } - - cfg, err := aws_config.LoadDefaultConfig(context.TODO(), optFunc...) - if err != nil { - return nil, err - } - return s3.NewFromConfig(cfg), nil -} - -// Put file to aws oss. -func (a *AwsOss) Put(ctx context.Context, st *file.PutFileStu) error { - //var bodySize int64 - bucket, err := util.GetBucketName(st.FileName) - if err != nil { - return fmt.Errorf("awsoss put file[%s] fail,err: %s", st.FileName, err.Error()) - } - key, err := util.GetFileName(st.FileName) - if err != nil { - return fmt.Errorf("awsoss put file[%s] fail,err: %s", st.FileName, err.Error()) - } - //if fileLen, ok := st.Metadata[fileLength]; !ok { - // return errors.New("please specific the file lenth in metadata with length key") - //} else { - // bodySize, err = strconv.ParseInt(fileLen, 10, 64) - // if err != nil { - // return errors.New("wrong value of length") - // } - //} - - //input := &s3.PutObjectInput{ - // Bucket: &bucket, - // Key: &key, - // Body: st.DataStream, - // ContentLength: bodySize, - //} - client, err := a.selectClient(st.Metadata, endpointKey) - if err != nil { - return err - } - uploader := manager.NewUploader(client) - _, err = uploader.Upload(context.TODO(), &s3.PutObjectInput{ - Bucket: &bucket, - Key: &key, - Body: st.DataStream, - }) - - //_, err = client.PutObject(context.TODO(), input, s3.WithAPIOptions( - // v4.SwapComputePayloadSHA256ForUnsignedPayloadMiddleware, - //)) - if err != nil { - return err - } - return nil -} - -// selectClient choose aws client from exist client-map, key is endpoint, value is client instance. -func (a *AwsOss) selectClient(meta map[string]string, key string) (*s3.Client, error) { - // exist specific client with key endpoint - if ep, ok := meta[key]; ok { - if client, ok := a.client[ep]; ok { - return client, nil - } - } - // if not specify endpoint, select default one - if len(a.client) == 1 { - for _, client := range a.client { - return client, nil - } - } - return nil, ErrNotSpecifyEndpoint -} - -// Get object from aws oss. -func (a *AwsOss) Get(ctx context.Context, st *file.GetFileStu) (io.ReadCloser, error) { - bucket, err := util.GetBucketName(st.FileName) - if err != nil { - return nil, fmt.Errorf("awsoss get file[%s] fail,err: %s", st.FileName, err.Error()) - } - key, err := util.GetFileName(st.FileName) - if err != nil { - return nil, fmt.Errorf("awsoss get file[%s] fail,err: %s", st.FileName, err.Error()) - } - input := &s3.GetObjectInput{ - Bucket: &bucket, - Key: &key, - } - client, err := a.selectClient(st.Metadata, endpointKey) - if err != nil { - return nil, err - } - ob, err := client.GetObject(context.TODO(), input) - if err != nil { - return nil, err - } - return ob.Body, nil -} - -// List objects from aws oss. -func (a *AwsOss) List(ctx context.Context, st *file.ListRequest) (*file.ListResp, error) { - bucket, err := util.GetBucketName(st.DirectoryName) - if err != nil { - return nil, fmt.Errorf("list bucket[%s] fail, err: %s", st.DirectoryName, err.Error()) - } - prefix := util.GetFilePrefixName(st.DirectoryName) - input := &s3.ListObjectsInput{ - Bucket: &bucket, - MaxKeys: st.PageSize, - Marker: &st.Marker, - Prefix: &prefix, - } - client, err := a.selectClient(st.Metadata, endpointKey) - if err != nil { - return nil, fmt.Errorf("list bucket[%s] fail, err: %s", st.DirectoryName, err.Error()) - } - out, err := client.ListObjects(context.TODO(), input) - if err != nil { - return nil, fmt.Errorf("list bucket[%s] fail, err: %s", st.DirectoryName, err.Error()) - } - resp := &file.ListResp{} - resp.IsTruncated = out.IsTruncated - marker := "" - for _, v := range out.Contents { - file := &file.FilesInfo{} - file.FileName = *v.Key - file.Size = v.Size - file.LastModified = v.LastModified.String() - resp.Files = append(resp.Files, file) - marker = *v.Key - } - resp.Marker = marker - return resp, nil -} - -// Del object in aws oss. -func (a *AwsOss) Del(ctx context.Context, st *file.DelRequest) error { - bucket, err := util.GetBucketName(st.FileName) - if err != nil { - return fmt.Errorf("awsoss put file[%s] fail,err: %s", st.FileName, err.Error()) - } - key, err := util.GetFileName(st.FileName) - if err != nil { - return fmt.Errorf("awsoss put file[%s] fail,err: %s", st.FileName, err.Error()) - } - input := &s3.DeleteObjectInput{ - Bucket: &bucket, - Key: &key, - } - client, err := a.selectClient(st.Metadata, endpointKey) - if err != nil { - return err - } - _, err = client.DeleteObject(ctx, input) - if err != nil { - return err - } - return nil -} -func (a *AwsOss) Stat(ctx context.Context, st *file.FileMetaRequest) (*file.FileMetaResp, error) { - bucket, err := util.GetBucketName(st.FileName) - if err != nil { - return nil, fmt.Errorf("awsoss stat file[%s] fail,err: %s", st.FileName, err.Error()) - } - key, err := util.GetFileName(st.FileName) - if err != nil { - return nil, fmt.Errorf("awsoss stat file[%s] fail,err: %s", st.FileName, err.Error()) - } - input := &s3.HeadObjectInput{ - Bucket: &bucket, - Key: &key, - } - client, err := a.selectClient(st.Metadata, endpointKey) - if err != nil { - return nil, err - } - out, err := client.HeadObject(ctx, input) - if err != nil { - if strings.Contains(err.Error(), "no such key") { - return nil, file.ErrNotExist - } - return nil, fmt.Errorf("awsoss stat file[%s] fail,err: %s", st.FileName, err.Error()) - } - resp := &file.FileMetaResp{} - resp.Size = out.ContentLength - resp.LastModified = out.LastModified.String() - resp.Metadata = make(map[string][]string) - resp.Metadata[util.ETag] = append(resp.Metadata[util.ETag], *out.ETag) - for k, v := range out.Metadata { - resp.Metadata[k] = append(resp.Metadata[k], v) - } - return resp, nil -} - func NewAwsOss() file.Oss { return &AwsOss{ client: make(map[string]*s3.Client), @@ -373,6 +81,9 @@ func (a *AwsOss) InitConfig(ctx context.Context, config *file.FileConfig) error } func (a *AwsOss) InitClient(ctx context.Context, req *file.InitRequest) error { + if a.method == "" { + a.method = DefaultClientInitFunc + } initFunc := factory.GetInitFunc(a.method) clients, err := initFunc(a.rawData, req.Metadata) if err != nil { @@ -414,7 +125,7 @@ func (a *AwsOss) PutObject(ctx context.Context, req *file.PutObjectInput) (*file if err != nil { return nil, err } - return &file.PutObjectOutput{BucketKeyEnabled: resp.BucketKeyEnabled, Etag: *resp.ETag}, err + return &file.PutObjectOutput{BucketKeyEnabled: resp.BucketKeyEnabled, ETag: *resp.ETag}, err } func (a *AwsOss) DeleteObject(ctx context.Context, req *file.DeleteObjectInput) (*file.DeleteObjectOutput, error) { @@ -439,12 +150,14 @@ func (a *AwsOss) PutObjectTagging(ctx context.Context, req *file.PutBucketTaggin return nil, err } input := &s3.PutObjectTaggingInput{ - Bucket: &req.Bucket, - Key: &req.Key, - Tagging: &types.Tagging{}, + Bucket: &req.Bucket, + Key: &req.Key, + Tagging: &types.Tagging{}, + VersionId: &req.VersionId, } 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) @@ -492,10 +205,13 @@ func (a *AwsOss) CopyObject(ctx context.Context, req *file.CopyObjectInput) (*fi if err != nil { return nil, err } + + //TODO: should support objects accessed through access points + copySource := req.CopySource.CopySourceBucket + "/" + req.CopySource.CopySourceKey + "?versionId=" + req.CopySource.CopySourceVersionId input := &s3.CopyObjectInput{ Bucket: &req.Bucket, Key: &req.Key, - CopySource: &req.CopySource, + CopySource: ©Source, } _, err = client.CopyObject(ctx, input) if err != nil { @@ -528,34 +244,54 @@ func (a *AwsOss) ListObjects(ctx context.Context, req *file.ListObjectsInput) (* if err != nil { return nil, err } - input := &s3.ListObjectsInput{ - Bucket: &req.Bucket, - Delimiter: &req.Delimiter, - EncodingType: types.EncodingType(req.EncodingType), - ExpectedBucketOwner: &req.ExpectedBucketOwner, - Marker: &req.Marker, - MaxKeys: req.MaxKeys, - Prefix: &req.Prefix, - RequestPayer: types.RequestPayer(req.RequestPayer), - } + //input := &s3.ListObjectsInput{ + // Bucket: &req.Bucket, + // Delimiter: &req.Delimiter, + // EncodingType: types.EncodingType(req.EncodingType), + // ExpectedBucketOwner: &req.ExpectedBucketOwner, + // Marker: &req.Marker, + // MaxKeys: req.MaxKeys, + // Prefix: &req.Prefix, + // RequestPayer: types.RequestPayer(req.RequestPayer), + //} + + input := &s3.ListObjectsInput{} + copier.Copy(input, req) resp, err := client.ListObjects(ctx, input) if err != nil { return nil, err } - output := &file.ListObjectsOutput{Delimiter: *resp.Delimiter, EncodingType: string(resp.EncodingType), IsTruncated: resp.IsTruncated, Marker: *resp.Marker, - MaxKeys: resp.MaxKeys, Name: *resp.Name, NextMarker: *resp.NextMarker, Prefix: *resp.Prefix, - } - - for _, v := range resp.CommonPrefixes { - output.CommonPrefixes = append(output.CommonPrefixes, *v.Prefix) - } - - for _, v := range resp.Contents { - object := &file.Object{Etag: *v.ETag, Key: *v.Key, Size: v.Size, StorageClass: string(v.StorageClass), Owner: &file.Owner{DisplayName: *v.Owner.DisplayName, Id: *v.Owner.ID}, LastModified: ×tamppb.Timestamp{Seconds: int64(v.LastModified.Second()), Nanos: int32(v.LastModified.Nanosecond())}} - output.Contents = append(output.Contents, object) - } - + //output := &file.ListObjectsOutput{Delimiter: *(resp.Delimiter), EncodingType: string(resp.EncodingType), IsTruncated: resp.IsTruncated, Marker: *(resp.Marker), + // MaxKeys: resp.MaxKeys, Name: *(resp.Name), NextMarker: *(resp.NextMarker), Prefix: *(resp.Prefix), + //} + // + //for _, v := range resp.CommonPrefixes { + // output.CommonPrefixes = append(output.CommonPrefixes, *v.Prefix) + //} + // + //for _, v := range resp.Contents { + // object := &file.Object{Etag: *v.ETag, Key: *v.Key, Size: v.Size, StorageClass: string(v.StorageClass), Owner: &file.Owner{DisplayName: *v.Owner.DisplayName, ID: *v.Owner.ID}, LastModified: ×tamppb.Timestamp{Seconds: int64(v.LastModified.Second()), Nanos: int32(v.LastModified.Nanosecond())}} + // output.Contents = append(output.Contents, object) + //} + output := &file.ListObjectsOutput{} + + err = copier.CopyWithOption(output, resp, copier.Option{ + IgnoreEmpty: true, + DeepCopy: true, + Converters: []copier.TypeConverter{ + { + SrcType: &time.Time{}, + DstType: int64(0), + Fn: func(src interface{}) (interface{}, error) { + s, ok := src.(*time.Time) + if !ok { + return nil, errors.New("src type not matching") + } + return s.Unix(), nil + }, + }, + }}) return output, err } func (a *AwsOss) GetObjectAcl(ctx context.Context, req *file.GetObjectAclInput) (*file.GetObjectAclOutput, error) { @@ -574,7 +310,7 @@ func (a *AwsOss) GetObjectAcl(ctx context.Context, req *file.GetObjectAclInput) output := &file.GetObjectAclOutput{Owner: &file.Owner{}, RequestCharged: string(resp.RequestCharged)} for _, v := range resp.Grants { output.Grants = append(output.Grants, &file.Grant{Grantee: &file.Grantee{DisplayName: *v.Grantee.DisplayName, EmailAddress: *v.Grantee.DisplayName, - Id: *v.Grantee.ID, Type: v.Grantee.Type, Uri: *v.Grantee.URI, + ID: *v.Grantee.ID, Type: string(v.Grantee.Type), URI: *v.Grantee.URI, }, Permission: string(v.Permission)}) } return output, err @@ -615,51 +351,50 @@ func (a *AwsOss) CreateMultipartUpload(ctx context.Context, req *file.CreateMult if err != nil { return nil, err } - input := &s3.CreateMultipartUploadInput{ - Bucket: &req.Bucket, - Key: &req.Key, - ACL: types.ObjectCannedACL(req.Acl), - BucketKeyEnabled: req.BucketKeyEnabled, - CacheControl: &req.CacheControl, - ContentDisposition: &req.ContentDisposition, - ContentEncoding: &req.ContentEncoding, - ContentLanguage: &req.ContentLanguage, - ContentType: &req.ContentType, - ExpectedBucketOwner: &req.ExpectedBucketOwner, - GrantFullControl: &req.GrantFullControl, - GrantRead: &req.GrantRead, - GrantReadACP: &req.GrantReadAcp, - GrantWriteACP: &req.GrantWriteAcp, - Metadata: req.MetaData, - ObjectLockLegalHoldStatus: types.ObjectLockLegalHoldStatus(req.ObjectLockLegalHoldStatus), - ObjectLockMode: types.ObjectLockMode(req.ObjectLockMode), - RequestPayer: types.RequestPayer(req.RequestPayer), - SSECustomerAlgorithm: &req.SseCustomerAlgorithm, - SSECustomerKey: &req.SseCustomerKey, - SSECustomerKeyMD5: &req.SseCustomerKeyMd5, - SSEKMSEncryptionContext: &req.SseKmsEncryptionContext, - SSEKMSKeyId: &req.SseKmsKeyId, - ServerSideEncryption: types.ServerSideEncryption(req.ServerSideEncryption), - StorageClass: types.StorageClass(req.StorageClass), - Tagging: &req.Tagging, - WebsiteRedirectLocation: &req.WebsiteRedirectLocation, - } - expire := req.Expires.AsTime() - input.Expires = &expire - - retain := req.ObjectLockRetainUntilDate.AsTime() - input.ObjectLockRetainUntilDate = &retain - resp, err := client.CreateMultipartUpload(ctx, input) + input := &s3.CreateMultipartUploadInput{} + err = copier.CopyWithOption(input, req, copier.Option{ + IgnoreEmpty: true, + DeepCopy: true, + Converters: []copier.TypeConverter{ + { + SrcType: int64(0), + DstType: &time.Time{}, + Fn: func(src interface{}) (interface{}, error) { + s, ok := src.(int64) + if !ok { + return nil, errors.New("src type not matching") + } + t := time.Unix(0, s) + return &t, nil + }, + }, + }}) if err != nil { + log.DefaultLogger.Errorf("copy CreateMultipartUploadInput fail, err: %+v", err) return nil, err } - output := &file.CreateMultipartUploadOutput{Bucket: *resp.Bucket, Key: *resp.Key, - AbortDate: ×tamppb.Timestamp{Seconds: int64(resp.AbortDate.Second()), Nanos: int32(resp.AbortDate.Nanosecond())}, - AbortRuleId: *resp.AbortRuleId, BucketKeyEnabled: resp.BucketKeyEnabled, RequestCharged: string(resp.RequestCharged), - SseCustomerAlgorithm: *resp.SSECustomerAlgorithm, SseCustomerKeyMd5: *resp.SSECustomerKeyMD5, SseKmsEncryptionContext: *resp.SSEKMSEncryptionContext, - SseKmsKeyId: *resp.SSEKMSKeyId, ServerSideEncryption: string(resp.ServerSideEncryption), UploadId: *resp.UploadId, + resp, err := client.CreateMultipartUpload(ctx, input) + if err != nil { + return nil, err } - + output := &file.CreateMultipartUploadOutput{} + copier.CopyWithOption(output, resp, copier.Option{ + IgnoreEmpty: true, + DeepCopy: true, + Converters: []copier.TypeConverter{ + { + SrcType: &time.Time{}, + DstType: int64(0), + Fn: func(src interface{}) (interface{}, error) { + s, ok := src.(*time.Time) + if !ok { + return nil, errors.New("src type not matching") + } + return s.Unix(), nil + }, + }, + }, + }) return output, err } func (a *AwsOss) UploadPart(ctx context.Context, req *file.UploadPartInput) (*file.UploadPartOutput, error) { @@ -685,7 +420,7 @@ func (a *AwsOss) UploadPart(ctx context.Context, req *file.UploadPartInput) (*fi if err != nil { return nil, err } - output := &file.UploadPartOutput{BucketKeyEnabled: resp.BucketKeyEnabled, Etag: *resp.ETag, RequestCharged: string(resp.RequestCharged), + output := &file.UploadPartOutput{BucketKeyEnabled: resp.BucketKeyEnabled, ETag: *resp.ETag, RequestCharged: string(resp.RequestCharged), SseCustomerAlgorithm: *resp.SSECustomerAlgorithm, SseCustomerKeyMd5: *resp.SSECustomerKeyMD5, SseKmsKeyId: *resp.SSECustomerKeyMD5, ServerSideEncryption: string(resp.ServerSideEncryption), } @@ -696,10 +431,13 @@ func (a *AwsOss) UploadPartCopy(ctx context.Context, req *file.UploadPartCopyInp if err != nil { return nil, err } + + //TODO: should support objects accessed through access points + copySource := req.CopySource.CopySourceBucket + "/" + req.CopySource.CopySourceKey + "?versionId=" + req.CopySource.CopySourceVersionId input := &s3.UploadPartCopyInput{ Bucket: &req.Bucket, Key: &req.Key, - CopySource: &req.CopySource, + CopySource: ©Source, PartNumber: req.PartNumber, UploadId: &req.UploadId, } @@ -707,9 +445,9 @@ func (a *AwsOss) UploadPartCopy(ctx context.Context, req *file.UploadPartCopyInp if err != nil { return nil, err } - LastModified := ×tamppb.Timestamp{Seconds: int64(resp.CopyPartResult.LastModified.Second()), Nanos: int32(resp.CopyPartResult.LastModified.Nanosecond())} + //LastModified := ×tamppb.Timestamp{Seconds: int64(resp.CopyPartResult.LastModified.Second()), Nanos: int32(resp.CopyPartResult.LastModified.Nanosecond())} output := &file.UploadPartCopyOutput{BucketKeyEnabled: resp.BucketKeyEnabled, RequestCharged: string(resp.RequestCharged), - CopyPartResult: &file.CopyPartResult{Etag: *resp.CopyPartResult.ETag, LastModified: LastModified}, + //CopyPartResult: &file.CopyPartResult{ETag: *resp.CopyPartResult.ETag, LastModified: LastModified}, CopySourceVersionId: *resp.CopySourceVersionId, SseCustomerAlgorithm: *resp.SSECustomerAlgorithm, SseCustomerKeyMd5: *resp.SSECustomerKeyMD5, SseKmsKeyId: *resp.SSECustomerKeyMD5, ServerSideEncryption: string(resp.ServerSideEncryption), @@ -730,7 +468,7 @@ func (a *AwsOss) CompleteMultipartUpload(ctx context.Context, req *file.Complete MultipartUpload: &types.CompletedMultipartUpload{}, } for _, v := range req.MultipartUpload.Parts { - input.MultipartUpload.Parts = append(input.MultipartUpload.Parts, types.CompletedPart{ETag: &v.Etag, PartNumber: v.PartNumber}) + input.MultipartUpload.Parts = append(input.MultipartUpload.Parts, types.CompletedPart{ETag: &v.ETag, PartNumber: v.PartNumber}) } resp, err := client.CompleteMultipartUpload(ctx, input) if err != nil { @@ -740,7 +478,7 @@ func (a *AwsOss) CompleteMultipartUpload(ctx context.Context, req *file.Complete Bucket: *resp.Bucket, Key: *resp.Key, BucketKeyEnabled: resp.BucketKeyEnabled, - Etag: *resp.ETag, + ETag: *resp.ETag, Expiration: *resp.Expiration, Location: *resp.Location, RequestCharged: string(resp.RequestCharged), @@ -802,10 +540,10 @@ func (a *AwsOss) ListMultipartUploads(ctx context.Context, req *file.ListMultipa } for _, v := range resp.Uploads { upload := &file.MultipartUpload{ - Initiated: timestamppb.New(*v.Initiated), - Initiator: &file.Initiator{DisplayName: *v.Initiator.DisplayName, Id: *v.Initiator.ID}, + //Initiated: timestamppb.New(*v.Initiated), + Initiator: &file.Initiator{DisplayName: *v.Initiator.DisplayName, ID: *v.Initiator.ID}, Key: *v.Key, - Owner: &file.Owner{Id: *v.Owner.ID, DisplayName: *v.Owner.DisplayName}, + Owner: &file.Owner{ID: *v.Owner.ID, DisplayName: *v.Owner.DisplayName}, StorageClass: string(v.StorageClass), UploadId: *v.UploadId, } @@ -850,21 +588,21 @@ func (a *AwsOss) ListObjectVersions(ctx context.Context, req *file.ListObjectVer } for _, v := range resp.DeleteMarkers { entry := &file.DeleteMarkerEntry{ - IsLatest: v.IsLatest, - Key: *v.Key, - LastModified: timestamppb.New(*v.LastModified), - Owner: &file.Owner{DisplayName: *v.Owner.DisplayName, Id: *v.Owner.ID}, - VersionId: *v.VersionId, + IsLatest: v.IsLatest, + Key: *v.Key, + //LastModified: timestamppb.New(*v.LastModified), + Owner: &file.Owner{DisplayName: *v.Owner.DisplayName, ID: *v.Owner.ID}, + VersionId: *v.VersionId, } output.DeleteMarkers = append(output.DeleteMarkers, entry) } for _, v := range resp.Versions { version := &file.ObjectVersion{ - Etag: *v.ETag, - IsLatest: v.IsLatest, - Key: *v.Key, - LastModified: timestamppb.New(*v.LastModified), - Owner: &file.Owner{DisplayName: *v.Owner.DisplayName, Id: *v.Owner.ID}, + ETag: *v.ETag, + IsLatest: v.IsLatest, + Key: *v.Key, + //LastModified: timestamppb.New(*v.LastModified), + Owner: &file.Owner{DisplayName: *v.Owner.DisplayName, ID: *v.Owner.ID}, Size: v.Size, StorageClass: string(v.StorageClass), VersionId: *v.VersionId, diff --git a/components/file/registry.go b/components/file/registry.go index da256d61d8..56bc19db9b 100644 --- a/components/file/registry.go +++ b/components/file/registry.go @@ -103,10 +103,10 @@ func (r *OssStoreRegistry) Register(fs ...*OssFactory) { } } -func (r *OssStoreRegistry) Create(name string) (Oss, error) { - if f, ok := r.files[name]; ok { - r.info.LoadComponent(ServiceName, name) +func (r *OssStoreRegistry) Create(compType string) (Oss, error) { + if f, ok := r.files[compType]; ok { + r.info.LoadComponent(ServiceName, compType) return f(), nil } - return nil, fmt.Errorf("service component %s is not regsitered", name) + return nil, fmt.Errorf("service component %s is not regsitered", compType) } diff --git a/components/file/s3def.go b/components/file/s3def.go index 39d1124dd2..6449298454 100644 --- a/components/file/s3def.go +++ b/components/file/s3def.go @@ -18,10 +18,14 @@ package file import ( "context" - "google.golang.org/protobuf/types/known/timestamppb" + "errors" "io" ) +var ( + ErrNotSpecifyEndpoint = errors.New("should specific endpoint in metadata") +) + type Oss interface { InitConfig(context.Context, *FileConfig) error InitClient(context.Context, *InitRequest) error @@ -78,7 +82,7 @@ type GetObjectInput struct { type PutObjectInput struct { DataStream io.Reader - Acl string `protobuf:"bytes,2,opt,name=acl,proto3" json:"acl,omitempty"` + ACL string `protobuf:"bytes,2,opt,name=acl,proto3" json:"acl,omitempty"` Bucket string `protobuf:"bytes,4,opt,name=bucket,proto3" json:"bucket,omitempty"` Key string `protobuf:"bytes,5,opt,name=key,proto3" json:"key,omitempty"` BucketKeyEnabled bool `protobuf:"varint,6,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` @@ -87,7 +91,7 @@ type PutObjectInput struct { type PutObjectOutput struct { BucketKeyEnabled bool `protobuf:"varint,1,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - Etag string `protobuf:"bytes,2,opt,name=etag,proto3" json:"etag,omitempty"` + ETag string `protobuf:"bytes,2,opt,name=etag,proto3" json:"etag,omitempty"` } type DeleteObjectInput struct { @@ -101,9 +105,10 @@ type DeleteObjectOutput struct { } type PutBucketTaggingInput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - Tags map[string]string `protobuf:"bytes,3,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + Tags map[string]string `protobuf:"bytes,4,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + VersionId string `protobuf:"bytes,5,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } type PutBucketTaggingOutput struct { } @@ -124,12 +129,24 @@ type GetObjectTaggingOutput struct { Tags map[string]string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } +type CopySource struct { + CopySourceBucket string `protobuf:"bytes,1,opt,name=copy_source_bucket,json=copySourceBucket,proto3" json:"copy_source_bucket,omitempty"` + CopySourceKey string `protobuf:"bytes,2,opt,name=copy_source_key,json=copySourceKey,proto3" json:"copy_source_key,omitempty"` + CopySourceVersionId string `protobuf:"bytes,3,opt,name=copy_source_version_id,json=copySourceVersionId,proto3" json:"copy_source_version_id,omitempty"` +} + type CopyObjectInput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - CopySource string `protobuf:"bytes,3,opt,name=copy_source,json=copySource,proto3" json:"copy_source,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + CopySource *CopySource `protobuf:"bytes,4,opt,name=copy_source,json=copySource,proto3" json:"copy_source,omitempty"` } type CopyObjectOutput struct { + CopyObjectResult *CopyObjectResult `protobuf:"bytes,1,opt,name=CopyObjectResult,proto3" json:"CopyObjectResult,omitempty"` +} +type CopyObjectResult struct { + ETag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` + LastModified int64 `protobuf:"varint,2,opt,name=LastModified,proto3" json:"LastModified,omitempty"` } type DeleteObjectsInput struct { @@ -146,6 +163,14 @@ type ObjectIdentifier struct { } type DeleteObjectsOutput struct { + Deleted []*DeletedObject `protobuf:"bytes,1,rep,name=deleted,proto3" json:"deleted,omitempty"` +} + +type DeletedObject struct { + DeleteMarker bool `protobuf:"varint,1,opt,name=delete_marker,json=deleteMarker,proto3" json:"delete_marker,omitempty"` + DeleteMarkerVersionId string `protobuf:"bytes,2,opt,name=delete_marker_version_id,json=deleteMarkerVersionId,proto3" json:"delete_marker_version_id,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + VersionId string `protobuf:"bytes,4,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } type ListObjectsInput struct { @@ -171,16 +196,16 @@ type ListObjectsOutput struct { Prefix string `protobuf:"bytes,10,opt,name=prefix,proto3" json:"prefix,omitempty"` } type Object struct { - Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - LastModified *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` - Owner *Owner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` - Size int64 `protobuf:"varint,5,opt,name=size,proto3" json:"size,omitempty"` - StorageClass string `protobuf:"bytes,6,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` + ETag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + LastModified int64 `protobuf:"bytes,3,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` + Owner *Owner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` + Size int64 `protobuf:"varint,5,opt,name=size,proto3" json:"size,omitempty"` + StorageClass string `protobuf:"bytes,6,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` } type Owner struct { DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + ID string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` } type GetObjectAclInput struct { @@ -199,9 +224,9 @@ type Grant struct { type Grantee struct { DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` EmailAddress string `protobuf:"bytes,2,opt,name=email_address,json=emailAddress,proto3" json:"email_address,omitempty"` - Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` + ID string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` Type string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"` - Uri string `protobuf:"bytes,5,opt,name=uri,proto3" json:"uri,omitempty"` + URI string `protobuf:"bytes,5,opt,name=uri,proto3" json:"uri,omitempty"` } type PutObjectAclInput struct { @@ -223,49 +248,49 @@ type RestoreObjectOutput struct { } type CreateMultipartUploadInput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - Acl string `protobuf:"bytes,3,opt,name=acl,proto3" json:"acl,omitempty"` - BucketKeyEnabled bool `protobuf:"varint,4,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - CacheControl string `protobuf:"bytes,5,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` - ContentDisposition string `protobuf:"bytes,6,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` - ContentEncoding string `protobuf:"bytes,7,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` - ContentLanguage string `protobuf:"bytes,8,opt,name=content_language,json=contentLanguage,proto3" json:"content_language,omitempty"` - ContentType string `protobuf:"bytes,9,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,10,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - Expires *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=expires,proto3" json:"expires,omitempty"` - GrantFullControl string `protobuf:"bytes,12,opt,name=grant_full_control,json=grantFullControl,proto3" json:"grant_full_control,omitempty"` - GrantRead string `protobuf:"bytes,13,opt,name=grant_read,json=grantRead,proto3" json:"grant_read,omitempty"` - GrantReadAcp string `protobuf:"bytes,14,opt,name=grant_read_acp,json=grantReadAcp,proto3" json:"grant_read_acp,omitempty"` - GrantWriteAcp string `protobuf:"bytes,15,opt,name=grant_write_acp,json=grantWriteAcp,proto3" json:"grant_write_acp,omitempty"` - MetaData map[string]string `protobuf:"bytes,16,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"` - ObjectLockLegalHoldStatus string `protobuf:"bytes,17,opt,name=object_lock_legal_hold_status,json=objectLockLegalHoldStatus,proto3" json:"object_lock_legal_hold_status,omitempty"` - ObjectLockMode string `protobuf:"bytes,18,opt,name=object_lock_mode,json=objectLockMode,proto3" json:"object_lock_mode,omitempty"` - ObjectLockRetainUntilDate *timestamppb.Timestamp `protobuf:"bytes,19,opt,name=object_lock_retain_until_date,json=objectLockRetainUntilDate,proto3" json:"object_lock_retain_until_date,omitempty"` - RequestPayer string `protobuf:"bytes,20,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - SseCustomerAlgorithm string `protobuf:"bytes,21,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - SseCustomerKey string `protobuf:"bytes,22,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` - SseCustomerKeyMd5 string `protobuf:"bytes,23,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - SseKmsEncryptionContext string `protobuf:"bytes,24,opt,name=sse_kms_encryption_context,json=sseKmsEncryptionContext,proto3" json:"sse_kms_encryption_context,omitempty"` - SseKmsKeyId string `protobuf:"bytes,25,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` - ServerSideEncryption string `protobuf:"bytes,26,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` - StorageClass string `protobuf:"bytes,27,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` - Tagging string `protobuf:"bytes,28,opt,name=tagging,proto3" json:"tagging,omitempty"` - WebsiteRedirectLocation string `protobuf:"bytes,29,opt,name=website_redirect_location,json=websiteRedirectLocation,proto3" json:"website_redirect_location,omitempty"` + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + ACL string `protobuf:"bytes,3,opt,name=acl,proto3" json:"acl,omitempty"` + BucketKeyEnabled bool `protobuf:"varint,4,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + CacheControl string `protobuf:"bytes,5,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` + ContentDisposition string `protobuf:"bytes,6,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` + ContentEncoding string `protobuf:"bytes,7,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` + ContentLanguage string `protobuf:"bytes,8,opt,name=content_language,json=contentLanguage,proto3" json:"content_language,omitempty"` + ContentType string `protobuf:"bytes,9,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,10,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + Expires int64 `protobuf:"bytes,11,opt,name=expires,proto3" json:"expires,omitempty"` + GrantFullControl string `protobuf:"bytes,12,opt,name=grant_full_control,json=grantFullControl,proto3" json:"grant_full_control,omitempty"` + GrantRead string `protobuf:"bytes,13,opt,name=grant_read,json=grantRead,proto3" json:"grant_read,omitempty"` + GrantReadACP string `protobuf:"bytes,14,opt,name=grant_read_acp,json=grantReadAcp,proto3" json:"grant_read_acp,omitempty"` + GrantWriteACP string `protobuf:"bytes,15,opt,name=grant_write_acp,json=grantWriteAcp,proto3" json:"grant_write_acp,omitempty"` + MetaData map[string]string `protobuf:"bytes,16,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"` + ObjectLockLegalHoldStatus string `protobuf:"bytes,17,opt,name=object_lock_legal_hold_status,json=objectLockLegalHoldStatus,proto3" json:"object_lock_legal_hold_status,omitempty"` + ObjectLockMode string `protobuf:"bytes,18,opt,name=object_lock_mode,json=objectLockMode,proto3" json:"object_lock_mode,omitempty"` + ObjectLockRetainUntilDate int64 `protobuf:"bytes,19,opt,name=object_lock_retain_until_date,json=objectLockRetainUntilDate,proto3" json:"object_lock_retain_until_date,omitempty"` + RequestPayer string `protobuf:"bytes,20,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + SSECustomerAlgorithm string `protobuf:"bytes,21,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SSECustomerKey string `protobuf:"bytes,22,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` + SSECustomerKeyMD5 string `protobuf:"bytes,23,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + SSEKMSEncryptionContext string `protobuf:"bytes,24,opt,name=sse_kms_encryption_context,json=sseKmsEncryptionContext,proto3" json:"sse_kms_encryption_context,omitempty"` + SSEKMSKeyId string `protobuf:"bytes,25,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` + ServerSideEncryption string `protobuf:"bytes,26,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` + StorageClass string `protobuf:"bytes,27,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` + Tagging string `protobuf:"bytes,28,opt,name=tagging,proto3" json:"tagging,omitempty"` + WebsiteRedirectLocation string `protobuf:"bytes,29,opt,name=website_redirect_location,json=websiteRedirectLocation,proto3" json:"website_redirect_location,omitempty"` } type CreateMultipartUploadOutput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - AbortDate *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=abort_date,json=abortDate,proto3" json:"abort_date,omitempty"` - AbortRuleId string `protobuf:"bytes,4,opt,name=abort_rule_id,json=abortRuleId,proto3" json:"abort_rule_id,omitempty"` - BucketKeyEnabled bool `protobuf:"varint,5,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - RequestCharged string `protobuf:"bytes,6,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` - SseCustomerAlgorithm string `protobuf:"bytes,7,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - SseCustomerKeyMd5 string `protobuf:"bytes,8,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - SseKmsEncryptionContext string `protobuf:"bytes,9,opt,name=sse_kms_encryption_context,json=sseKmsEncryptionContext,proto3" json:"sse_kms_encryption_context,omitempty"` - SseKmsKeyId string `protobuf:"bytes,10,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` - ServerSideEncryption string `protobuf:"bytes,11,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` - UploadId string `protobuf:"bytes,12,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + AbortDate int64 `protobuf:"bytes,3,opt,name=abort_date,json=abortDate,proto3" json:"abort_date,omitempty"` + AbortRuleId string `protobuf:"bytes,4,opt,name=abort_rule_id,json=abortRuleId,proto3" json:"abort_rule_id,omitempty"` + BucketKeyEnabled bool `protobuf:"varint,5,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + RequestCharged string `protobuf:"bytes,6,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + SSECustomerAlgorithm string `protobuf:"bytes,7,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SSECustomerKeyMD5 string `protobuf:"bytes,8,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + SSEKMSEncryptionContext string `protobuf:"bytes,9,opt,name=sse_kms_encryption_context,json=sseKmsEncryptionContext,proto3" json:"sse_kms_encryption_context,omitempty"` + SSEKMSKeyId string `protobuf:"bytes,10,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` + ServerSideEncryption string `protobuf:"bytes,11,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` + UploadId string `protobuf:"bytes,12,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` } type UploadPartInput struct { @@ -285,7 +310,7 @@ type UploadPartInput struct { } type UploadPartOutput struct { BucketKeyEnabled bool `protobuf:"varint,1,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - Etag string `protobuf:"bytes,2,opt,name=etag,proto3" json:"etag,omitempty"` + ETag string `protobuf:"bytes,2,opt,name=etag,proto3" json:"etag,omitempty"` RequestCharged string `protobuf:"bytes,3,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` SseCustomerAlgorithm string `protobuf:"bytes,4,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` SseCustomerKeyMd5 string `protobuf:"bytes,5,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` @@ -294,11 +319,14 @@ type UploadPartOutput struct { } type UploadPartCopyInput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - CopySource string `protobuf:"bytes,3,opt,name=copy_source,json=copySource,proto3" json:"copy_source,omitempty"` - PartNumber int32 `protobuf:"varint,4,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` - UploadId string `protobuf:"bytes,5,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + CopySource *CopySource `protobuf:"bytes,4,opt,name=copy_source,json=copySource,proto3" json:"copy_source,omitempty"` + PartNumber int32 `protobuf:"varint,5,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + UploadId string `protobuf:"bytes,6,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + StartPosition int64 `protobuf:"varint,7,opt,name=start_position,json=startPosition,proto3" json:"start_position,omitempty"` + PartSize int64 `protobuf:"varint,8,opt,name=part_size,json=partSize,proto3" json:"part_size,omitempty"` } type UploadPartCopyOutput struct { BucketKeyEnabled bool `protobuf:"varint,1,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` @@ -311,8 +339,8 @@ type UploadPartCopyOutput struct { ServerSideEncryption string `protobuf:"bytes,8,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` } type CopyPartResult struct { - Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` - LastModified *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` + ETag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` + LastModified int64 `protobuf:"bytes,2,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` } type CompleteMultipartUploadInput struct { @@ -327,14 +355,14 @@ type CompletedMultipartUpload struct { Parts []*CompletedPart `protobuf:"bytes,1,rep,name=parts,proto3" json:"parts,omitempty"` } type CompletedPart struct { - Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` + ETag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` PartNumber int32 `protobuf:"varint,2,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` } type CompleteMultipartUploadOutput struct { Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` BucketKeyEnabled bool `protobuf:"varint,3,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - Etag string `protobuf:"bytes,4,opt,name=etag,proto3" json:"etag,omitempty"` + ETag string `protobuf:"bytes,4,opt,name=etag,proto3" json:"etag,omitempty"` Expiration string `protobuf:"bytes,5,opt,name=expiration,proto3" json:"expiration,omitempty"` Location string `protobuf:"bytes,6,opt,name=location,proto3" json:"location,omitempty"` RequestCharged string `protobuf:"bytes,7,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` @@ -379,16 +407,16 @@ type ListMultipartUploadsOutput struct { Uploads []*MultipartUpload `protobuf:"bytes,12,rep,name=uploads,proto3" json:"uploads,omitempty"` } type MultipartUpload struct { - Initiated *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=Initiated,proto3" json:"Initiated,omitempty"` - Initiator *Initiator `protobuf:"bytes,2,opt,name=initiator,proto3" json:"initiator,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - Owner *Owner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` - StorageClass string `protobuf:"bytes,5,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` - UploadId string `protobuf:"bytes,6,opt,name=UploadId,proto3" json:"UploadId,omitempty"` + Initiated int64 `protobuf:"bytes,1,opt,name=initiated,proto3" json:"initiated,omitempty"` + Initiator *Initiator `protobuf:"bytes,2,opt,name=initiator,proto3" json:"initiator,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + Owner *Owner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` + StorageClass string `protobuf:"bytes,5,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` + UploadId string `protobuf:"bytes,6,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` } type Initiator struct { DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + ID string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` } type ListObjectVersionsInput struct { @@ -417,19 +445,19 @@ type ListObjectVersionsOutput struct { Versions []*ObjectVersion `protobuf:"bytes,13,rep,name=versions,proto3" json:"versions,omitempty"` } type DeleteMarkerEntry struct { - IsLatest bool `protobuf:"varint,1,opt,name=is_latest,json=isLatest,proto3" json:"is_latest,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - LastModified *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` - Owner *Owner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` - VersionId string `protobuf:"bytes,5,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + IsLatest bool `protobuf:"varint,1,opt,name=is_latest,json=isLatest,proto3" json:"is_latest,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + LastModified int64 `protobuf:"bytes,3,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` + Owner *Owner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` + VersionId string `protobuf:"bytes,5,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } type ObjectVersion struct { - Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` - IsLatest bool `protobuf:"varint,2,opt,name=is_latest,json=isLatest,proto3" json:"is_latest,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - LastModified *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` - Owner *Owner `protobuf:"bytes,5,opt,name=owner,proto3" json:"owner,omitempty"` - Size int64 `protobuf:"varint,6,opt,name=size,proto3" json:"size,omitempty"` - StorageClass string `protobuf:"bytes,7,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` - VersionId string `protobuf:"bytes,8,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + ETag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` + IsLatest bool `protobuf:"varint,2,opt,name=is_latest,json=isLatest,proto3" json:"is_latest,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + LastModified int64 `protobuf:"bytes,4,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` + Owner *Owner `protobuf:"bytes,5,opt,name=owner,proto3" json:"owner,omitempty"` + Size int64 `protobuf:"varint,6,opt,name=size,proto3" json:"size,omitempty"` + StorageClass string `protobuf:"bytes,7,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` + VersionId string `protobuf:"bytes,8,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } diff --git a/components/go.mod b/components/go.mod index f3038e6af2..7facad7796 100644 --- a/components/go.mod +++ b/components/go.mod @@ -17,6 +17,7 @@ require ( github.com/golang/mock v1.6.0 github.com/google/uuid v1.3.0 github.com/hashicorp/consul/api v1.3.0 + github.com/jinzhu/copier v0.3.6-0.20220506024824-3e39b055319a github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect github.com/minio/minio-go/v7 v7.0.15 github.com/mitchellh/mapstructure v1.4.1 // indirect diff --git a/components/go.sum b/components/go.sum index 15c8252fe6..34e040a5dd 100644 --- a/components/go.sum +++ b/components/go.sum @@ -466,6 +466,8 @@ github.com/jcmturner/rpc/v2 v2.0.2 h1:gMB4IwRXYsWw4Bc6o/az2HJgFUA1ffSh90i26ZJ6Xl github.com/jcmturner/rpc/v2 v2.0.2/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag= github.com/jinzhu/copier v0.3.2/go.mod h1:24xnZezI2Yqac9J61UC6/dG/k76ttpq0DdJI3QmUvro= +github.com/jinzhu/copier v0.3.6-0.20220506024824-3e39b055319a h1:1tB9lnwJFOtcMERtVVAad4aK5e3Q7sVbP0id87FxIS8= +github.com/jinzhu/copier v0.3.6-0.20220506024824-3e39b055319a/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= diff --git a/components/pkg/mock/mongo_sequencer_mock.go b/components/pkg/mock/mongo_sequencer_mock.go index cf8aeecea6..be316935b2 100644 --- a/components/pkg/mock/mongo_sequencer_mock.go +++ b/components/pkg/mock/mongo_sequencer_mock.go @@ -184,7 +184,7 @@ func (d *MockMongoSequencerSingleResult) Decode(v interface{}) error { ref := reflect.ValueOf(v) if ref.Kind() == reflect.Ptr { elem := ref.Elem() - Id := elem.FieldByName("Id") + Id := elem.FieldByName("ID") *(*string)(unsafe.Pointer(Id.Addr().Pointer())) = id v := elem.FieldByName("Sequencer_value") diff --git a/demo/file/s3/client.go b/demo/file/s3/client.go new file mode 100644 index 0000000000..5473fc40b1 --- /dev/null +++ b/demo/file/s3/client.go @@ -0,0 +1,407 @@ +package main + +import ( + "bufio" + "context" + "fmt" + s3 "mosn.io/layotto/spec/proto/extension/v1" + "os" + + "google.golang.org/grpc" +) + +const ( + storeName = "file_demo" + storageType = "Standard" +) + +func TestGetObjectInput(fileName string) { + conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) + if err != nil { + fmt.Printf("conn build failed,err:%+v", err) + return + } + + c := s3.NewS3Client(conn) + req := &s3.GetObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: fileName} + cli, err := c.GetObject(context.Background(), req) + if err != nil { + fmt.Printf("get file error: %+v", err) + return + } + pic := make([]byte, 0) + for { + resp, err := cli.Recv() + if err != nil { + if err.Error() != "EOF" { + panic(err) + } + break + } + pic = append(pic, resp.Body...) + } + fmt.Println(string(pic)) +} + +func TestPutObject(fileName string, value string) { + conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) + if err != nil { + fmt.Printf("conn build failed,err:%+v", err) + return + } + c := s3.NewS3Client(conn) + req := &s3.PutObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: fileName} + stream, err := c.PutObject(context.TODO()) + if err != nil { + fmt.Printf("put file failed:%+v", err) + return + } + req.Body = []byte(value) + stream.Send(req) + _, err = stream.CloseAndRecv() + if err != nil { + fmt.Printf("cannot receive response: %+v", err) + } +} + +func TestListObjects() { + conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) + if err != nil { + fmt.Printf("conn build failed,err:%+v", err) + return + } + c := s3.NewS3Client(conn) + marker := "" + for { + req := &s3.ListObjectsInput{StoreName: storeName, Bucket: "antsys-wenxuwan", MaxKeys: 2, Marker: marker} + resp, err := c.ListObjects(context.Background(), req) + if err != nil { + fmt.Printf("list file fail, err: %+v", err) + return + } + marker = resp.NextMarker + if !resp.IsTruncated { + fmt.Printf("files under bucket is: %+v, %+v \n", resp.Contents, marker) + fmt.Printf("finish list \n") + return + } + fmt.Printf("files under bucket is: %+v, %+v \n", resp.Contents, marker) + } + +} + +func TestDeleteObject(fileName string) { + conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) + if err != nil { + fmt.Printf("conn build failed,err:%+v", err) + return + } + c := s3.NewS3Client(conn) + req := &s3.DeleteObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: fileName} + resp, err := c.DeleteObject(context.Background(), req) + if err != nil { + fmt.Printf("DeleteObject fail, err: %+v \n", err) + return + } + fmt.Printf("delete file success with resp: %+v \n", resp) +} + +func TestDeleteObjects(fileName1, fileName2 string) { + conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) + if err != nil { + fmt.Printf("conn build failed,err:%+v", err) + return + } + c := s3.NewS3Client(conn) + req2 := &s3.DeleteObjectsInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Delete: &s3.Delete{}} + object1 := &s3.ObjectIdentifier{Key: fileName1} + object2 := &s3.ObjectIdentifier{Key: fileName2} + req2.Delete.Objects = append(req2.Delete.Objects, object1) + req2.Delete.Objects = append(req2.Delete.Objects, object2) + resp2, err := c.DeleteObjects(context.Background(), req2) + if err != nil { + fmt.Printf("DeleteObjects fail, err: %+v \n", err) + return + } + fmt.Printf("DeleteObjects success with resp: %+v \n", resp2) +} + +func TestTagging() { + conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) + if err != nil { + fmt.Printf("conn build failed,err:%+v", err) + return + } + c := s3.NewS3Client(conn) + req := &s3.PutBucketTaggingInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "王文学.jpg", Tags: map[string]string{"Abc": "123", "Def": "456"}} + _, err = c.PutObjectTagging(context.Background(), req) + if err != nil { + fmt.Printf("PutObjectTagging fail, err: %+v \n", err) + return + } + fmt.Printf("PutObjectTagging success, try get tagging\n") + + req2 := &s3.GetObjectTaggingInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "王文学.jpg"} + getResp, err := c.GetObjectTagging(context.Background(), req2) + if err != nil { + fmt.Printf("GetObjectTagging fail, err: %+v \n", err) + return + } + fmt.Printf("GetObjectTagging: %+v \n", getResp.Tags) + + req3 := &s3.DeleteObjectTaggingInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "王文学.jpg"} + delResp, err := c.DeleteObjectTagging(context.Background(), req3) + if err != nil { + fmt.Printf("DeleteObjectTagging fail, err: %+v \n", err) + return + } + fmt.Printf("DeleteObjectTagging success: %+v \n", delResp.VersionId) + + req4 := &s3.GetObjectTaggingInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "王文学.jpg"} + getResp4, err := c.GetObjectTagging(context.Background(), req4) + if err != nil { + fmt.Printf("GetObjectTagging fail, err: %+v \n", err) + return + } + fmt.Printf("GetObjectTagging after delete tag: %+v \n", getResp4.Tags) +} + +func TestAcl() { + conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) + if err != nil { + fmt.Printf("conn build failed,err:%+v", err) + return + } + c := s3.NewS3Client(conn) + req := &s3.GetObjectAclInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "王文学.jpg"} + resp, err := c.GetObjectAcl(context.Background(), req) + if err != nil { + fmt.Printf("GetObjectAcl fail, err: %+v \n", err) + return + } + fmt.Printf("get acl success, resp: %+v\n", resp) + + putRequest := &s3.PutObjectAclInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "王文学.jpg", Acl: "public-read-write"} + resp2, err := c.PutObjectAcl(context.Background(), putRequest) + if err != nil { + fmt.Printf("PutObjectTagging fail, err: %+v \n", err) + return + } + fmt.Printf("put acl public-read-write success with resp: %+v \n", resp2) + +} + +func TestCopyObject() { + conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) + if err != nil { + fmt.Printf("conn build failed,err:%+v", err) + return + } + c := s3.NewS3Client(conn) + req := &s3.CopyObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "王文学.jpg.copy", CopySource: &s3.CopySource{CopySourceKey: "王文学.jpg"}} + resp, err := c.CopyObject(context.Background(), req) + if err != nil { + fmt.Printf("CopyObject fail, err: %+v \n", err) + return + } + fmt.Printf("CopyObject success, resp: %+v\n", resp) + +} + +func TestPart() { + conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) + if err != nil { + fmt.Printf("conn build failed,err:%+v", err) + return + } + c := s3.NewS3Client(conn) + req := &s3.CreateMultipartUploadInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "multicopy.jpg"} + resp, err := c.CreateMultipartUpload(context.Background(), req) + if err != nil { + fmt.Printf("CreateMultipartUpload fail, err: %+v \n", err) + return + } + fmt.Printf("CreateMultipartUpload success, resp: %+v\n", resp) + + req1 := &s3.ListMultipartUploadsInput{StoreName: storeName, Bucket: "antsys-wenxuwan", MaxUploads: 1000, KeyMarker: "multicopy.jpg", UploadIdMarker: resp.UploadId} + resp1, err := c.ListMultipartUploads(context.Background(), req1) + if err != nil { + fmt.Printf("ListMultipartUploads fail, err: %+v \n", err) + return + } + fmt.Printf("ListMultipartUploads success, resp: %+v \n", resp1) + + req2 := &s3.UploadPartCopyInput{StoreName: storeName, Bucket: "antsys-wenxuwan", PartNumber: 1, UploadId: resp.UploadId, Key: "multicopy.jpg", StartPosition: 0, PartSize: 1000, CopySource: &s3.CopySource{CopySourceBucket: "antsys-wenxuwan", CopySourceKey: "王文学.jpg"}} + resp2, err := c.UploadPartCopy(context.Background(), req2) + if err != nil { + fmt.Printf("UploadPartCopy fail, err: %+v \n", err) + return + } + fmt.Printf("UploadPartCopy success, resp: %+v \n", resp2) + + req3 := &s3.CompleteMultipartUploadInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "multicopy.jpg", UploadId: resp.UploadId, MultipartUpload: &s3.CompletedMultipartUpload{Parts: []*s3.CompletedPart{&s3.CompletedPart{Etag: resp2.CopyPartResult.Etag, PartNumber: req2.PartNumber}}}} + resp3, err := c.CompleteMultipartUpload(context.Background(), req3) + if err != nil { + fmt.Printf("CompleteMultipartUpload fail, err: %+v \n", err) + return + } + fmt.Printf("CompleteMultipartUpload success, resp: %+v \n", resp3) + + //req4 := &s3.AbortMultipartUploadInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "海贼王.jpeg", UploadId: "EEE5317D0EB841AC9B80D0B6A2F811AA"} + //resp4, err := c.AbortMultipartUpload(context.Background(), req4) + //if err != nil { + // fmt.Printf("AbortMultipartUpload fail, err: %+v \n", err) + // return + //} + //fmt.Printf("AbortMultipartUpload success, resp: %+v \n", resp4) + + req5 := &s3.CreateMultipartUploadInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "client"} + resp5, err := c.CreateMultipartUpload(context.Background(), req5) + if err != nil { + fmt.Printf("CreateMultipartUpload fail, err: %+v \n", err) + return + } + fmt.Printf("CreateMultipartUpload success, resp: %+v\n", resp5) + + req6 := &s3.UploadPartInput{ + StoreName: storeName, + Bucket: "antsys-wenxuwan", + Key: "client", + UploadId: resp5.UploadId, + PartNumber: 0, + } + f, err := os.Open("haizei.jpg") + if err != nil { + fmt.Printf("open file fail, err: %+v\n", err) + return + } + defer f.Close() + reader := bufio.NewReader(f) + var parts []*s3.CompletedPart + for { + dataByte := make([]byte, 120*1024) + var n int + n, err = reader.Read(dataByte) + if err != nil || 0 == n { + break + } + req6.Body = dataByte + req6.ContentLength = int64(n) + req6.PartNumber = req6.PartNumber + 1 + stream, err := c.UploadPart(context.TODO()) + if err != nil { + fmt.Printf("UploadPart fail, err: %+v \n", err) + return + } + err = stream.Send(req6) + if err != nil { + fmt.Printf("UploadPart send fail, err: %+v \n", err) + return + } + resp6, err := stream.CloseAndRecv() + if err != nil { + fmt.Printf("UploadPart CloseAndRecv fail, err: %+v \n", err) + return + } + part := &s3.CompletedPart{Etag: resp6.Etag, PartNumber: req6.PartNumber} + parts = append(parts, part) + } + fmt.Printf("UploadPart success, parts: %+v \n", parts) + req7 := &s3.CompleteMultipartUploadInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "client", UploadId: resp5.UploadId, MultipartUpload: &s3.CompletedMultipartUpload{Parts: parts}} + resp7, err := c.CompleteMultipartUpload(context.Background(), req7) + if err != nil { + fmt.Printf("CompleteMultipartUpload fail, err: %+v \n", err) + return + } + fmt.Printf("CompleteMultipartUpload success, resp: %+v \n", resp7) +} + +func TestListVersion() { + conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) + if err != nil { + fmt.Printf("conn build failed,err:%+v", err) + return + } + c := s3.NewS3Client(conn) + req := &s3.ListObjectVersionsInput{StoreName: storeName, Bucket: "antsys-wenxuwan"} + resp, err := c.ListObjectVersions(context.Background(), req) + if err != nil { + fmt.Printf("ListObjectVersions fail, err: %+v \n", err) + return + } + fmt.Printf("ListObjectVersions success, resp: %+v\n", resp) + +} + +func TestRestore() { + conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) + if err != nil { + fmt.Printf("conn build failed,err:%+v", err) + return + } + c := s3.NewS3Client(conn) + req := &s3.RestoreObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "client"} + resp, err := c.RestoreObject(context.Background(), req) + if err != nil { + fmt.Printf("RestoreObject fail, err: %+v \n", err) + return + } + fmt.Printf("RestoreObject success, resp: %+v\n", resp) + +} + +func main() { + conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) + if err != nil { + fmt.Printf("conn build failed,err:%+v", err) + return + } + c := s3.NewS3Client(conn) + req := &s3.InitRequest{StoreName: storeName} + _, err = c.InitClient(context.Background(), req) + if err != nil { + fmt.Printf("Init client fail,err:%+v", err) + return + } + + if os.Args[1] == "put" { + TestPutObject(os.Args[2], os.Args[3]) + } + if os.Args[1] == "get" { + TestGetObjectInput(os.Args[2]) + } + if os.Args[1] == "del" { + TestDeleteObject(os.Args[2]) + } + if os.Args[1] == "dels" { + TestDeleteObjects(os.Args[2], os.Args[3]) + } + + if os.Args[1] == "list" { + TestListObjects() + } + + if os.Args[1] == "tag" { + TestTagging() + } + + if os.Args[1] == "acl" { + TestAcl() + } + + if os.Args[1] == "copy" { + TestCopyObject() + } + + if os.Args[1] == "part" { + TestPart() + } + + if os.Args[1] == "version" { + TestListVersion() + } + + if os.Args[1] == "restore" { + TestRestore() + } +} diff --git a/demo/file/s3/haizei.jpg b/demo/file/s3/haizei.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b821ce3b04c71e7e6aefde0443e13480d93fc77c GIT binary patch literal 267024 zcmV)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY4#WTe4#WYKD-Ig~0Du5VL_t(|+U)&jux-h8 z9tf_LZkyw;f8M|H4&_jA1OXBP=nWuIjua(oLTa@pM$sM7GZ6}jnx3ASR!sDCPpD^N zqPu5AX(+N~NYOzOMSvg(6iihCC~uzk*WYuG+b%QL{K$Rw+2`DI?|ZlE6{-qU#*O#R z-8WC}+?ly^ZwFn3V0Ep%4hyaxT1)z9HDxMefUx~;y zhR6`hjR5W5n{qWfeis5T00fX)*x1;-cK!PL+S+WhwX}4gQmt-xJMC`Q02zWfiG@_g z7|-(r6KR?vq2N5rQcnqM@`8w*bETA&(pu}T2q73_)>=g5oEf7TW1KM{AR_l5M8r8q z00j4J$QVNcL_Aq>aIHCXhC0BmW1^ZpY6pdGevi7b@HXE=lIBIWg`%gB1`ZG4~ zFufh*Y-h7$`@u_EKJ~tLwxispSj2(O!Z3g=PJ7!2XY1!){_f{~_~ZZO zul!AIlXI`V`pAP12@qSI?Rve*08&GYq1Kv+q?Cxz?+;d2S2s2`I-QQ&TWYo1{QUgf z+??Xf^&6-4Kg%-47-KAoq9}^OFsxK6S(XVQ%CGIh+1J?bF_@qM z2mk@tun!1;)3}5&!~YOdtS2SP7M< zxZw3hopUawtX8W*7;w%kK$@n$lvD5Pc^*SV04-&fWlAZI$dod}gX7*((H*Ia8f>_2 zyHUqIbeMe>HvR#}{-v^p<^HqC>>ck+ZgazFeH9~x4PoLy@t%~44&>Sek|D#9N68@Y z0tD1#1j;x|eCb7TBBhcXjRmc>lmZdcOk1*^@)$sprJQrYcxLo)zLAKu*6!5CIX9N1 zlu9Yg<@e}l<3tw#a6}8x>2%udZBM91qgknV01zeC^B4j2Q|l|X-Ho{v%PT7vFI^T& zBBHg_?e(`iU8R&oNVQg;C!{h-0sx$Irxghyv^Lhnh{za6$Pd3xC3RY9@!9F7LxnHb z{K^_66rYC*`0&@g7LHr)g+^EuYYhNR3TdL^BtCT}i6(a_YxlRZtTmNZpN;c z?z+qSyvIhl^G~@FJKpAmYB+vJ-0g*#-XFw5gB&(Gt?3<2Ieop*dfj}LHRGN49Y0C# zr7BH4pljKdPNXFj0{1=}?fApkAT!2*@=a}`KREt>`LAUw#m*bjj?pg9+SsiD5YY@z z#1k4=VL`b=&2pmtZgRBf*j+hcAb|kpA+LJM47xhW{{DaUzo%4Jl(cA=C4meqXp>rt zk_!gF5!}W>!@)gp;K1R72dy(dSnIY9OT-X;rHa{Q?w~NdwHewxJkRqy&t2I$FJ)!4 zynbM$!a`ZfI3attgbo5EgFZ40{Qv+AX#n8J35cxaj5*yW)0q$g0WClV8h{V7K`282 zNGU}`2@(J-*eH!W`o02yEHgs#{vZm&U{XV+{c8~4pCV8Ykmm&! zz>?A0SPq1kl0_jhYcq?CF%%*(pmi4dGPNePMlsH%GFl@8!9|i~xt+}zxB7*UQcB1& zCOGB>E3jk@07F*HKLJ?)3xu30rNW@1JP!c01w(eLlVnC)qHn$adZ*j7L~)uhE(jrt zqE@q&8Ix(Pt!11WAOb+fgpiaUb`TIT*Bggh-_GrD_?d9*;`?XHZhJ(1zm=&Q+z0Cs z-d=fss*gK+_4fL?-*3G?M`PFC0t|Xx4q!7PZDw0@^?I|aqy~^&C4+%M4E#_H6+q{N zVp#IFQ0_8w+CzTGruVS`*ys4v!Vth((pqPLD1-taZ8ZR-#z-!bH1U;}q=`~W8_T&M zAc2Tr4HzGtf=&b^0Bb4)fI-^loO|3uh6vz!YA}d>-;biGCadmvF%qamqf^8Ca7YbU z16F|0WQ-vpl`&QdX#j)(12Bj(DVgAa3_KxYBF;Df40MKoz7PN~$TA@WcW16lr)dgA z){@qy?181BvygxYfIDX`pgXNgDTBZdD}fY{Xv(yXqWHqai_5F4K^S)Xy=twVWjczY z`Ni2V4A<7ysl|p2K@}Q*0n%nmJA~R zKrV=AquWi>)bl)^X1?!B&bSnu$Yk1B%5=&FB16uG5FW-5kO642FmA39LSPU$!Dq<| zA(XEMQGa>)*6i%;lTSU}YPD`HuRQyWXSdeZPd)L(vBQTAQKC(nWl#gyUz(CPO5dW8*D(BTGDbT$8Nr<>rNKi7Lzf=Yz}NG7=SEr10~NOP1HKm$hr zLJ0sG7y@vEzVtu?Sjc*b5CT2HK>2}!gcvB02o@wMFbD`iP}$mSH)or194n=i5&*y% zX2y!)bkc-OeV-K+z&+_}YmBj$z@(`*wjXEO((0|XI7utDy65}t?auc0HUs zk|e2DLQQb(<}IVmz4zR+v9X~E0^c{<7_Av&j5AKwT5X98S%%C~?ol9QmS_kyB1^;= zW5`gk9Am>#GL*tQapJgAa&d8~)vWs-KYsM!=K9%gw>#TtRs*r#i40|#Hc^r=&W8qD zM9v9!I=4$E-(3n#`@(xzcBrQlXMwwa!@G)L__J6h+~MzeXLb{T`|9VP5%rW17-!ay zMX*wCce3*@eD~G2&No8;fwQMR`s5QIee%IDkPKjuSpgJO!^~LboQD8pfnkmj$sri! zAc+sYeo6qDCeC@Hb&{nZ1e21Xu){4Q1yBfm0FIymLJm3u$UrENRe!84fhGeEFzDK_ z9s+>PfJtc0Gzp+u4YSNx3x=%Vj4>v5TIzDZ)%$8p2?#+TZ}+>1%mQRd+N#$KfB|^v z^;;J&T~xuvHI}zIpYn^PF*^{2&xjk_qKYF+vAAyoEWCUFCr>B2uJdk> z+$apCgio6F0ZNGk8X2Od~hT-@$--nww{?5UG0tLrbl{A#UQJ$m>E5v{Im99TNw zd4Uj&af!?#a$_j7+8Uh)+5waWs+5w3K~x3G(UM`v5RfrUvlIY07xh}rIi&;N>-FQc z)%7e*qkf-bwORGvy1Bl-zP`D&Rjt?jAV6fCbH=#QrewD*6uS@7cD}FmbJz5MySh#b z6ZHp6Q+a!(Y~X!AJnxunE3N$fI#BHJ9hS-`0`a=Z{2tL z#JN{q{LSC_-3u4b{ld@u#8da*iy&6F)&-M7NCzt!wc^HM_%9Wk&v`U#OP5?A!()#ZFa4#3g$2)(2*4RK z#wSg_@7pqn;%cqBxwTD*D{Je^Yio^#C5!C0fBz4*d;Qkjtm3>MB}NEYt;GbOf^(Oz zU%!4mHXtoN|MII_n;WyOne9Pz@W6q^`FT%DCMDyX$flW2lSElA9d_J-$cM+aoKS*j z1o|~LBkf5~0Ao^RI#Y}xK$N6f>slrBDt=O{%*`D}fFv~p{Mf;{&GsgO^@ETJ5vN(2 zq=YD?!eJPzI~^ie07BY_l6sq<(&;uF+Sy7TRS)|OG@r753YX-&QE2~WsUmo{{4=IS zmp;7fuR_TvksGf|YQfm`;WvgooqU4fSE>B7ON`uP`92Dg^6=-+SYF|XESGHrJ42-J zq@P3QYjI*L&+Eh$C<58vy%8u+0PUgeQBi?*sWCQ!#r1w~z?BSw&=TBQUcP+w%Jo|} z4=l{TdEvs+p(C@c=8JEhzw-b1fBneEKl<@!o?e=rA#KSJO2?Wp@+z^?XtN@!KIgi5 zHwNY%4Cx)$bnlKcF7`8c{>4|$UAg-7$3Ai2nfqS7`sGfyfADl|{N<;9=$Uhy>y@L24M(;xx4PB-(u?2w(LeW@=bn51dX|3jlRx~*`ua!Cp1peY z>iW08_1Tk0w{Kpnw;IZm+FH(7nx#rA{ty4rKVl4rbRT)7(0eXhb4AdSF(ysZG}V=Q z{l>~hKTfu`yQ!s_`K2p2Z+-pS&m{z;q^wjTOZ`mCYApe}bnQl^+T3jS5(D+Q`K@06 z#@d<)f>@iC&5iD$?}Z`boPZ43Zm-8UhV|N3r(+poTxetagF&y?Z#0`qDh7xIf-y$9 zsYEa?xxk?lLNM++ECu(Jbo*lv1Y{lQ4p?imG(C1;acObk!ufNYaX?g_mt>hGLdH2` zfCOY25(7dcOBUVICt%1JAOmzChEtUP>U8CDyr~<){JQ(e3me6uA_3Bn4~Ytdu~U|Z zU(2r-+e0~k-F@Jk?_^CXxHxwHAZL`vZ4x2a9ToDRAcl_K$pR6=#1HJ)fQk+nW5%#i zEZ>01rP)K@Btm15R&Vh38$GKW)G-t&XB4Wks0bnh0EY>hso72v)F(CJz>uFpf z+<7q?0uOsBCRd(VNxM_+#J^}q5nAO6x;Uzlk%GMnA^ z$b%0&^x(>^<<-@-FMQ$i_s`WL=D+^tx#rB=`d0VR$Dg|Y`25S4R)imd^tds<{L?@2 zxleqI5aKlUlwbgYvncBGfAFiny3ek@yTwVM;ouH!GK|Hkjgr(5UB7wr>h+sT2M^86 z&7Zq;G0t>Qsaj-lnldSgvCVdSd%Lr-x}gnOfF#W}x7(>Um1Ml7w?HJ2S)CXj2>RvZEQsX+PzKlG9Wnc}g(A-k`s}u^~M_ z)0zn>lp-3km*w%L#1I%lZc@h5CYkT5SiJwG{WIT$hXS=MBgO@4ULoI}i^J3C&B5VY zREUusn`8OIeyIe9v%FI=oE*1Nl-z!b%{|i->asH@?%0QSE$$FsJlbehhkQ@t*T;Ds zZf~3%3do|B5?97p^jb-PjqW=#gbt<2gbs*^j<=vp@ix(?odUI(;&O$FuMbVKqs5L> zh0V_WZ{%2~axKiy30Qsrr)aX$VuOR`JTC|oKXmia+2=npnFH;x`Vy12M-<;oRH6ox?*MOl{4 zG@A^ev)yLaNQgE*;99Nf$rBL zHx-aV`|fA)^6uL0@#^~%sMC+*I8wKE$g?rj^ca88c>Q7Rw<%D^#Sa3E9SlcZpo02l zWGfhxtkVVR7@=!oet-FJLJ?iFLRe-!$D1**G6!AM#h7;Ju2936}i zkPtNiAw$N=!CMHCbL1k56RA9H36OIkEdgUfO3xA*qlv5#!V5ev@WLPrDBsLoR1W}jCq7uO-GAf=cDtW^{KB^O`TJys2wKv}+E>sX`W82;C=2m-iyKOAhtF@)sg)5gXZ?)S84jwSpY_&IMXIr&e zwb^K7Nm2K;ViQAz- zWhH^i5P?PllHoA8*5Q;H0ot-abqc%l6YmtLql4u;6R3A6Dc`n0Ei_ajnlSkmRDUr3 z0d`y`V3r&o{bc>=Wb_E8WSlJT9lMgb4@ntaWoO?c0AsCF;~c@89o46T{JkL4&nuMb z4@vdW=zQlIc7<%whiT;a*4Tm^-#w8XveoAg?)o{69N$u|dglA4dpjn`=*dCoEfF~_ z#}1Vh0<;7Z<7vx>hEmx{1L?lt{xSeYQi3 zIMV3UW&u*NcJ$iixhx1ENs=%OlOzEE-}fC=s*)nhGMBIbfB-F#%g{keia~#1Es&*J zwZ664ZZ=wf|G)gtlhxHhd)@baU#aWYueF+u2kyUb`PPkE7L8U%0CIt>0 zA`2Fw-7&zhS!2&V_v-Ke?!P^G>}WLT{mL)?l8xe{2W9}^^0oEDhvyi=t8ZMt@7}|9 zNVSgux7PK-oL~UG9?S>eb4Zeu32uPe-HsPlr1CxhGiT#8{p#1g4rzMy*wML}*?zar4j())KYQTNfjEw?-(+DW^gNHW zCTp$MI?F6F!30_BAs-B)Y9&}&Smd17Yt>K)3t%$CCBKtSmJ@4?cOC%%i2;C8o|IBb znWb5?UbDzHx7w0(V=bXG<|0GnTqxy5ar|Bn{JT=huiQJY_JJ;AWCi0PBJXXl%FGYD z^mD8}j@Q4FM|O(N-q9lCJR7vzUw5{@2aai&dgxtWSA;YI8#;Hxh?ITgDaaka2%Jl2 zFmq@cL^ReKW2)7fF@`a&wazll7|XI0h>T99OZ`C{R4c^T z^2+MJ{)2ya=D>W`>(uKtqqDDn^{YwLf9C0@10|0iJv`THZEma+LtU%Zlm|jaR{J@N z{*Fm0yy-(KX{SMGGe%-u${v%Cbm1F9M8@9ru(XZM)!CVuIPC|@|L_0XfBc=7UdaqJ zXJ$YCiBDX)cJ<3&{?gC<%ujchuPodCwX2u^hvm!bm#@d&{ujRR=fD2-X94i(4?pv- z|IKg3aq_WGeB!m&-)OhD|JL9B&;HT>@xT7;XFvPWOD~6k`oI1+zk1}zK~E_I(C%z+ zY;DhY0ec^2n;Dsu#!H$+)k;NM=neYSAdq4v>{$^B@SS)k<$|-FYAw0%vHA1&d5@hUk*U6xk}? zp;`6&P~M(Nc6^|4=U?9sqUBvJ6FdHU$W>JC&(63{++mY169n$8zeoG9pJ>an<+kWp zktl6y94(dV@3yYKU!$4F2GB@1&Ho)D6GomRM~=pw8x;Y8&>8?hYta}qy4P-3t5wEO zC$V3t2qmr2NTdK5k+B9`rYR(2ZM{?o+GCnVp3&hrJ5!oV>*gSe zT`K4OD_>>52K7|L|M?YCiPd z{O)t>*DgJH`Y<~ECwx_Rq?`%Z7HTswCB_`&(c%`4*A(y6*a z8*M-F&^?Qd${+s6{{Tii+FHgjtkl9xC)%W$dEW`t(IA#grU2m3vx0#q1Q}iRy}IvZ z1atM1QEDXtM>utGAx?C!-*0bi%+;%lGmTnZ34p8;a5hH(CQZ{Q9;9iSBsw!nN*4?Y z1kFYx@O{o0ShB`u+K{oxOF8loT(IJ9^STSodj3Hhg9z2IvN*r6w!V=J2Ey}dl?nk` zt(~>c) zpYImK{@X4SzGTX?!48d^BTO0M5WJlX`a*I~2(qNJ6o@<_gs0LtO1qu<>~0CPx+)JkC4)fsjgT-5W%WR!hw^Z>?|KcmMrCHH(sj z3DugJJ$m%m!w)_D>{tI}b$Ru`!orOkx7wSVf{8~SdAKTeHOm#CQ35c=CP@;k)QnR!2<`s_{A@7MeYCPzxjv9j-UAXzxaiA zd%M|eKKtC)d_TB#Yx%GI@?Wlmq4Z>wWC&6U)@;qLwzscdyYT)MsNoP4 zOl!N-H5{!W1VRF19axI2rBSY|JHT0dP)b?b*t^;XB0Tz?m-mUKcd|=U(ARtM;_gem zzH_SNy$5H%f^+1T`Th{BjwjwMJ#!xU#b_u{fs*c)tOOnp0U*&a0E8Z|gepQ4aayWZ zjMmG8PGVE=yr|m&&o?@=)`Vej@WA4Mg9m)yPjq_u>eYwOo_+DigPI94AK)A9>)u2TYosJ#p&#r7KCNyK?K+%uH)-c_q6iO?^L@Zt;aO z94X7PPN%cIy*(HVPMkR5(ojzD0T&Ui?|g~hc?$%%xOfPF+WlUm(y*C5eB=nErdqGk zAemoW%%Z-m1Zg_po)-rGKmE0TCb$BCjP%UGMd0GoKla&g|M-sy&eJrjHXA{`BAASl z$S}Kf=s=cb4zA6lNOVRZ2T`16T4(ls3QC$*oQ-}G@@|ZsbXyVOFE`p%T zGF41F+|jW279dK}PQTZWq9oH6Agol=G+W=;9P|fDdXCB@2!be%iLA4t6j&G`@&nLR zP*To}SX$9!NlICOk_zw& zQv~wwM5*iqCFMWUKt?6>KMZj_mT)XD>79U*%JmCSk~U^4D5+rMyF*ZtOBXx3K13lI zW2S2%ud4!-GzqraJ^wBdaUqnak~AF*`keD>wYuGIDCkxze;i2lca@=uZ^Sz27YcJ11yKlSNzZ@u-o&wcKxM^0Z`?*00& z|9ZdQf9%mmZ(O^sGu`j^Z{50i^yrbF`?;Sxb9!mJXEUweJb!+x+kO7K-{YRgmDi7x z^Or8RX6I)Y7H-_Q5lB&yGTPes{7?SGp}E;xS1v#E_=mDM0%N2ULI}pW9|RSjv!SbN zGHhl%GPwAx)bxbp`z^a|ClkTVMJX8n#})=qN*WM3Fab;g7ZX8XNWch?ELsa-fXtBY zq9kCjWMKq^u?P?5Qh5S)K+A)5ypv0$dA8n-g*AmU;&6M z01JJuQLE@A&EmMz-co$776xi*F$eJ$VaN{hIz2{aT7Pa&xd(v20YXo4+31u_d`EF}h?>Fu3`&Qm<&Gp^R7`j{i-PF_l zDx<~q{oj38FaF!GKkrtYV2+}w-|q*3Kiir~l4yNp`Ov`wCe1ciZdHOnnCyv%?`MFa z;>QlnEj7Y=Mg825{pi2=^uSt??9J?=Bunf4pwwKe#Via4Q99_EYPDLgR#Zi2*^v8w7(g-_>$^}Gf+3gY7d*ygSdmJ`Nn&)y znE-3!Xh4KP5OO9gS;m+nRT&$C_s%@Ho9}bC6a8*wj}!e}?C0dg_hiW4L3y|HmF~Cw zcU*s;pQkbU-XZnwZq+8PJ4N|z5aQoqHOwCHkLh@{q#qlUcYwf)~#EA;R}D>Xl=Eb2}CkTJmnp22G9(m)Xug1 zehi_6aLy+H2B0m3Kt4n3NoMuIR%?4>Bk6R*TCE~@q74`lOn{-SjrELUf2%!ruvcd1P?DyR%&c zC+-{v%D-;0NFqxJAQ;vwl|iTf!4jzB=#~63?gWh?03+ax5fNt$$RdFgtde1?UiXA( zx3>l3iUV3Q#<DM3&DGG_5Lm_;V=NFV5Gu+t$x#XpWXXcyLMaa! zW;!cufjf!)-mCJ?U!Hf43eLxKKcn#h5~$9AzcUZ$-P*Nw%ZIw#7)^+r+xBO-_J_!W z9ruMX_u^#z9inu?4L?Q{uuB4&-P$R4_)f=d_jV>qx7+oU#|2N~Sf?px5ctaDJTX~S za)Y$Ja`V*DW1o5YJ_NXaYxCIA6AYl2L{)}A^An#t|JJ$1nTC?G-|dCYdX~jP_)(M$ zI-SbGyh$T10z4{RhlMK zce6iZL1bph8U(0S{6`;psCVLnBv8j5vrG;%)x3_t7+Ho)Z~y~{#D;WsQVI?MTEmf7 ze2+7T<5UKIiBM?hG^O%wcj?oerHj%Q0D*IE3|XVC1t}x~6C7DiTWp8tCj>$vgfY4- zP~YppA1mLtIMKTzP(O&}-Og9K-}ZOLr@p=RcMCt=Z(M0vB-8Ec?{U5Oe0LMn2rfO( zH#$q>)c53Et6{QaW93$}8h-D&Z$5O-J-_f5fAPsj?gtAdqtgdw20HbGOyfb{nuU6E z_KC-{G!2#SF~$I@zJ~zDn9x(<+$Vb>MBjN%r?Ky=d+s@V^ym@6A&QL09qO5~kffMrufu{1t%wW0!$%n&3>gv!B0$cN00h82_naYm|HYy1XMCq%$3_xx zXwqSXoO2w4CWOlnh!iL(g$$HL1QvJ%j`Vy)U|TG#+Yj=PD`bzNwH8tc27(C-T${`o zjhrD+nx)a8pQQ;h8OL#^Eh74%mu0MM&3HeEkeyhM{r2izHSO+N`A*#6?~mdPo;%|# z?_!?Lsd1cpA$X_9eeSD%9?v>8ZgomLD~{q{cT-QNjT_v#dRhdCm+Rbi+@|(tYV}rY zrr+xUz{0|UPNEyvuXEC~jat={KmU_I@%f+rse{c>0z`vU0GW)3QpGl%Z_H*ki?TSB zequ}%M}hBmyWK{uX0(Y0gL=INg#AHeB?FEekr8B$YK?Oas4W_ubURy8d9yQ(nkC^s zvfk}4U%27?k2=Ve-ZCB-wlDtD_jRU3$woFD9JI?Fs6 zSkj2-`<_&x=LdjX2*Eg(dFS7AX}TM1^4<2K-W7qpe=gtmvb??c&i%E&pM0oqCok!= z_V>C@d);g2#hoVKoxkqv|K7-^+am1tl|MC(qF%Qz1q+mnqsXM`(W8f+dE&93`P7Hw z3|cbx+ciVwaH02vb2DD(9XND=GtdAgO@va6yF^!H&;l?5FkpRP zyN|=W_%^+hhKsK<07eFhfY3VX$06*9@@;;Y^&`(F0hWU)-FgBP3?(cv0C2Djh!X%< zg*>*}SY!;NEc*Zp)Y35ST-<0K+&|}GK!)gm@9xDDQYs;UAj>i!a;X*AxT1*@2IleN z#7LRs0mlb@qDYPwATyT0a_*9oGnYat8ua660AvLRjusH5K#Kqj^K4bqkx`}m3OPaO z$V^i@Y?Tb-?uamo{wcmb%;Gj0&8f+ns6^&D9L!xOWqM(|3DmvjcOPX}@WTH2(03#s zrSXe*(D!#%-dmt=9*IBX1sf5z7FM$I!xvd%%A;IvAM<#N(tSq+I5^QC%GV+y+S{tm zFuDW6sD<(VjYrBNkfnWweihBT)Hqb$b8}GW@Lm8ICF#M#hq7d_dh5p0Z1eMf`4>L& zyDGQLqX~kCnz=d?Lw_}R!bq8TB)IbJ| z01iM>DVN?cO5;Rp$vFq|IEI{C01NQi3*Ub5e#(1Tf%8?MIfJkyvF#EcjSqfEvhJ%NchqxcqK==xYSPICE6iF0PLN8GsV98U`lI zB!|!!X_{`VtH=S-WVSTKcOfxsdIYb|M; zDW z1u~?6!(78=h{MRvJh~WQn6(m!@nIfP0Bd(-gC@Xn>U2l3wx$vR_w_3`PI$_`{ zW@Ky#&{3?q=+-;2BDf_vaz_y$%h9k{N?bk~2PzV>jZId8J{r#_SFE$q3yNc(%X5`4 z$6T8zQ>IO1e{CA@o@gCb0t>d??LwdimwW#l<*^szF5wHR$#P6TTM=1_S1M>z%EcS{Meh9`GN3=0WA$ds$LZUL5zi zQq6k3pTvRZGtME3yg(?%G#Acd$-!k(vqErffip<8mRwY7p|%DX6Chz24M}7TfKq-G zML@Rd$xw+Z003=vxBd@*`)`mJe)~J$+uqz)B#%3DX8!Ca$309;A~x!Ng)gQiAl zc}s85ZI{qA_vDBNr(`&tc!SEq%nncY41n2@5MyjigB)A`QwtZ)4_ua~RQeJDXa+cO zWGv2+rL{PX1q6*#z=W_wLP!f_iF_&FcLMbtmhpio4dS@wXwz!q0KY{jG}?yu(7t%TVMUu6Ay9# z1)$S`&yd@==6jhj09JW^KhvQUl^}=)0{|3KrN#)!xezOB?U|V-8-~M6Asn5IwFVh4 zJ+~7b1OT2N5}-~qMnEjJqjk zjPWtjrQ1g447InZ*QbBuU7glHvxE=tQrQV6+865e`(U8{eh$UN<0F7#K%B)%QekZM z$`vU&&(f9i=UploC8U&Iy;4D7Ix`5i)~E-*=xwYu=Vw3q#1kCAlBsyU0Nd+qSL=1o z*dR$fFEGYrQUHKP9t0i$blN>+yjc(C=9@_doP!0h+IWHkfYF*Wv}5|dV+AI6$oBk- zkcP-=LI7mw`O4D(3-j}#3K!=W8exqAXfpc+KCs6O!8(BV_mSyU$mB+cw^6Pu# zC`J@Qxa^@8KpPDJf{U^=-N~9Z(SidjNhy_5P7@^}Ap{pP&WtC7SCx)4Gm7Ih(}EB)y| z3Dh5mG7Wm1W z+N>G?129NHa7Zm6L6)RS1PDOZ3gMY4Dn9~%CO~9TFy{?5M4BuyjM5kYEEuJf0ZV`k zS>Oi~k5Bk^mDJ$|YKIwK8IA!jCWO;S4}r1Gx3sm986wKxhWV)cAXKt8@91{<(@1$9 zr%ammtzA&Z?>m8dw@TR{UY4oT%PxPh)|R2Relx3Mx%HzV6&QfKa7{?|F z3lCBl1OgcVR4WxFrAxqzjLXa-G9d&YL~*j!Zd)@j#&G6bpSD0TyI;sUNr{NaIOm)@ z#nc$1l=3{!h3;sroijC!ll=_l2Yj3SPvv$6actk(cYNv(+yWV6jUcNyqK<`0Kl=Ei z#|~Hi$A9ww`_A*vojQ5aB#9;RgbbuewI(5iQbg2A``b6KR~KeK{K!KNf|TkENdST$ z1aTC5K~*R(vBVj62Fc3W`tjq3IKX;0ffz2FyU=Vj?mKk|0gMHY11Y7AQJgs>;7%ne zmuHp`(c+Ml2GLl|lC0_l0FaXQg=fhC=04hq7VsU&)QO(#@I;QuR13CngzbEsVPz-f z$U&~&o>yi2KS$|W-HJKY_IqEcI< zwa&84ff^=26JwF%Be%|&;n(E08s>X`QCo@8ax|PXB9o;_n)*Rti7Z*`f{NWOtkqge z#<&oUPhTk&1cC4S-ELP1Avs4xjwpubgKT(zr^NzUL z_UC41s(!bG=S8&l8A@fGiMMD;S@^Z0{@c=)~P8FuFr%o8gpi;&@iNK2phw$qNj zf@ml=k1C}YV?qcTuTWkD1rD@?ddrceE|UynjO8@WIh8XNj&8(2sWb>A7sy$rwac9X z;8>IxB9!yJIUQ6=sT5aA72yG#bH><+eQC!d@16SUt_ak-CBXiZK)vf_zh>JXR0rxb z)(Gfy+d-&4_hWyqCcpxG{K>Pe|Kjgmx^UsyXP<3V!^fX~`st5ERj>fBUs!qK z)S`Iok>iKwJ%B9J%oCoFz`$yaKq?3|fCbp@N8fqz<=4(%c>Us~b2pdk^~Qzs=a-h2 z9{=dap85F4<`2(4_uV)8+gqRh#4`bdBr{3~;9MJxh@6H&l_hcGF1VNlr2LqK0KFs$ zJTFa>su#GFNx&HFqUpYkSE8(Cjy?}DvUW$KL-0{f7{Ce8C9}&Dt&_<;r?jukfMZW_ z2fAtTt6_PFO|e0{zFFKsOo#xxpE-Uo1!@6(-Wj8cyMJY0?K=mEt$F>;4WhAxkn zHCh|ab(R?^1K-d4JUq`DW308&4olshd`v$Gd*y#Bdz7it^leDiAIL%oiB3QLiH{we zQ5rx2Bm@sXc_*A6&prRvm8*wOpIvEpVq#YLvRcd9otIvJ>-9I!RXi{0 zckjLT-V;l$C^KOIC}ftVQWQbIthBFy)`oK-1p#k`7;43)$W$ssFC#!gHngH50Wf4pG$x_F*S-cHD+p3@9sN>`FX^ zdyJ33-S7IoD$^10yC(`RtEW@q(05cWVmHhC$R68-83KRoIE+W|$%N#t>?AZ8hfR%D zLjW?woSD@E0eFH-84yCH5)Ps`$+AqFPOrP&=^$by3{IXnkwj6y-*-;aAn=tGWX&jN zDu8vx7;CNXDTg0+`f(m_!5@Y*hCzGK``WALk1Q@Foz6oi54K}?{k7LmojP^o+=i2 z+~Uk50Al1t6qx z1`JR#WMIK?kY#J1v2*2!)ZUT=S3Lb=7yAkQ_9YOlN=CK zWK?~JKQ#2F58bVX0yu$k~at)|Q-jHFi`?r4l+RTNtbnkqd5yKAZBh?=kkf5j%`fS~#&T_a{*AR+-+u z^QrH0=c(++{+93i zzVH9jU;C%mZ>=9Yd9pX?A2>4qJOBQVfA5dJ^6L3>y(BT5_0yD$`S_Dhe)8iVU!1FI z0Kr+5nj|xR;H_`>Z>()pn>9pu;q^;j{@SzK{Q(ccerB3;^Q-F{QIZ6e+ULLU=RH4o z^|jaII9*;@xpMXDAAju|m#^Qt_x=Zb$+mlgbLZYzTw0LA<6H=-qBz#ZDCK2Y!ZMWomf}|2;9ZSD5We}tu)R_En?bdfX=4EUaiaWSap~aZ=GM*C_4Vzps?>T(ws81p zqZ+Q=y7A5Ly)47ZF$rMZ8yU6{?DYJp z6Zv9ur1}^UW^w&)^)m>nj4SD())^>YB3thd{@{65_bbQGELcRZQoVTf+WPv2 z=LZW14&GQ^{r!LU@6$LIp2v~(lDNOI#id8c{^Qr4{mM7Kd2nHFwiayk2F*s}{*xyX zfVFP4G&_R;F+q|VfxrX~GhVRySQZ_9N|uL4joh&;Pe@lXC+7b%1dhNtSk8%f z0hn^+*S@E$(OPpMgzx*FClP>2k!D$vBuSEJt=~yTxryvoA9RuMeJkbU+dmjA3KLH^ z^_+CKuD_!~EDXZs<>f}B&bi-DdaY)w*=(FU_tvdH`BTRD?Ce~er12nCo=;XJ8EDV@ z`uASCa{2P>uf6)}#Va$d=E|+*?d{H)v-bqm>UOW!iz24HtxpTAW*)V@RFttqZqSx^eTuZ~Z~DQU95r`l*Hac_7gO z7^Dy?P(i=|A_A+8^ec?PAk#|ZCu?g-8;gjHGd9jna3}c9im>T@r+>H=C)qRLTP} zQN-Pf``q^uz1@w=oY*_n8oC|kYq#cad*8|WyR`qV4$sgnR0U6znVxzN4r8ZNkMRD4R zV%hM%_3F8|UjJQ_CO`FKpKH~s>nqC~=)l7Ky=P8UB?o{MKuJM%7*ffQ6QijSmcz0$ zj+1gOBvQVovQ%3Wr-|ozF1{eFR-XON%YXExKYrwqN1lHAX{Ml^K$51ln$iR-+uK)H zS5fe6ds}!asDuliN{s17kyT!f6$1FqOK-mP$}7I_zxn#>=ihjJu2FmZ$qxm=JX-4s z8KwQOx zOWC`|$I-Jz<$YQlcYndg*VpZRwD0;s#FoxLBV&WLG)xH$@nG&D(5^iTFKlyU;xrgM^O|-kplxyA0B%f6y*fUcfa{i-`)JF z?kqeFE_1{>lajiqsl}M5<;c= zx$hs)CJZA^ZjPCm1bF%rTt!aabaF^-rm{> ze9stL3G3_Yo3%=%Uaj1^el3fmX0_7a-WqhaL8pfn7e4;cXFl@u(?<@rH~_O?2T>q} zQW6o21p;#EDyM3wy9!hyhRl*R#wZ~XAkNY_j-?;|LD@~a(#()5{fiyKy94Bd#Wtp)yP19DZ z)tspdgmyOyg1{5dj&y>|0Ic3xzI^E-T6^ZysWT@IIXVpPlvFI`OhT}T6J$wlly)`w z?iO=G)Bd_s{7khTlwyyEBB=zy%LAB<&7C9!7SIw|WJD&AK;y`J2bbr_ci!<1Uz9P4 zMUzRSCRrvYzWeSQg{O`o&-2NRLXVvQAOp@-Qc!J;jX93Y6uD`aPd`9#j=(u*9%slH zQ<4LKF_>!01>*n$0HsJ1PL_101sBtMj&~T4JzP+`m{6w9CEiU&o@rq-JAtZY?T|(h zY3@(M9AbBLGa3e(OkF`(&c0Xl3{xJNT#CjXg`ecV;%IZ&$83%Dv((|S zsJ2qLUVeS=@tFcC8r#gBjeGdmSgt>mkc9}y>+f70MLyP@fkSsPZO&$6tsM*oObXu* zTFutV>gvYYM&SFkW^K^zb3h@4=XqfmtZr-o7n}=XtlpXlgTNZQvA$NRRFLtlcH8rV z!-o#7Z*DFxFCRR3sI%3s)$090q%CFIEX*(VdcA&sfQU*eE&Vu3yJ?bTrd|({UVpQ_ z&4nby<+U~9Vs>fCq-oHcsWn@3t>(tc^1t}4-??=C*022XFSn}j-4|ZD@8|*YB`|b= zTe4&gF*ZFt@x;bnNK;F6;nIbf**U*bWdIq#TUTyezH$|nGC_Fl=JLgr)jqH^O}DqV zx4YdqN!o_UP?9FI-NCnCe5KxK96NFB)X`(-UVfR3zPYw>?#h*oUSCzJURXJH@@%tF z=Kw3$uO|JTv0woQNooOC*Vk>!c!95!%y&GOKfJuMOC{6D7;p~0&y}hGRyZprGyk_$ z3k*S=m_{HH00uCB;^2cP4i=ebvWxOoHHdD0}ueoAP#*$ zjWUKp_^25~2Hw1I{rMNZ`MJ-0VsW-LNFt>?iBf|e45E5iFW~j%!gA+gZu88vQ8GtM ziy~i}wN@LlMsmTWumG7M!4UxBBtt|gg)ziA5`mixYoXH_aL#KrPa7I?=a$|(x|#uDSgZK=*N<802J=XJYXXKIe)*eT6P z9AQpqobPl+l&$O4kalVqdTWVuzK<=GfM{2%PN4>kG&#gPms3eS$~8!1Xv%f8CQs8# zW148L5e}Oj-V4wSQ6Ys|<_OueG2}E?*EgGg&xz%chMH$PMQbeqB6CT3N6+H^zMF=< zLsNIpi=+MwbyIB&lztsP7g;E4x>%fzsYtduk?7PK02&R~a2)cl4^IGvIJMT44_ZSt zx2RA+F{aGs9bq2xG@V0%kE2K=EZ*0lFUl>S{D__>l6A}h#2HR|Ls>>>X_RlE=&f)m z+eRQ5cY3lMEs-H2OSU)@0Z`z1y-ufIsiaZ7cI(y`e(vW#^5JJ13V463>5EFGA~%JBJS+y8r(B!Z7S~dsnVqyL9<#oTRgJ z^9K(eY}D)98|&Zs*0&DL&)#?H#K%AU)bT?H>VeFnxU;#@sMo61Dk55A5YXX$ONrv$ zxaV^!IT{OEYeyI$gb;%5cB-42Abs-RiPXP1`E??&0Q?{PqhEE3OTLRS6hd%@1^^jT zLI^}8u*T`w=u*Jjp`>O*dC5w&j1y_(41vxJS&|~(!nFp2KnMny5=a33!N8N!mqN!{ zdXfPq8oH5v{^i%sUAcPn__0RKt5kd`9Eg>wgwScPN$O7QX6X|8=lyl(-eUraK^MY04O-iBfb$hB4f<4acTom z6!rW4BuOU74W`V&u2hAjbw)&-Gh>XkhH*{~K~M-j1KKl(gdjiHX@88rx|attd{#3A+7vjB+7=i*P4- zn|tEIa$h>BW6{neM83GMdohL-t2^iEcCJUH(%BiOeX$(P0u#VUnlc?D#Sx4250o2o zhmTu|1;n8q>|$8U2IKv{-N{258A|L|*YaqAcL1FnIWKkT?%+5t|BBW}z zX3n3#@U^c$d*O1LYLZkB;&d>G(^NC$7T9*2TwPsT-q;$% z86hJ=AS7dF>rI;^#||EvYc?ysuhWzxV~kZQq3?T+6+kk^8Dog16cLI$i1CWp`r%#z z&PqHr?w^%@CMXJuDW}rUZWazv#9`#6w>UHBm>Umxx zXaGP483K~F%$xSQ0~iB2FbBX8F+>hPj9CCK9IpqE$@{4h`l%6$bAVo!bvm8E52}@F zmSsW+2DsJjtgfyeI(V?ztY~e~Ft*Ep-mOvs-cD|?&Z6b64v+oLoI57OhB_%jU}M;K z0Koi|T5Nfi01+61HdgUmy^oVrYb}HjN+AQs+*HKaxcJoR>E3YH{HcIwiL@~Sk#R1h z)DGNatsZKnMPG?XYwdZSHd-4kg*3(_aUun;gf*=(O;c+vS?fY(-G=2BadAV&7&5k- z&wj7*pZ1NiE3`D8@8(kYzLcE-Iqw9~vqwB=A!sKuc<)A8wP!n2M956PJ`KjTS3B>( zk1&yL*?E=o&op{#ElsF5g;t$oCJ=|LYWYFI7V1~IXy62#kcRG(Jj;az*6T;nAgYHU z3TcU=!Qk5U>mR*mNdkA?$Gs!$i$0IS*$IrXS*BBM0NDIoD(+{@2EAyY)6Dl&mSx6hhET6n zvox8To4x;m`(~=4V%Y6=1*3WxEY8iOY1-@c5U^UQ_%cuMEEwOd|1e}VFKj>7TF%wm zp5n3TE&+W<{tg1+qI4M|3W1CnV=}ER5K7@(_lj}nLfE-MqHEW}&P-?J1n3Naaby76 zfKDtxRzi+EPU6rH06|;LND(7#vp3JZ@vr~j-~Xi_|EvHQB(c`X zwQE=JJ$*LK(nh5YrAI2{2_Y~BX{HG{ArgXvsxm2)OnaOmKxQFJHCfA%5o5yV&Y+zT z@gS_!D+sXN?hgiorKQE2Yb%#8U1EZJ;c;U%vx2ej&n7zMF7E9t3o_baz$qjs8%EC9 zJct?@Fu)wd#D@G7+Jeyr5v3i>}>UO(Hk}$@&kh6;mh9J{gTMLXaAsFXO2%V<8 zEa&N=TAXvoWvDza2*cbaLtw3TuewV!Ace>+Ilh-9i4>fO`n|4{vJwVSG;m^)ac&Ev zAC*Mg7>5xIAv^nsV&8+Xi*{(2KL~JJ_i*nx&UHdMj>VNCOo+N+<+1M$Ee*TJp~4iA zTyAQj{qgHGex0UXf7_#1G>b!im{R+NyLm?(HWY$$w3E4@7MHgeimLzsV1ZfS#5iHD z2x0z;Q?*)827M)^QYsk?Dq&Cw{9d=?82hx=&i=`7w|x!$(`1L<1t*(kYW0q$L1G%s z=KR9Kwbk`*w@Zd36YZ^bzuUJ2^Ka>fB80@WBIL{n8&v1Y@#1MKh7hN7-(-vm}n=m?5*q@K#GQ6oP}@wf{w&!aJGM z>5cEuUke|;pdlv^3=@(FAqbHG3|MPyrnScfGC+V#TNJFwZ|-zc90poAV3o082^a?p zkYz?m9>pmD1fF6XfHUh(Y9=#68J$&>mxAv1dS1022H~LJuT`o{vMAMoFMi^ueq7eW zmtT1)`|-~rfHCZU`JewM&e=Vu&jPUm$}}=R6^1WFKrm!E=K>f3qyQW3?PjxK0R|Sf z+r4No5KL4n6&Z-_$SiNHZLF_lX*M@I%l#mYN`hhKx%F*1pS% z3GT5|7ar3xrgx(L4loT6ptWQXoF&H~7;|P4+ew5U=YV~9&(CI0|P{- zGHR`@wdB&s89TM_yMkPtP)9DfRMK+>6k{}J46L?fIWk|#AP9sI0N{DvjT<*Afscrt z_EzY(78mBP-?%Xt46LPbv~9iv#Wo3NG|4QTQqdfGsX&Oy2k@EWR{F`zB52zD5ONG zdQtMl|M;bs&t1~O+ltdpoTAJC&`Q2~Yeo5fwN@u!aTF;p$dXK3D}`iCSTbb60FuQl zGuFgjAhkB#ZdVC8H`APH*1%@>oIREFdST!hqsbb_k(6cGcBicb7eaW-Q%X5~hL@rn zCQ1Rq$lXB2K;Nx79^W0DrGNnl&N%^S$~oRS=M2yS7yt$gIYTx=H0CIF92&%E=uic; zV1byiFo+^;3>VxIrD-}d)9iFQQ54P1%+_n6@_3rrBr}1hq9k##2`0o;#5ICwDAX1m>4TU*c4tX8efv}RP`fA96z`f(ITgEUP%r4BA# zs#mN1Zg+lerc$d`DnYB+n4g>XI5W3B-MuSihdCD=W&>c{cQElGNwt*10oAOfBuUaN zBcf`pK8T`R0p*-A7KWi>&>6&o!JyyoXIX}bOiH(%ZFf43g|G+|v6hIYujd>vGR>!J zjCR|N1u|r{HJQ;?YhOt~U<`dFt6@;7R5(Kio$#dal|;<{6iQwRgHEq+hp$aRmq=uNC_WD@Mk76SXd)~F7jfjeVQiF?)4i=jqe@{f9)8JPVZ$&>05V7b#v&OG zl=gb{FhG;pH2$&AeERW6A3d>HVE{sKqOr|u59+>=)rWu>Fvb`%M7F+squ(ENI-QL{ zvYluaRQ#GU#-g>rc~Ge`#y7XNrSg5>U*Fu6QduI0Q!!+%AtGR0a&9F~OiwqEqF{w`7a_A;erBbP&V2Il0&PZguj6EIOF!N2;YOS>~D_}?f znT6D7$+<+ZjAvvV7E^Ez1ewvHA7q)<+6XD)G`Vp8E%ej_r|*61wewdlUODr?eShH> zem+j27u#CEf{Jg3>M|Rq7INzpMAd4w)9I#ZnxvV_oP$n+T8o?@ zPgR)b`*7=KI?6YP;!Fo6IUlFiI!Tf=O^q=Kpmjz@bIv^_!@zfB#m1VAcH8$9S!1l7 zpPQ{#!ps=o_Y6U1OqOLigtf#l?6$B1E{ll3_PJ5g?W1xgi7CEM>)~B2J0;57GlAZg zfOiM`?$j2>oTF38d-tP;!kw$L?_~6be5FGf3JzQiRQL&Sl=FCG{&ngWjsiQ1a9$jq zM9SbSB19rah9NK{vKovAlcLQ$!9XV!5k|dE+S_{go>Qk5D^X? zGR_!dMjK>8aAc&bz9(x{BC3WJ2^LM}3HHXTFK2PI(5lTe8dcxtj5CHtlc$vL`(YUR zN;*TDv1F}1|W)}UauEtX>83rpkJ-$ z0TmX6$j?|b9C21UHwnp!fn?0{JV_LW9s*=Gv=)LOs8lMIN|0ID?rd|;D}L2z@}{KKF6iO>Az z|N5^^pFHuYk3NwZ@VFy|LPElFE_Flz(AIW3ot2f9jdr^iMM;_>^2``6MYAnuGLW5^g;(#B@mXk!5x=a5EyBw`F1L(ZAQC&zJg>(z_h8F}gvoleWmF&{F{B}NCYexg-asW*?P47DPx7lIG^0B+kNvPLz_#7sd!B#^8(vY?(1G32f<$w70sCnW+W5$a+>r>oDAP^*T%yL*_v81fY%41WXD< ztW>J?dZS)%kV?@DG(l#Kl(HK|l}gpGgoM!UZZ{guG|iGEAtEUi0$L;hk_?mXKvdOC zy#{3a-QLRe0bg1=w6t{p+0%nw@8IGB2Ow*7mU@y4&Kvb=7>0~7L%HaY45gC0z1BkT zA}Xv%Otklgy$^@b?tkL{#ozz?fXEqIfY;BRd-L462OfIpTQ9uu>;Lj!R_o11b0+kZ zC6EHNg;WFQFi0(O%ra5}qk&eEr5SOR>#K}&hRj+bK+eG!TM2#TDR(~V_6I^rUrCb~ zA=q}OU#SEZz*@|->393S@Q|2Nf^%sRzWd_${2*95bmXNs&iAwIwKw0YG+Nr)@4fWW z;~#!fF-V8#r+yMM!5Q+^jkQXp=9JVZj*Ydodfg9#&8@A=SFQv>xVg2JBXmB6^Jkllxn{HKdxw|iJdP4TAV`LaF%Aec%-k?Z2)FMS zPiy1iL5;DF_#?}-%L1p321H|Rl4&kD0%VprVrrq+A0%nk>kl?I+uPfnBuNkjco3a5o${)<&`ZEQeuik>!f&uEL(?u>HY;?L;l4GQwQ-cYG$&-nGIV8ZWGAj8 zx-iDVH(Z1z4_$GEdW6M&a3}EJZKF99El)P+bdcRrwiOQPiNuBZkPaKfJX~=P`BXk% zjdu%2J(*CHsZ@W6TE~g_utFIe&+3I`8V4FPIpnpRc|!`oVHij$lO#6AI66I-c|s|rq~}a@oN>mO$xNfsK*Y_hty-m4 z2`k-BH}pJdwX|8ymkR9a^~?Q@)lYupssHNl{mSvVnkS&8aJJPrzBC{8JHBKA6JRZj zYwga4I03>aUSMNE@ciuSLNox8b8Y~HVBN%g=jB(IH#RGcR%&djwFV;2EI^dRjIm5- z$UsQm>9*^QIv~YK&u#*Q35yf{A>_#PI)41hExSt+=eJdcgR;bY!e&|IcYq{jk;< zWPT_)N5O@!>QPrm(O_n#Vl;L8gIc9N$dd1T=R0$Yi#Imft;K~GUw?gLbtUw?-}pDb zbNIm0M?d_O;CS)I^+QWb1bnr-IXkyx02rbY3>lZ6MZx__CD9s?y>;&VY-{HDiBo6K z-m}p34L~If4lXWiZfpRN$N5~N(Wq4`ffxF~7VFmJ(LuayG~X|;%hd zIHF6R<~9^<%ywtc?e*d~L59XsoFo9?E1xl*rkPTTh|(-ev($yy58^22-E~9_E*d%y zKc8Brsg)yV&mHe9yENrQc_Fwt7hzao0L@y+0qWJN%R!hKBRH2*9X@SU#e5sKDCPMsF`|p?VvOl1>UF!V zW@|7QtgS3tYo(`r-)D~dUF&A8zP`Smrs8ocLXzMc-K5j)2`PwZeSIS`Mh2mEgdPl~l1d7rF-hWR&^>%`ab;zN z0aiSf3_3v&)GFS_@{L9_eEi{u;%IQ?(xqs7>+?VLllPxI>L?BT#rZ7FBo{r-(kSAb zOTi1FSdJ>cTP8w>1>!;oA#k`_ETXYyl;CJc?E!hfXYSJ!JWnmIHKbW8Ub}E*c7BeC zy6ao1v1jhPH%_wdm%e=b^x2D-uN^vY>fA}X~J$~w>MOax~J#+HZ zx1asSTd%(U*Z=A-J^9#~0`$rdIA_*Uo)N`ZOOT{#A=??}Dhv=naPi!CUw!U7-}xJV z^RFVni!Yvg6cYk&B~FMi@W#Vi zg+qr9g(9a1T9|3g)~iu}u-)FOhLwX$vr2;1AchCyBH95RHWm(3!0EXHchTH;mx?RZy=iHKYs$0%6(l;?T%_@qv>^9llWlAc9g7 z0m%2~XJ)w&wMvz);jxMoTV;ZG($GEW-fgZG7VXl0Rk6-3uFR(q4=z!q=TwH``mJT;;?+0ax^U_8ORv6m=HC0S-(0?N{nqj0C$_gcX{PUc@PTi9`}vF4 zuMrpPTU%dy_8U=>{*_<+rPF7Q3l1D}znRGqNV%1Uao!&c;xwsLD+VC7X05#y24Od* zSmS^AmS64)y9_ zTv?{mH046{`u**0H_J2^vKK{LTU)(ee-K4X2xBcE<5F-TgpfiiB~_ZF)>>n&*2dUj z+?Wtbd0YrC1mheSI&`ijV7R~VEZWb{IAzRaaeG#giq#mSb=KM59t;L?lJ*8sl4hRo zODWRKtgUZ!y1h=fJBVU!44@0tLKK1kwAO>cpx5gqNg|~T!*DPd?D7P+pNVlTb00hD zIPLD(4JU1e#TLJdP?_4F!sJ_cgNCbc6qiC1cP=p{m5kI_HlL1B59PE(d-bP$hcYQ{ zd4)h}(T`v+ICi}lt2|N67)Mf3k;)me+!zjHAdtp;SnA2H1WY;Nc6di)OwIyF#5q?= zIfc@_jAi~mEEv&n9|cP708y5vNgQdNWoaT9(`jPT1j(8#0i!FP7YN?l+GvD<0DJT5 z<(Yc*_`w6q*RDpL?H~HcGe7a^NB-l#`${N<$8c$O<}dv8PyWJBf9{#b?>{tKuZ2nw za74u*^rX@D{JC>Nh-Ry$gi^|X@zqziI@`0&nPSN~Cx=7p6yTlmL^-wyhR*G3Ib+Ud zjtmn6u`xld(ND7L%d5R4vBi?_7NIb;W?$%oF%S zAAag5KK;qTc5l#+UVG`q#~yl+ETvIY@l+f~WDMFo0M?T#3h%?9nHl?DhxW`|gW??C{|uo!-DA(}=T6OOY|hPM`kX%dadRIQX$oeDuHj z@Bg3e?f(5|k0XK6))<4sJ=Iz(CDX=cMl0Ws(gMKmUVM=W^~fV9q{ny|Y7~V`6DLkyyLyd`ZC2|XUF-x}2X|$tq?8N^Kxc#&6hp;w ze5^J=q&+D(17{O=oQU}@R**pDT!y2tFxp)axf6lvQkJ@vZHYRaPQTwr#3V_(y?ZC22DTHv+G|MvQPo4B?kNcSKq%bZrtr=nv z1cGy|GeoKcfs(?LOfr-lkc>%_B@-CZOrRPdL^Nav zQDm+4JWndM^9I9HBNoWqOxw&@F1Zq%3obtN#8d5VuiK9}z`y?8KfJZNcI?#Y`yYJx zfwRY+d*Q_g9)8pds&QtCiI-k`!ys&}tn`!k+UnZO(t&}o|KR`hkJp!1{?cFk3mQNH z2+1(l-2fm@1rr9I0ZOxsao$w5m9^F9Uwmc$*xBW+&c(G=Cgpaw-)J;v4$P&4sM?%) z;K`?6zt){;)!Lo**Pnl3@#wMRCr>^0$OD%y-SoIbOY^OnnP&6Q!KGHC@yG)YzV^y1 zaewf@{SVGGn}7NzUu$n|e&p$=%gHoc;tq+ZI7Ue-rL4&OJ#$2`i~*t%0yzf)h~ho~ zD5XrMJ*8|ey2he|$7nLfO;tOLdwWe}nQ1+aaL$l%BC{{U2?6X=Y1_53G1iHEm;1{h za;2w)kjR*^S(0YmUZ03oR@XewbCI$x*N3&%8bhEN7uHgmX2YEwt+l)RP;b-oX)<-6 z!nK^n1hM=|Pm8A<+H;2GJ$IwNS8=Gj(HQO3&d$82IK2ZCCf~9QmQp$of}_vOvdpQc zLzK8JtiCvvv-@_#;6h@YH;1`CSkhVA>$D|j^=fEM+TPl%hT+5aotMyK(mrWOYZcG)M3S0R8-_0X zllkJm|H`GSSHAc1EC1WS_rLRNGiM)o^d~?63$MTYq9G!!hpSOKnYzbA74`;4D(_xb z1mFl)uHIbl#plmo7(`K6txMnU_68gviz19;oebjM_QJu%`%a(mIG#Lqp;3~7OkHcALfkQ!Yijqb;Zc>0--eDB4VEzr4(mwxy6fA7Bg@BhM| z|AnJVjjLPfr7PE-dGe{n*}2WNbuX;cXXjQo*IAkzIdI_3^XE7hAS6inm;c%?x8`TB z-&&uqg^gU>L`uw#U zCQg6+M}D+6AO5@F`|{%a%&nChufF-_kAChm_ug}FRl@a4SC}!7>L3VD9y|WfgQqGS z+CBT&!;jv&aouXofuB8nj}&}yb{3pK0dU0d&dP}h6;Blki`E8=L(_2prYSRk3|N## zgTWvS!XO9?bG~T8vSdVH<4}~*Lfk)xS;3Fx$SRX0saC5#7g9=hcD7`>kjPk)Wm;=X zHfKd=1tla6kDO&}Bw0hA=Q$9oHin$8N`?$!LAyMy|5M&Cg#970rZ?{rpjfcRK|>*D z7(pqd&QgIwc`D1Y^^J8zv}C#9M5K*&U(ZFVrE0Abr)idDCe7W?T#5pvIrRzlE|W5K z7tGewnH{DEo37RE;r!df!twntcdI}9ibK7PS9Q-g)H{HB!EOMhg3O3>?w~_K5Hy?3 zIF6kg!sIUty$#caGl+S9kflkt+w-LGl!*KB=Gw;T6US~|zq%23$!MJ>_dWK|7k>Wp z3m!uaRRM_xUjP6^iQQOVKXPaR5T5ZzmH z3w)2`Lao9WT7p5hyExMr^drka09JfIO;Zgzk3c|X2^a%lpi47Q=H=#hiL!wqb0{Ex z7#}z_9;a9dnbt}OhTu@W{WN{?rI((2?m2P&=B*1?t{gpj?3>R$|LGt7%%w}0e(j(A z^9LV(xZUk)lij>^BaQ}xZm-+z-gEE0fRJVBvtRq#y${^q-fE{wGB-DO;o=1kZG&60 zw7~t4bLjNrLBH>Lss>dlc}4(?354z-;~^hJdS>nbYb{(|T|a&AeH)vb%gf6QS*z6m zZO&bI>y6i5UYMCVcjfZc>sM!%4*uykp9k*Wkio56%f1(!JaNKTl37#Zu)Nl*_&zZ> zcJSbKyS+F!->ivtH}gFd?jVt~ilB?Z%F!b>7e9hAV2rGd(lq6`*53A&SF6=5@Sx&YV`kxkN@}OcW>9@k$C&gw5=hOK$(tbbrt7 zGSHNV)7e||5Sn7HrvbI@OlVPI?4lBHz>wYpODnSwHF;?6L=NLot+Ggiac|`v$d4W7 z>2mj=u-4|J&WH}Bh9geLJPM|yw$g5QDE+nM!75*;k=1u-q?vf=vHWK^4EX1q3(l?4 z02GG7!9xeGUB7OO0gZ%UGk_u!`*zr{H^Tu~K z^#{JM0oK;mS5{Yi->+1wdAhcL_|JcP5XYNa?H~vM=;+a-moHtqeC6`V(XEs5jx#?0RzSiQKGeFh(auPqu=}DzdL*8Od7|hjvqU5 zaG^Jd8=+ss$rMHh2Uy`H2v}~uM*sj*+ECm07#<115aov;f+9eF$OD>RwAL1hMIG6C?it8)i~s=UHjH7|(kN{Xj((liKy zBu!n&IB+MboIOYAESqUm8=)6>HlKd%p`ZA~(=O|?p^PI*aA$sNfh2GV*z5O$N_9IP z1b+CHZ+v5MVX0oJRsEnAgcT1ZKZXMryPAW48RP!hKL zJrXJfWS;!ycVE4=x}Iv<+UlG>bJke$0za%(-nw|<^>c4*tZ(`tA3A&Q6AwLfY-zC~ zn6OqbD>w!LA95uEBXFs&2p}6V?u|)9YpoO_vqo#9l(Ixgk|Lr>6Hh6Z{L1sZI7yQ< zt=FoCMn@-W!4e6996)QsO74T(+U$4RB5Y{|78#cbz#>ZJ4Whx?+8QD*EG|}kKO^Fg zeCjhRt7}0J%*@O@^6*2}TF&s;(IcEgqgIUuJ#Kgya$hN6gZMGGmR=+N8!>h9IQ{IDdWR z!li5Vdb8PR9zS+OF-TGqC^4L?VLpH&e0XdV&zA-Om=b5cMKIQCYqc?+RNCmx_SVYk z+GcyJ-RTbEB(=1>y0*5l8O2FzY=02NX~u+Ph#agEOnIJEN^s5?cc(Tkq}E0VA%xV{ z8g1OEA7O}oyFCobVJLH|hGAj>D*nAYn52Dwzq* z5;Rhgafs+G^`XE}?%;nY@^6nS4&BvcU1HH`t93YfxyFu!fF?BvC_O2a*i|kZy(fo=TE|Qi7~iQV7mDV}a)zqlt(iN+qRITnI-{!8sRNq-bl+rsGVRZ8gE#Ti37NbNVEZMzl)E)fE0ezy7cO z=&!2BJn+tQzL6nA`Fcuhs6ujF_vWz^B3jt9SRl zFaRrs-a8TlWDEc-qBh17C25kR2@okM1K(FlX=9DGo~MkZjjb(khJD5bbH?F3b8zm& z9%Ccf`vuCJ^Ye3@u{4f*-JYksR{yb-b93`VC_TT{XemFigjuEs{k|`S$&zNRTB`)jTD4WLfzccQ ztOX!rtj>%Xp2LBNGpJUi;FxM{tWipGU|E(1$`?{{CWMk)3go<>>eY59P0j4gY&8hl z8yod%wO;W9CA7(Tk6p5z@@qc0UqT$8mvK)yDRtDAOj2 zBBxuVSq1<~Ny(XF5cpmYgi3i1+>4wGDQopQW8C+BKM0U9hxq55n_YZ|Q+>LH?QueL zEy7`^wX;7FbJqjKrasp`>hHT9+K+}he$>8weWd*hR4AG0C&VI6xz`Rlf_F!tjuuP_ zfn4rqIi>}7*1_HGK0N?tCs+PB5!JNE7zMo*hG--}COC2qj54dW(S{6xtyC)r6!iza zZYLV_wN70E5Jc-Kg#fC~b2!M0O0X!)@A@cm+#)?zNj@-O{^}vCH?X9-Q;NDZm8N+ku&VA|=pLp>8GakTZ zY`*^WXS?0*_3PKa`Ss_w*4LF33-d=#pFXp;w#FFaoSnV*?A4ps=MNp|$I0sYR$@&U z)X1Rs@7Zw)}Rl;hwv)$R+Ja%wN zw;F)}nb>kw004jhNklb$*SpM^oMzwpvc$lY*r5AkZBvmskXqq zKr$w!)LM7Cy&&)s7ecBtj##PH8jVKaNtPv2N|(eN0g!I{|zp;jE6QyaEX~vkf zmhHJC-Zo}`!mu{2h5ZTCcN=Eo1s(IWOt>DDB8& zI(dD+oMYwHJCP4{YSNe?KWOQ`;Lv=+5M??cumF~E$597K)Z?57o~Q*LLpHRAQwMy#||C%+>d^$5lBi0&00+XAQ%LW z2n6*1XYapbCCkz~LF_yB+VBxCo=a~l%e(ICZgx*Q`Wem)Iour)yCVr&3X*``#X^vP zg&+=Ru>vGu7b8e3K)cu-vpbID49QutNe&g`r-+YX3IcP&XnG0$|v>iB$cJY%z2yC0N>?VEfcNx{X zYHzl4oNtfR{^@Z1yjwQAYiKl=pygp?CD8=EZWpagvg`}(2DI3px<*QrlPMqASHyKiV(k-(_UbRJK+plS_ z0KJB8SPYS8OX6xj{@uG4!~cYwggM)p;Ij1N#De?5{#Vjc>joV%7&yppZ-0KuCP0Bw zSty73+lEBJ-EO&B>nu0pFD>DZ_W7pnZ#)oX-{@&?A1)8Rd0{ls5m&mA`m zVvj?-E53PdUg)px2f(QQ*_nN$(N72OGl#i)?2crG*o2Moc^>>0JSA-w{E>~_>xOgQ zrca;L5L2;HyfseAM`#16EcsxD5#bMopNxVv5|G}VBrNs04BDK76}HiYYyGRC)|u-$ zgv2`F{F*n6$$^|?{~AJ<@qY@nUq&>3{)XbR#2p~Ee@TCk>nvBWUFL9J^#=Ll?v+d2 zc~x0j zGzMK^r`qMWapNu;wv1FWt!I9fpg7F8D!i7S#psKzpkiOP{;dJS%}e`Zh|`=k;z*5< zm<)t|+guz)qmlxnC0!pP$8?f)Xr(hl<$Y10()g|ZE1v;u8j9+ zAA~_qiD(&-yhs3{3$f-q+YXh^QM=^Lzg@kEo6es^?_?%G_x0Q4w@=Zl;^XYgb=DR@Mk;4ZG1zl zU4rz;jCek)Ayr%O(x^Q7Kx0OxUp$8dl2ga@Yy zJg&1h;8IzB97N56f4m&Ld_xeD@ti;C@?9|n2E4pcBcSR)rKHuSq>ZMC9dANQ*C{WM z2C;OneRBCS$_OGvgj3LgV0waMK8^0)Cif5=j-WbJ**y*zY(rtDAAfj+y}aRGya{>M z7S`LfZCCZ{ch+B*1u=u1;&VGHl|!#&AbOSbjdqotr#$$LDv%gtlvWu_P&|-kf{rtG z?K}^PYJ-ew(uzM^=g(@ju5PWf5_?V_17JmT{FghN?!h7qUj^GCDJ);3tqvdEtH;jI z=)HI5ZomH1gLt6NsqwT(E#rel^^_QMm*|s^DGJ*QNh<6B0tmW;aPCFp)DDfIXp!#N zZrD-7-C539`HviH3gXl>*jK8Ej=P<(f0(JoW-t4IfQG4{<(Q}WY8H)ewra3JA`PDN zw+FY&YKs2rJ|9l&p1$w~6o#(%hTW7)oUhg^PWh0~C~sUm4c*opn+0~`=3r>+n}Ws5 zfr*Kru)XR#O({ymO}j>ZmAi-3kNK^$s>PSCa>ewj$IDBO7Gf14Au%65hgrF{>_CO#f9Bd2SDhhO-&M(ps60ilN z%W4(Q&HpAA_9Kl7syw$;njKQRqLdB|a&&b5fxnK#`Ue84`tMKCsf&mS2LIJri&m7; z)J#ey0N{S;IpHd>AE^$9LN3vE4SNW39E#Aa;&W@GF=mn#P_{KQuY`XNQd1m$P0WM& z_?_NGz6K~$Kc=HWo22cBf<$yE8m5UqJ&FX8-uR!cS9ndjwq^LbRP7&;&~N7UL-f>Q zV351}&GFdKd}FgF>yD4on&xIx60LoTBQjyiIt&rgYVm12n!zf%^EEi0zE5lOs){yp zMs^f4IS8#Yu9k=CNRk(LRI~i^(VY4Eju=;)Z=C-??=t~a=VLT5+A9K(v;!hRKB}QN z-KO$HD3!KAh4gv2&Q|_C69p1FZM0Tf4-$}i!M0dwf-a51sZ9S(WX0EurXA=(0(Dvan^KyN+sZS1u>+I zSUc9zUY^0uPE}hEY4_rFzB(4QHFfh(wNIf^pELbtn&X~ub`qKqSBb_Jc1Mpx%A)EQ zE295n%`t?>X575z!`R|8!6P;heXM-hO3!(FGp1@8MI$`I@F}SbYDd#})ka-WCSa<1 zURbHhDWA4Dnif|UzKO+VKznU0^WpCESN$i>?-@O8+HWr;LT~TR!fuAXUS4wFtcG1L zc;3Ow58Iv8XO#9l+m4%TMB#l+-Nv57p6B<<^A;wo{NHQ%m(Mq~em%R5<*s`5s?gkW zQ->#paWuouP7;DAh1E^CF{g@(74@f$dwuxzVFO6r0hAS~g?fleJQP>G{T+7x^v<=^ zx_ZJb!+Y94=219c4GG|xe?|;`yjk>>EPKF`AIb7q+hs87`AoK~m=eMc@O0mjgU7P%lmevC>+d4N#%84~;xpY|ST`SDS#$c;-+W{r8VU7M_J$ zlK%5#?lkfAbYkM-lH;p+C>`to~1k9Wny3`RC9O_rVV9`qgf7kP}P zNZjR31Zt4ssjBbI_5^-`dehjb@a`GrAzGA@0;Wqb?9m`xvIC|T9E8=eG9_5ZQnrS_ zu0pcvQ|_0X697hK(a7dB3rM(;IKNSDa%wk-eiWfn`$aa)84+}KhDpQ}w4Wq|ArNc( zjdkTDr0`u2IO(vFHiyoPSK=g#!%xbf<9FruE6+90mFJ9wGRmgsU^0Cu?r7Ym9is)D zXt8e6$wHe<67tz}6HJWhR{z%~l~YVfz{1N$2OuU94;XBzcR88+Ij+OGt3&yebdu_s z{nab=0p{l9b-nAmhA`5Z(puC-XL1mX>hxPX)Kxf!hgbvd^!BK zdZQ%=+daI3BH*@0#IzTq@;Xs}QzskU{8k`PJw{qO|UJqdTVqlA7(mxfA!@U(H!q_!8S# z!otf7g){qh&i7gCfesH8B_FVq>%7ruYjRRH8z*o)>CB-e)Ra6cx|_Lk z4DcFZ7~QNN^FV0-is_nMcY>Ec7s^V<%Vdj`f}Bc>lhS=cJv`csxhQp_LTz4)gA+>M z5%v!~+@8pNDXL$4>mkqCGYztA^_?yGvyvkt(Ryf)g_`DU|Gkv=TqL7FFH82xh~;}@ zP&;_L6RjpzE~<0b-a{6Llgkf>0?o+laqrjiCq6wN{O94!OovXvSrR^0#FrQ-X$)Ri zp5*h5v30pvjjgFof+JQ&oRwS4wPJ}(!=406*mtsaD{0-JI~u8E5)n1HL-x$ayzM~>Hm#FypnGYLk6lMK?L zrQ|rM5d)VTu@7HJai^4YI#{-~7u37%-mz44@y&YuXuT8hi`JInn7vCaPzLt-S2IJx zku|F_$6wQLlQT04=}H%?i-V$z_oE`Bs7r$F7N`7eH~7Mbbd)twYY%iuZ%hf!$*#Hn zwQze%BZ`t|RS~8aenVcqxq&cbV5?DIIako`;$2Ts$l2Uho&L#yw}ufQd}Mg8wNB1P zB=PNKjm$}YNfW z{}0_cs5E-uO^4Tu!Jfal-sFrWDNaj`OUxpuk%X+FQW8CN5fN4aAS2H&MrKM-oJ
{1 zF;@&bn{!q@?G==eC?(MAL;y*?H8#nZQOR3!{wGix929~G2(7UYdTDG)p1&;V$0<1W zX?7>ZTEkVKqFCMJQ;h8eg9eC&*jn|Ap4jn)W$rM*yh!6X^>C z$ein0n3Sh9O4C7*_t};lRQE6#&U8m{=Dh*T$0>Idq(mfk-h=)J%4>?ovbg|c40K7P z%V*$Gc+NLuC5#5>-bNbt0ZY_D0w{VTJ&r_eX#B-R8Ex%^8`V9czHC$yDvcsl=)P8s z+*^ue@IEL$TzacfqXzT=KH}z(GCZ6LI85|xUzpijw4QBjZ5rjIMlY2!Wrbvwv%c&@ zYL^ZpqG|KJ67VHsz*Cnz!?&M_f>C6e?~EWM&S^5@0t_pcdrGAvpeOV=T`9`=7|mAG z7uJ^V!--R6nC^vcl0v_5RR2Qk&b-|HqOcOD{%OFYJl&~+HceU%8!l(Lp}#R5Q??3r z&4of%=S+>>!N`dL98*G!Mgc8YbV`WjnGu z^m}nQ^xv|d(dE7;{UE41$xd)Mj77!PQt@1gZ0Y1*M>TY#b+StaI7$Gr3`R6uNxKKm zYVPYP^(tJAH`!xKVD-J#j{dpBZi3Trb!G+ohHKrrsx6w}MJE=;x^!ezIwOxBqZGjG z@cjXu!}i)SMb?nVE^>dt!gDYK?{WWkDQ|t-x_AX?C{p%2y57djQY4ZSe)az~MM!Y&xtY4;7yhw?Uj54ShnsU(?h=r}AT;LC*lbw6l-`ofa-O_C4T zF^!P7IKvLP!dno|{e`n6i4+k1Av~^+cojL^pF1!)2={F3Br7I(6!C3z&2bQMCxl_IKTcUEe?p*ff<1d169V_xx=FkF=&JqD4gMzkoP&UVC7CZzOxY|B9BmzQoWW%X2*3 z56ZkQCucoXj{es9;|)wv1YR$Q|3#@?mKNQNW-)DO!lw(AW+!tY6-z+X%)*=|oxLZ| z&d`KqVjBt5ar8(MBZ#Bx3eZ}ZG~alz@jww3{!rUd4^g%Jx)4|MCsL-5%;1G4iyhM$ zC!wIiOEhXnV}Bh?^?nSTTg`To5m;hmi_|hkRUZO)vW_eNS#w#SQ3`Z&MbpZ!5{=+0 z6fP_IL4_Ml;?5?JoLP%M5iPTOfeZhNbv7SzwG)PRBywL=#xCA)%F%N;@Aw#X+7xbjy=~wFl z&54PLdzigMEBV5U_+M5+4k zu-mNtuC@I(AP)G6)J7L&W&#;t?c#PVBdMKbs;a@q7=6nyCUa)_1)Yn$CG)7x&WT5U?u7aS~5 zxiP!jcD~)YyKGAjbg z@{Lp3cp^7mvbcxqJs{)nJG)Zhb(H#h5?QHDOB}kbZ`1b1)4ljreudg)x0>$djXf`{ z5pm^t+a;lV`fs&l!`;)p!15I|e4Ir`68+FQ|0X5wkj)4{*VWiubCyvZyf$HGGjM`{ z&Gx(SMZb)u7zBnNoHXLiL@_;az5*Ii`E-4@jA-P^uy61W0v-b+jZQ)kg<_oc#IX}E zxV7cY#VeI3J82QWA^>k{mt&4`GluZyHAVVi%GmBNw3cv!2pMf)-DG49QmP+w4>$IN z|7HK4Xx1-FM~lp_&8_@;DnriUc}ja${${KUNoEdEC@!YhHP=^Z-o9jb9#SK*5wE~7z;gQp=^o@ZJ(_&Nk|MVkjZ3-NH-~Y7{T|&{O1QBPC-(p)EmBl zs+Pw;!qG?ZDbPNJhIAhg+Qd6G`2!v@UFOQDrLV6Kpw%+wvOmez0rtLVCg92HEr0=4 z@tsiVKgLD=XkcWqxo9SZG;^LPQ$l{7=r4TqJC}X=55;29qtr*+K0{Z?jAZfRG@Z!L zicS%}_4Zd@bg8u7cL;@VAvSRjmbkxKsQT?{;Im8K3)Miu|2QAO*LO{XM(tu1CAbt zNs4C0w{7?b-bexsf4K_w{sg| z%UO4=xeR|-KXw$jVamir@vr##@(Ilz-%$_j|F|{x0ykV(v$Z_Ar|0*rD zh>iKyy0i)t-QEw~1n*u0{TpUDOJy|T?tS&y?(bUJQoG$Q($U*~dwad&O-qcJ_+&%* zkaj$1<$n-*8M9FoxYFOZJsHH^a=xN3 zG5DOqkqCrRWtAAWbp!Y7D; zf~qEklinvPHTcpGJtwa`m)l=xdm(mTKO##+)5Spu`?rl@lDkE~tN#POFv$o)L&KlILCeV|W3cxKYO7YGVT7q-n%Ea(=ZpUsoS9{B#J; z%rTi>mMla4rHF!?kOXt2 zc55M;oTWA3DwFpkW;y?PB^Fxo9b7IWt#egHUVaZy>#_6tmt{i3k5{ z;wQ{-$G5G^U&iW$RebGLphu-zQ8ugvsGi-$3 z%(nkUSIWy@jerctG#IJgcEhJU=UM`;=KU8)AY`j^C!(vE+Ya)YChQ&)WOlDg3uZO@ z&1+S=5xSOihf_LexyHfCBS>PrJHt+*b`}FJf;Ple?Z^h6s79!l{XH{;`<^bm2GeWG z?W~E`L0EN+hEj!Pl6>kl+&_<;txU@#+cYgH?e`$?rl?ETA-Wsuu!i|u{1Uaw;q!gu zCuK{Orm6Fvh046FXvODP@3sEkXUQ*GeBMusGR5ysh2Bg>(2_Hf^`bP2k;aFsbMG{M*1nQtp(MSL{F|A@3|j^iYfuq?#v*AQ z7@ZBgGj*Qj6OT*L(*nGZB#!}(c0tbNQ#)4ms2T$y%oDEu`q2xB6wOD4rJug@mLnU) zZ;jc0cv*|z*W`IG_aHe8m+dH8m2tkCuSyutFLNxyhPci<)^-o>4ljbEX-O5{s4|3Zw_T7EzO-bo zM@c38b{TJ6>Pnr^E}h>wU2*yFcMp47&{^Ep0?Wr4q;MBy3|BKKfM zII@q7qXxVLycY#Qm8a`4w5d`}i?aOG;RhYE8V81_zx``gUE(iVS<&0yN3So>*3E7Y zMRFh;8+maM&L0<3?I+FnOn?T}mcWpUzd1c0@Q3(l8&jTRu2cPg1{^$6E zR>0LwEWiDAiMg<=JJ7M{W_Kf%Nv*|?&+yr@V$y~}VHQQF!swbNaB4>9e(v}YP*S6G|7W}GEI3LrU%E{+B`bb!{7hA%T& z{v)*PjoAT0DkdM8#jGRmRRIaB@!!s#mdB9F=mChI97r%_*J192^(knmwrQ`aO*2nG zxuHQN`6s=9a{pwg;lVw{tGTvZMiI2{>xDA+6@3>mCg<@$WTRtlQqWdWGKNFK`8feVc+AD{dMTmoW*c^lpTL zn0{sa4}8LQdKtHdcEdt3sLfrlRI2)aSMw&`7s%_LVa1J4qjR|sIG$gU`=IB&jWBWk zn1Mh(y#`niWe6%E{`tyHIBcgk`Z%A|go;*h>k_A(>l957m(m+ke*8p3{elez&2_X$ zB045qB&?sE2Pd6y(n`g@ulO-1I&;PsuJ(g?oM>rQs?V$sM(Y;ZHtmK@lxjq-5YV+H z6AN$#n4V|oUXKu)1b_2u5B*tk%})!KE8ch1Id>-nqc-wC8zpaYpQ%43{mQNPIOkIy z*Ial$@%!q{Wh0w>qw%+S?MI1pd6ix7ZZd%k#gjxIr$gD4q zo!xBE`nqdFbt9JK#|d}XagM#h@9iEl&-wQnzoDka7D5xAi{F}mo4+~B!Ot4jvOMN? zt{d)F)n-`#%JLS3N+jCrfg5x&)ARF_mQ=B&^Yd~gukgp$H0-x47J~Lp`+(cjb`S?f z7MNC=Ru?ITtXGCzJLg%=>SbCG-ot!-E9HUodLc1j@=4ZTWj~-ss=(zjXI6lCztgW>v@Dw+IO&ow=LXWz(ZY4=7GfZ1U)%0bid{u@X zB~)!dcvWI?HO4tdFm1AbRV=5mZF~eZV{T^Tyq0h7TF-}b8@0tKDIzH#;nHq&;k0tg zHXNrZ%6}`LB+aalza>utrQ+i`?>#n3!^PjsRNpnp-SaYdJ8%bn#=`=z%`L;R4T4Ki zQaJqX9L>o4-HXM6nAW6>%2MAwpTA_4tTP8d{0+kf^W5kN4j01`1Nu0B8b2WBF@$P@N{~`rKsrsyWpdu!M9a;4 zj38QC6MCLLVN9ZJBtQ!2x4TK9Fe{qHq*W_V=)|@vyLWnplHuhfP7^9v#fPopX*k~| zwT19EP4yIaqW0trzp*iDe|Hyzele8}^&T8E5JDp~ar|Y3=vVPTr4`a-?S^|A_=pnK z-^r#;F!8Cr+k$3zfS=ui0r0Q6>?+%&e>s0z1gGQUPFZpWx({aWfJpI$1KQWuxL6k& z?rgO{O-Xj+-En9CV6CgbnWuRle4j z6Ec_!L(ghN1Rr)3oSq%r=Bcd|CL{Hi6}y(B?VVWA9b|N}GBZ?~A09VV)occameukc zlJWVQ?fWzroOxJ*k1NA2o#zd0z~W!7qse&QRKe>LOW#yY@1B!tun;=lbQZ%ZUP7E_ z%JkNO&UT@8K|#(eJ^JN_^Dv9Xnp!rLh;_~NG29buS2E|aVEw{sc6;}$)hP~!v3zx| zEh17mlWmEe`8WalK>&}jjW!x`1km=F0#_8I*|hSHG+DmuDY8*V@x11YrCn(rHSZQe z1DM>!x7E*s9xX+9UEfM96YV}Cv!jgugCevXw>+9-{QoMD)iGcoSTX;#Tp`?hkae|= z)8cU-sO0;9zhRpWUHpg-9KY;n0RW+FPQL6ofuBN30rp#GSbXr|Dpp1?^KEGf_diTQ z!SK0A&+!-e*D*U}Q}?M!Mi2Zrduv6>A4%xNnmYeVNEoqI2cVbq@`0Tpiw9KqG|Y!5 z-M*XTV9xdjGBWo3et2uY_yGW*J6Mb!a54iIr}u(i-#qB+ph`Gcgw6kUmD*}*dm8@u zWjds_GxfBwLK>v&hB}%`)ju5<)i&5DmgURD5J`dj$Hn>&q}1*tNHin999(yD-yOj{TQRai^0{*&p{F~GH1q;>7%q@o6DKU^VUhlV;(6wRQtugtIsthE zIzDQ_M|jK~rHhwhRoA|gajYM%r3(TPE05_QF)1#?Zp2YYqt3@^{7@jA(rwRMqn=Kk z_4PgEe~H>s3?5F)^OaMc)$UH}S8)s5f6+E39rXH)4D5LEgq28K?YwTarw81jOY*OZ zJf-qbYNQN6lhvGO2re{OmM6eglYrQ?)WAt+91yW9;MDgs{K0oby52` zV}x5YctGxJga3@Xqi7a>IPs3qHnd87ZfSC_dDhBm%{!oE+6NX3(5NR?f8EFOs6Lx! zcaj$3{UH8NK9n%pG8}uFs99l~;@L1`Wz~E>DgV`f#x-ql=piu!YP7{iQ}8r>4k>x3 z+?!9xUb?5jE~}nqa8BC2U@OUy7(OcdtZy?IHidJ6BRk0smt)Tn?Hvg78aW${^>I$L zN!6z8{THE+Q9BMp8?jSEHrc49Tkw9nb_o5{qc5){-7?{ofdH3-NwJ3rhd$5D8KT#WK z{w4RB4;V#Q&G?OePk%`DL|^SR$FgQU{H8)8#CT`7n`WWGV)E6v5Pneag4wv3H}ouN zq@~iy+sRwA@AX&CD4X!kDJCNfljZR4R6A)Lx=t**nG3EvZuPH9DE>0$}j$etK^h`5^HEzRv8tGmBNcQ`-i ze?jecq!~En*Hhj{>lnDr&3eNZ9T3K&i+iU{tr-&&J?Ng3jX`qAhTGck`R1D$*=J{kN$|0>AFr^g zLw`E|7_AoQRm;ETAdP@RM0ve(U-Lf0fSmJ>P0I7VAr;V^rBRjwGiI8smVGONM`>yv z>U151guEPF#(9QGbm3i(J;~Lf8URoVzFA*sbS@OTAJ4uwpJ+WExb{4+%+7q9tswUu z0;izyQjh-1TD>DP{uYN*2kN2XFZl)qgzrZ$YnC$o&+uzY~_@Ft7aa0d$e2(#AF z{vK`1K?lT6j`rG%42;{#&g}UlthwcvMRkTtSz}D2z5q-&G&Nr~iRS4YZAf});;pEI zjXMwr9>Y;%4p)o}x)iKeYr_8QHOF9MPA$O$gMy>3J)J4)?&22yHy~8->s(eegz>@P`=c1g-iMFd_k*S4Xc&KadeQyUuom9K}=o^3d zJWbc@07G^MGVf&fdO7vV$b%ANyrnat=<-hn%hGnNf7p)Atw;viZb_akQBu^pIkaw; zv*oz&TwYEtcOXEs;;%CL$$LhBj%sMw$@b|$*s!OkCo}uN&iUm2Uj1$R-M^yXb##_t zp-O?bofe&djI!*1117ou>Fh(d`oD#dA zzPx$EK9%t>)wqi)1^VGT{fBob`mXRbNy_|jkK<)-g5fmEoO|&|XPkI}i#Ow`2ALm!OJ$Sk2r6=^!O!66KGHF8*>xOQ= z|BNsyw3_iAvPK!X(htk)A5N4^mXf4WA|}(Se|E-90z$C8)2G& z1cgDAmw5fdNPRe$ruV}l0;p|3OC1mwNfHkT5*d#T2uODES(gEnFmRT@-p0{ox;hSj zGZ=ingI$N!zPnM`wK&UCY@Z1ZocABQ^IBgtEsA!^x0|OJRp#o3q=Nwm>qOb9 zbb9QM{`96-?MUI^0!4%_A0QRMIeGdorTQKe9^2C4;LkyJzPN)pU{|5-Aj%3c&P z_k~^iy|Ho7QCsuCLTvZEAv0%eC*)<3&&savp5EEs;vlfN7wGmjK8l>*>SN|pvHpyZ ztnJ++eP&MWnLR`7QdWZM+Gh)@!6M6Sxac-Gbi2=CNcr{+)?AdCTq0zp=WNigeTtVj zwlt!)kKzTS1S(1n!I~yo`hpGa@byO6DxR!9zrXdYoS1=qhuy5&y8Ut)yM|^+R=dTo zh&09XzodYoU@UzfS0{5RN@aJF-#-mG!>duxud#XZm8XpZ1qF>UJ-?o+T=mUzfA;tq zTLXE>LuYNoq1~J3*}l`H%B8v`Mw^itX`%b9=t^_lFr(#@ayw{bPxJn zy18zS#A}Pfmd7tqPt0d%>NN#`ujseLBBhHdSpfQKhUzNYfU&e*11^_bjoNU=cisPF z^-&-6u&|0uxQjc+QYfp>n8Q(6f7F~k#*{*vtNC@6MWyJFynb7|vRc^k+{Fn#dsM#% zRwb!#|D}xf9|}MsYYE2yQfl+h9vzRaE{7{}P{+_#?GUPGItIMEkEcG6Fe7VtK*V;u zdSm>C(d1^1sL7;jc@w_Kt`@Lu9O#sxq0n>-&(swmIbFoSSp?=U7w=SQlNB2ANS{W9CDZS>6cPd^Nh5ucix0XUZsc>*l=*L4ve8^= zm6#cAYO$1NJjfXNHPef$X<^bZ0kPj$Xxit}4SGaT=VwL3Xmr9a5w7)xNt95MhcLY3 zQF(B(5+KKb{AVcX84MNe{eZ<^NFFfbMmr~s)j0#33YQ1p;QDP54{SBa>Icj-MLNgU~#ApG3u^ldl) zbKv(Q7^FhZR47B3B>GQNvw|?;mHrTx!{&};G9X54ez*@>fp{=}sMvDHZv`@+PKrxp z9eh5o%2$1kFGw%eMI_q8cA5l?gffVw1fPn2gKdi@>U1{-?j83~e4j}SIxh@7*3)*) zeQ7m2i-z{FC{2MvwkYrh+->Z79K)QKWkFKy@D|PGjfOeMI(Hvj2$Z~{FgI~ppDa#&b0dFAUqJU`VMIx$wvA9!FOqGG7X0e;|hQw zEBC2l&S+vIUa!`IZGF_SvcN3Qbu7mF_84Yn`?M&bUsd^~UmC=C3XXj>?m74{7eN*A zR%&wAz0Uq8IIozHmKI1DDd6C;{&G5T6(n7g(h!V3zlBBlit*Bj5c5lzz8uW2s-8Ep|M@Po5= z;7>+#QJ|2hB_05w_)NH5najE)uuvZD;EfMl$7PE?Yn*IZ`Y-mwrN+|##FA$F^9if6 z`0`CS0ZHypTT$T04opZ#>9INombX@lK_8Gt*;V3K8C%q)sdCy@zZ9~dgfrfq&N3q5 zTTSktHMMlhOmfQ_YgFnLT7Fz6Wr`bom zipuj^K`tG3Rd|`5ZGKV2y z{&usVVbL3X_~9i_aF+2)lA?zqC2~${gBZ8Qzu#ArFQEBq0n)VZ7hSy~kv8U^{$C1V#Ub40#b|iH~1vVjI7i`=W~k^m6%K#5RzKLV@1mDJz#js-_qBzBG9^ zu)IBTK_UN(HMZaTGTWQ>4My4Bp#!fKO-wV#pQJ*LvXGVj?D1U6PL{mKaSxgB^yE(% z0pyHcY8rhp6YGBu?~SF^+e<%vE;NAKs%mesBT3 zS0%ISJF?k<7;#b5e=_^1hK^^B-Yz`nh|~i(q-OP>7~MVM_1OrbG{~j`rFg!Q($vR@ zhe-NGU;P-PO5|uhSULoj(na~6N|1n4@O#g6ym;h8Tgunem<6800>t#Rn#UifMX55x_F;x_Mk4I8XI7~hKC5)9eagOg=~riZ4<6iG=VGo_BTAdo z<5&5-Vn~V?IZ;qx?e9FR7IyphI5<=JYfbA5&p~F93FEXXclU!`zk8*iXMG&2G>UAA zAiPUy=%j3BUz2?Cw0XXY4}B0|k-O^`h+iSHC4PGyab$<0)ESYC7nu*ueXxfgduHXQ zYL`a5!<>1vF7UwEc;-VF&!eD?cs%$SDMX0Zu?-@F9FFtQ5A|jmG0(I5Rc?V-xhG2D zSTIx!g!n`%Z5|Xap(HMv(W21#p5zP*JVy)gK7(mxBrJnwfx6lVjk@TPwQ&w^A>2+j z?v9;DOL<5BnGNv+z=AP32TS&)SH$xThiY z+wB~`|0h%|;(x1g`e?oCxMVzo$-D%Sc{j%lKBPFsJD5DL&0T zXykBvAkUSf;G>x^x>g4(;z*xJ-loRSB7r6bkcfjeo?>Mf~RPCngWCwm8pXNWSG|}i(Vf_TVMf29HK`SOj zbFR&|n}SI5r$@E_{@iqEI~;jWn-3j4<*%M?AkzigVhe8}evCIX2>nOOkCSwWD8|Pn zY@s>|7DryPuosj(j2X7E&c+{@AbVMsSD&jqzFL*9uNMYy_nxc$JH!oGJtE8}vz;TX zA*KV-XRm25FUUVsVqlX5R1_93I_c`AxC5lhpW5$tsxXbR$>VsBteVD0tt9s zQW5)?ZBj0u9rO88z=qn!?-TJNmuD7uErd@{&S*D?i&_ULsn(t%G`}#PI2MhdCPtYG z>$CEhr;9kkF#^uS>aN`^&M1(BkmH)Yv7!f~Rw@4o5JmO?OepML27iYBK_4X<@t%RF zF}5>x=(~*(`Q|9T?1$bxuDwv1PiMq!eltPn17eCe7~Mh2;Ou!n5FBt{9cMQDIYgc_W7gNyOi=A zKwyiKR%Lsn$z_?KXe(ZKqkPqgj66!#6PMv2Sdtv(1|-`Q01* zTVRL4FJ9~-=mCVT?-fcJ!x`uUL#O>gX)+1FejyTNP7tQ$&W5650~7Iub-zCc!Q|NS zlQLEV@ln!Q5d}9 z-1g6`FZ4^m`6R=J;q`Tvs{h5@*2~`ol^GnpllvIPc#_3)(c)Tdup#RIC_2w@HvcvZ z2eJ3~TUC4S)!MTtu|ti}+Pn6yy=v2@L8(n@RHzZNw%Vh1?M>}XQM}KaPmY5RIgZ5d zd7k^euJdG{FT}Pcqut`1RAGAo;n&Nj;^q(^GOQ-^QpRa%X_C3f2R3G1(A8YI>PGZC zV@#aLO!h&wsJ_wMz`e7WwWHDCroT5C^7?)~LLqBn8Kb!f9HDH<8!?O9b=|PFTHRdJ zcmD{E@Lgd!))Zm~@s5!3 zfIh;dBeAVas-|`L1^+_RyYgZDQxN1YUs_C)ZfW^3DpxM zf~QTRfru8n(_m9J5vkY)3F~}zRp1FaPebQZtF2w`bUu~0C!I2n-6v~#D1_Sv;mJ%D zp*I)~Ri@ivg}{IO*5Do~A}H#yFWVTjZW^W=Nve+4gAkFqCMo4-i>P6McxplOzvsXc_eAHn&$5GI6$X{T18w{lBi7v|%lii3`!gg946dJQwUYopmFl+zUupD~5 z1mH8S0n$^(X!hWpRW>W8!-pOivh0}Py%uzan+DE)#c)K%2_nellEM-W=e)q|G(mht z=?EokJaF$4e^RDJnD-(1lhtyJhU|BPi#%`EZwMW9TA<-jA^GbAE`X}}ldnWF23CC* zUy}FttR&a0B4Z`semX$>@Ac!1#ga2xH&4E`sWnE*gBrwxJ;+UoAcRPn4DlC8KG10@ zV|cK<%c<1)^sY(Vm{-I`FjxBWTiA}m1^3Jg3)&5_`Ve!un$+=T^Q z3)x45ymt@7UC@sBSP%Qk`l*Up&HvLG8Y72izvwDF{H2kdhqHu~F3&|>K_CL?kR*SG@eR8$$E>MB41A4oS(78JFwX4iL|m+oAJzFVh*~L15AEowtJdFmf#uJy zzcMS?3?w@R~P?Mk#-ZE(aMoz`g(Bv;mYCKRA0_eLE-4I z@xQ%l@4nQauq(Uq)1u=?{`o(`n171okM~cC0t@l3kIy6Sr0gG4-@!>wjaW3&n5gi) z>ldDW`Fg45Es@ah4r}bZ?KUT){ciLw`dr;^ipSBWem?5B{l?9CV5jZhq!p^|Q{fAZ zAn&^+iDg;;y{WT*|GLcMF`2H!I-7RJ-Gm4<89^p`8d)B_71ap+fh9ERGG?2?JG(0M z@VaWbk)v2fqWxqj?7nLDbwOc2Tfkb+!~im|-Go)SKIq=K?d}j-=HpdBcMHd&4R2!I zA&Yz_v+%^?cCo~`q2Ac|=)NmM;cosiP2p~)0di?Sx>bxIALQOp~Dg3L6F(8>=uvHiJMx&FJ|}rkaY7$ zTRl9{QhaC1@4VO$q!0!1JhNUG{#1xO4K;s9*actM-RK~sW#QHT6@GrwOMIycSCbaE zn_NNykK65k9mcX@0c#nd+woj^d&D?tG*#K(0s)RouFELE`vXqFAJ-3eLqlBAAGk)d zTkC7CfXLk6O5l1neR$07#ml7 z?*z9qMHYu4uh{a2bNcj;QHXbikHZ$W1gE>&OI3$Jlfz+UH+Blz_eD+c#jbx*?YL;6wis zAFkJ-*6=9wxJsJ7vqPA2H%zJfZ{6Zflwwc{8%$tm2b)VGJd$C-#KZ*^Vq}eQ5PO^h zb;Qe&-`0A(*P`h0Wt7mUhT8tL7fOE`93F}B9o+Wsrx5kfmYT*krIihcu7}<+eRxc0 zd0|e+}x3G_|3oNOe#K9is*>bNX{Qli`M&&Hy;Vn zFCqp9KEw|}L6|)_ell3IzF6TImFC6mC$%(!Z%V1YeT4kyNFlk@5#h7x{dU-RY$R-b zDDNJO`};`s&47>q|7kwi?L&)u`{n3@d*~zTTGFxz=5*+n7kuFLrwJODvmD3#e9)>m z$+}$O&woSHxoD=)6DzXlaYsDGT%K1Hgbd958B!hJ+<)AojNf>+uFi?=R6x0CXuc4h zI||1ay+f7Pskt!lc)e0WrBPw7ZE$ZJ-z}dNMr4Vt3VNNh!{Z`Sm;%B5h5)XKw;q!NjE{K{OO6~S zO;A>6Y1P`jOm;>2GW4~+8S{M&+4Yc2T0a2DpBh;t>!l0(#IbD1I>bhBw5sf2{KL43 zRoL+Hy^zytaO2gV9?BA&gF9%}WO0utRH^T-a)s-NaXB>a!_|w!9jmQ$l8YB)5GD1b z0d#~ohuL8|lL;xZVBdm4;c2!;Y;L;gw>l#xSt?c`cTj8$&}$ zx(7t~dJIz~GhxzDdNlqW%cHcK{zVy$e5UErysPmybWCqHh9o)|69Z?E6GY$1;c>Y< z!}K^{d|ct~D_XO3IQ#9{m@nQn1r~gQ)NOHjaXy~%a%#gk{Yk_LruYnqDD8fu>fsBd z^=c9*v$g-tdt9AKHnaG*PUAdX4yh$#t{KK)289rYUF@v$JLc?~7SGJwI`r(AkJ-<)CY4KPA17DlmfG5FcVdZd9Du49Psns#!Zuvlik~( zdL~R}9_>Or47wP8%~^@rh{%boCe~-tjCKH-_^Bd;&)pI#Cz8!Q*keEJ;ZT9Tw`hUS zKhrk!k5gJstJl`ytOcKX$&bbWf3Dkkrbm3-zw0#ez)5@AUL5&<9;B|^xi}3RlN%&K z^l<9_Z`9@ZhlP_kKp#4?MA*{bcU>{FrhstbYvM&F{^L>nmZy^WaPA(wF+Tz*YWGXR z_DbAV+NS51%Zvsy?=c|(5>~tWUmDcSgla;B_dKLZ zfmWnXmxyeQ=)bqF2LUNWtxyvl$F+8U|Du|@%S+>x=dh)@y$dm|PXP}XW$-c4@N0KB zqPvjxiND{3?t9XP91O4{_C=#Z!~Wdn+G=5K7TzT3ffF5hMiL1(+Y&pAEcWpIZhlow z715HFU=3Qy9qlTV{8j~hSA^EVp_rBkUmiO=&R5_M8kyY%#F4D|82lKC;neI{@}?3L zF61b5I$<9OD2&BiyS;t9X?QbAMEx!8Hz$Hp&9QRE1+_)lY9ShrkUElJ(v;)~60``? zQ~S&uL8m4AiW?an`J7i`$P(eH=3s;$6qg`UM+>STmJ^EKs3tc{_Z)rNM@Iv^(fii( z>3H;W4a(VTuVs%m&fLG>b%ygxu6<=y<^0scej_$K7g8rzb1F+8o;tmJ<6imn+~Za1 z2Id|(IQP+;;@QCOhXXS10UgJayXl->`oFb*_D{b#9IhSWshBMmZ8Ax>cHf!F*!MC1 zc?78k+;*Bo-`_3p4ElSSXFo_Oxg;+w1X3fwAa>)1OvXf3ylBY;uSVB$F|2gR*JMuy zW4r-8-3@;FUL#ZE=7No%Ih8w-4nnzXBw;&ycPh{|f~a@iHuu8=l}q|1!0o-2z|P`%&f;^OZ5xxi~b{M+`khVKp{-7XE@MXe2^wq5~LHH}AXn^C9z@ zP2F8`ich)n0{1dPcWEr{R)Gp|twL+a_0i-Q@XSdl6ud99^2W^UMNg2w@k49-O`?$e z-9hi*l9_Q8PRcoyD8Qic^HMOtqR9>g#!_Z&^K(et$=R71g5ryMM`)Wv{-aq`I>t{&a zu(O}Z(`i+YyT)=nZvq~gKG6s+?-I2=oL$ovHMlP$vb`awaVH8Oh5V>hrl-FCXJO^9 zS{A#vce2GznuSwUrL6Zmr?NMSpr~*#MH-z=-Lu?d5$0ZA5E;VEB}t^xqrW>Jens41 zYaI;^-z3MEVUS(MdOMIbFi<8vA{)EI@R}2wSDSWZ@`phME~W!R-m|BeDJ~{bK?_j zcDERpuE>YER|lbMMY3O0zA*s%oFP19k{H7mPjVpZljWIiZ~9fVSE@ke$qVjrwdDOa z#a}R$FB?fE%>Aczm&`GHdS{*%iaF`I9hf?NyM0u44n1|=hId-j{GwiTYDz zn-!@f0l}1q%xd}wy4tbeB+14dwr3?b{kS)s|BMEbu;<9{6dZRz>T!J+wa5Bd@>pQcV-RI$uV)`(yH<4%yi z57px*S=YB8wiJidR_O5)zb_)(5t_j&Gxa#XS~4oR8_BS663hu$LyqAoEFSeP{SH0f zGH$yZ{3gmRsZ?$5ZjVDO%$qGafM?fcnK<1AErMWchI8Nn-}z)n)7W&d1; z(1-F;BL=w@%M9I)k3#QTgu>3zvux3~>s~@SRZC4lF21eO5~*7JdD3@l$!7omKO3rQ zZIhv0eq$DPkm;~9hz%a(0fme9!iKo9mHG44#1ZT>+{}@89oZ69p?|9$R&}>^6fU2% z-^IGOh54eUNt}thIj$3pnvrUgUK-|r-REUlmYE48`DqfXV9(!(B5`gihOtDrAq&pW z^~*03ZdDaOE=OhdpL{WIZaA(C-A^-~g)JRfP90tiPV;Wa4p0c4M3C+FE8Lwcn6)(Q zNqYS{RxMhyxSz`#Rx9$>^q#VAn7x)Wej@gVbTEe120^YCk^d}PgoFsAlht9ppfARh z_JN4`alAtBm=wbL@=*30%`+t3SfTOZa2E|%sDrILQvpIcGc>+=a|J=iDgVGc(m9Tf`-KI!kO%-3qwapP>Y5Y&;DE;cT0bNuOpDf@mwtwt>Zav9!kzqE|_r3R#DA21;|NipZcD9NmoSOnb2 zrDV>L-e#Sf_df`P2l81YUAUJPSNRMPAg?_}^TA-5Ez{AGzNnVpCJ9?f5wFMdZPFUt zr4Bd|g806v?ME{86!m*%i))a5^psanXm4v;i@_+M;vNwF8LloUwd44fqEFf&cPC8~ z$yJ#hvcL2Mc$JK1SI#&yy=iG~ZEgMDSc?9cc^sCNTZBl7$*aqa^QW{<*8IpkLw^ZD z16yLVmKMkpW<#Fj4J8}W0j=K5n>*rLQm?$!u+R7`Q#$Hf2BFd{eU<%(B3u{Wt7b*s zu7^nd3ZV;YmdN~K)vgo0V;}e3hIo0m*@KBRP3w;dZpLSW!I?JfKkT%+@4^=${p-UD z4y@csPAi)oo(=|!cy}o>mw_WUvVQNAWilJJ)0?FJ`^Ab8$*v%1^7#+3uF1=$%8r1V z*l0@Uq-ixa49)=gpW@*e-~Slmu+Jgzc541JMs z7Zea^$}K@9uYVRHN!qG!Q{>K=D7wlByR97>*~2xil6&m2VGCb*0Ay@I?m74l2wqDD z{1McX^QsT}Ssc3oRO~@U`;$B*nY0beu*h)m2hnWX{j2xdz%KJ+3J30?$!DL!SW;na zKM=^HcbwiOY5F~d$I}urY6!`rOxXEO7Gt8C#<;&W{5JQKEzc(?#$5c%HkwWJ@8chr z4+?iQ?XUQa__plfeiP^8YgN7E){@KjdhYPr z`SRAyzX2-9p>LaZ7Oj4Zl~POvmL8GZd9Pfu!iJ#z_AS|&ikK%#JSFr@(_%B6Pr_{q z^79K*@X4gb!x@eIB`dZEzi^%KiwO4E<)?oe#k@tu_E&;9@mJZv9CCm@%EX45L45tLpPm967i0kaR$xXD{JPNRGAu;Q%(?LnUlv#%1KzUcR7xi=4mU1A3Fx@fCxAn1`TTm2S&`ZPoA`2lH#2q7UM&?|3!Lz7H* zb@$VYC&6ac(+95KiGrY^RH)+wSW|#?AWt%JxsPX?=k{g|SA6il>V<-ans-$ul^6w0 zj?`Vt`J{N#+9-6Aw_s0hl03(_rKL}q;RV^+^6f2mLX`Eu=-x!|DKrS{9g`u_9T>aH7e(I5n~1lye_zTAg+da-@Vmvf6m;PN70p zEVN&6q~z>Ge3!GiX0va!Q5<9Y1AmSoO5D3AF|6;G{k52a-N`y)Z66FDKg zU>6^>xmx6NT|MD0_LakHg##8Jt#Z1or?)N*s_J4_EuiFsCgBg(^Ms6kf`HGp()KcdRJNJ*=mwTbBE||&1PfZP>7;n-$6SKyE%KA!a zJ_^h8T($F*HIj6|EQHy8Dph`r&F)@m=VqRs+?)Fa2?YaJC0Pj2KsM%i#hd1~{KE?<%whrl$If7k_6=?s)2!F_iy*^vyPIyc0{k?!q$%*nMfjV+kXf!8uH)cmC*Q7A}{$}=3cK295 z=;lmpO!gHjoudTkKRC}by=n9r*nwktfPdjIPWa#GqnS#=o2z`pHBx9%@tfd|k15@D zS$k_9Q!f4lz_R|unCnzIV*K#%sjJqXAT>TPGZnY6Or{;B;s6~?v(u~prI#j%2bRN2 z@JGWcS!aWs>K}i+u`$lBhxngs8X9`4%a5u!TK)mKy`*F+>q+i&+{stPW zL!U`WJK&yK&^~j|_Z@6!oduycDCrPQUk7nPCEH?_yrc5jYsreb2(Munz(9~`#yx*d zNAe0@jD9cFp~no0V92N@3jeUGu`^eas}`=$Fe1TAWGTt;oBgA5wp`ON;3dH!lU{Th z_0%C}PE?b{V+T^i1!7wEH;j{W;`BrK9q+zA!vH0!mCv%)@ZHtjLW%$U%IeFz4- zdRng&&(o5bgT@R{=t=C(nlho(hX`2`lvs#ps@dLsY0o|BuB=w?OzKZD`ADvJ3KC!D z+H>Ma7`wxATAM?DOy3&=tIC@{hkd7xq&@7tS4kXS$;rvjt@Rk6c?%^2RrHbV-rin7 zVNuI}9%2DpB1Ru&?$67fM2pyOEd#$%D>Ek{NJCPVSOgxT^s~Qao?+s8e~$U7f$y`o z6VM}&6WLF)^mrF?jN8_BH{9%{z>V^4OGUt;yroa#Cfgs~A2tu-w;oq%9^~eH_HBWu7xCN5 z=RM{Tpy2DvhLyXA{V~~_9ztEY`-d;?Y0yCRG;!n4*n{ zm~+b#BMHu_TgjgrhTWfpB^`>0xk%kwA_jcR2+_udagA5@6~tY?oI!?Z!a$O&B-#UH zqm^E4waONm&#rACsDjoL4xg=j-HP@~{cD#E=ex=;Q^z-PsZl9F6S=aS(5FFLSHBP3 zhR`~Udwk%)$5e8`EBe$lMRhH{(Rw00Hr6fYZlJi|zI4cD%yP$0CGU0@AUnRReA03C zav&@QcW>w9%9LXKEvad`KBT1DZ@976&)OMx3#hK@XJcEJ&5?dIyolh{5V$J z%!!IW6GU%&<|e&~722`Cv~&l}x(A<%<=p^ASstG0k}<*OSt@24H>n9<9$x@>ZL;~s zV&yC1WU6qz-roB2Xf`sNw+)kK7G~GxC3B^k1HS3bNIcLEKYenS^5=HEBq)T38CKT= z`$h0dZ5&Sxn~jR!stt;l*tQ>31LZgEdDEW3lLlyg z%;WHhtl_TRTx|I1 z0kAAZ_UE(h$V9100s$)`uWzpgX&nHen7&=+P@_;zXc#E{@~#^Q-&vO_^HjJWkQ7CG z9e0yfRaR6iw|R4EP!##r>T`hLrwm_+sgY#SWJttnl1Q#iPD4E~koiH!kq}hC@wV%D z>64#*G^{Ae2>Km{{!#Z`*tkk2$s?TINS)T^tuO<6-W7@7Z!$DN=Uc$=jJf5xe}a-`m(ni}G)r(CV-I*gM=+ta6jSOzPoVr7cqn7gROG z>=pli8$+lxjyCTSAx(n%<`+P51)* z5-B?>m7nl(%K826#aX1zhK`F_$!Ty=FaA9LxTm2<&XB{HxwQA~;sE7{b4=k{dOAZd z`HNJ|(br0%*l?v)4ePb|KE`i2B-OT7mFon~;>|ioUFhpp*^0d3m%%h*k4p`^efBXB zVF$tPWpD8mlnkAbX;ohW}ToCsL;)VS23D3}kk1&0R$00q73g5G&4Zv)>)YdTX)(}Gm zaTz|_A4g5eQAWtWD@sR z=}zj$IpR`AfT_9iiK@O}f3C5~`KCwfn}!*HAF(-D)OKtD@s8>$duFw4#+X^i{&jFz zfWKtkaL*fMqzUmandYS?m=uan(GCdLgA-Og^;BRwd)V0#3sSv_-->wbzdz@S7D+D& zOBR{O6yC#rlU45GZ)}E7Wu6Zz85O#IM9aC6jQAA3ILaEh(uIg9>>;RkhYV3p1};@IUhqg$ zZ|_V!TFtI(!oIN65ue`TEOJLs{0Wy%c4^uVC;SUw)YiT-$D#ILA`qQTXO@V;WwyjF zF{Rer&65vQW;;_7hfEk|@^rdU%R~iSJ02!72;^m2Z+5(nvx= z^HLg*B`O>=wSRf#_JrtV&&|)Rmg{<%78JCg6y4@|39Hr%*e)yS{#8O%Z-zBE=ONzw zZod**ZjQQm8UJ7I5>|#Tjd1BJqpBQPZ)IyEdrLs?X)RJ9n) z2&FhfpGqio;vU;VI~HEHsQ&wmu^YR@$@RQt{!4_9`~>2d&53lY`(54&qu|!^tp4R{ z?v1q%0cRJ!iU_H4<^DGQXYPc$nWFLj>yXi=oxnrCpy8({_p)5Fe8b8>Uy3GSOKUgB zufgcsve^m(s^$sfPan?;(VU}Wm5~Zney;sot6;PbJ@@STqU+e({b}Dg(DF)y-k_Na zS@0B}FSO+Pv=sf-ZF_jS;wfa&_CxkKY_B%Vu4MAHY~bE@PK*C>B|V`AoYfls)m)SX zT+~yDqzdjkMF!lS_GQpt%1F2`Kb%B0!48L;CgJDs9dW@N|JQT;Ktx92ldb93i3NW* zh3iG{tqx7}TC`esfn^;nj%i_yA&qjMZ35XZ-nA}Nx-z&w>5z0C!V^bo z6sI8yr8@k0s>d{kuPv_?K)CU-adKbH6F><l+zD(}NN9 zAW(K>eLmt%dxH@_HSZRj?e|3mEeMO)(f~ya^2sS zt3TP2Izlx2gar)!H3mm0W+5v#%K0aqu6ok?#sp^7@QGr_x3@W2y+(tga-TP)Tk$sS zHz}3Zuxm>?G%12JWVH?QZ5ni#KW*irNobt1Hz!?@h9sU^HHLVee}8gZs7k?ZvV8=mo)Xg+#aFijMBCv zk{uMFjx65zTagO+n6T=@*}$a=2F-u|muFDukgJlpT#qF?wd+ZGTRh=e4{Ru8()Yp2 zUUmOe&K;A6-~Xr#hV3&FW|cS18e8OzjuHW zQUHz5+Z)akRc1X;{V#vq5y6{A=`dC&y%h8X@M0WtL%4-kPCu`rlw=@k(~wM)M3|kv zAy0JsKZ(a)|F$dN3^5XQ@)u)3NIxtN~Df+rQam{Pi)}g%Xb)#8;(>sO66KW$T)Im-~n(EG~h(1 z52ZoNM3dGVmP4vmjwR^P&_7-T%6Nj&R0!`eZ@H+MT$z?h=h(I&=Ro`js>Dj$lT6(< z$Bj}393p0e|94Kez>S;9??!xqO2%)_5kW-@b8OZ==(Zn|W(I7th_mMBP= z@YFn6xz}$hgV@-lo|*{jGT(ZR#d|W zFz-2E2OLYI*|@0Q6ekgkawB_LS(PBf;ng!B_0Esb9HbANDR-a}3sf-iqA-GNl_6dq zLQL`VwrJt{xhN7*-T!n`neu(y`wt>y{uP4Z2*uIh_IHQ3dwT>*3?#R_L(NN!JHyU7 zJ!LzATh7y@1m1*%bc!Vkv?;8EbHfIfT&bc`Zt#bb)uJM5ahtP)RLja68l0$G44Rz2 zDL50J(D{qjUab3_S7VtldaEQ6HO4gCZO>eA8xyyySNnH!ZemmpH~NqRdL=6bI<+e7 zh$!4IYW;@CF2U~r1qr*(Njz}*%P=lp?9phHI{ndA$g9PG^tbZ+6N8x;Jd*V5HbAK+0^WXNi`@&}wYsK**5% z$EpuenOUO((KsB}877hBJ; zQl7O5L948z5z)jxZ534c)18}7ArRS}*MP6Q&+zhHIL4w)b^k;~F=fb0}o1ww}# zKJHkY&w^3IUpu2SeOtqhw&dY}l)(07o4CM)!L!#(T6Ufclpq(^ucE{=!uF^U#8sl5 z%o;u|W;#^4ESEflvv$~yJqbS%fvME%U3O(+%Aiujy`}6i%YvY*(-$q1 zh^LOfW=`^6B>%LP8IQm;ozA7vXV$+Sh5o72Al0rOqd53sbHG_tBX^@wP_hW---8PJ zleP8HjETM{nrV0KrsH0A>I%2%yAA(x%C@Kc+b1q_3csgUVqgyJ>XcT#nq-*v@U_46jpI*`VBNQN^_6*Ys5#b}F$y}3Xj7&9w&P(BF2yw5Tno2&HD006M@lUs}g)NUT-FU>91P%9#%fx}Xu(7AUQ)kigQ^)px18dEU9*KHgsHI*qdCzM< zqzzaRQY*<6>V z@CF%-LE#vBaaqi)CN{LHkTO6K(Ixk>3?b%>PQi&1Pe|BW2hvBry9Z86A82!k*tEyf z;NEJzJ<*vP$$dX%y@k^U*u@%_;Jfd98R8sXefZic3l%=@Yj#(d?`E3)+VE~rC3S<` zL0pqk`Om;7F88WR4yXFYU{<4anH0OX4YPol)hUahlkeWTvy5dkMbsdU42DYMNLd9l zPbScB5io&X>!6-T3tN8_l_o#M#9VDUGK7beKaeQ0AxkYmJ_z;&)M&3CAn7j2q^|r{ zR{*drELpp(xyqJs!3S%ByR#G z#EJI3@^^Md7J8l6bfNZLio{5Sn2ypG1il)!H?{WECCd|om{hK~UiZ9Vp|QXL(E^teq6m_rx1zF(nVu!BzCy8Ntu78B}3nsOIr2pX#FL%(Ibkm zG&V1?xkJUF{F_tMFQ}AU6gEylq?VOh5o+eK4x}w#T%eB;ErZ?d|C7nVqnJaq4p}PIpyt4 zH?$Ei9Oz{C*mZsM9+6V}!-???O=e!AL6K~NHb3d3CBg({V+*<;<12LBgs1lC(H;`=UvO6QK)e@^d3<@`zgW#PNnN%8dnUgP+j-rdDjzL_%k#carWX( z#{q$_g`U)~rIdVBXx@2V$_B0kV~G6AyYKSN|J{h(@6e_22=X|**BeX{Nwtl6x9XM@ z!o=grAq37vh{nI~p;wb+V;>QP?AmtZk(Y)3KF!lA?oJ^<_R-DB8xFy#K;Qypy%Z{b zM;Cq*1w8TjVR{v?OQ#76Jq@9tOMVDDxYzh#YnuKvZYgNx1UF||Eid-7?AN6J!6th{ zjAUgjN6?aDkrGRbYX4U}+Pl~>2h<4{Dpu7XvR7%Pn9aO=e6^x{ z?~}&ag8d{K^!pTA*St=B#SMHVE`?K*Dk`}cshynx3*F=L-EmvcanlZw;9K{+7Qc{M z{p-LPh2OJKYA1R{X5UiPctvZ{Q5j8cdjm~MbLnI>L7!93M-L9n5u>3r@bTm?K_;8j z+oq;+3#q8)il6#K;Ywu1QJa4pO{mnO_1z`E58u6f8K^J5Fmic$i5~H_XHqFRH>dql zOo!Ddj915vy*l_5eVrao)&UIDDBp|JG7M29^){|NIXJY3?F%OrLio2FmopTuNo8V} zj+ix~r_gGN#WjosHb{EacPR9-X@ofM!Zx;=kLlF6O;O7X`6y+?^<#@$!-nhInrD8i7}=hYU~($zN{hC$ z@sY9Acdz5wKg!BHXM+{SKSO%1&awd@(g=2Lq!wpsf-o@e6u~1Jl^UC=IcI0rX`L*a z-I1m0Whu0=RowXP8UK-$U38i2KGcdK{}(SiOR`vhc!&6C+A8;=$MZcwLM1E7(;qrZ zMqIC8!Dj~Vsq@}RP1c|&JEv>4ZBuTYR3#@eJ}C-VWRy)-mlbJr{xJ>NJ=muZ5W>^o zb4XY;wPkYT!Rs``bGZNHi!%#d&o`4=ce(D3|u9V-Vm=9ez&Wjst)MRpdoeXTjpGF$1~ zK_vy8#j%GcnQurxsXn0%_zH11{cqyjjqPjk+~BCl=-yvqey2~}#%@FMP3o^GD$u6- z9}HuBHPZP|RjnSK(z24Ww(lV*=ZfkXU@8GY7a~hzVW1$tWtp9v>!LD;w=6O2g^N^B zbqZzmU0Ir$q7RH9Y?cU{;KuX6%Tcj1EiEx~q~?{InPE~op2+2*dtFFDyM7@D3~$yTent-gMy0w2?_lpUbQE2GO9 zk9|ouL<18oKFj%$f76^o{?_Ygnf#ZK)ML%@rR>`B7tuA{3}0Gp3dVt59sXNG z1z)w3?cY_k|7prT;i3J){F!Bq@f%W*Wr0rv?6Bew;1*uyt_P=%lxd`>PC=aP;}uu& zdz&L9IUloRJBGo`_}GPtmhR{LV>Lu%>Tw#TViW37O%+_-@rEam4VlqkEuRc7&A)LZ zcC35PcXgHDi2Kq}k2yT$<^hYyY$RB-dkw@XQGNUnt`csjjGamTJFDVN{JYpYb6cl| z$CFW%9`l#Cs8^&||2eV5aL>NbfWiwuE+5-wML1Xrn)a2|7#IWV{P|~MD@y3HzcjxKm zfCpsa&L{pA1{5wwK!`ml+PcCntFeZ4a+Lrb!9IOM|s$f9iPScsz&iT*6Vm4Jui9pg|br! zp`1OX5i)U8lB*YQXvb(aSiO~PV8_4%9x0no-yTVQlVYVU`=p7kRSG6c*C|cP#;t40 zDUv1n(6hyOKF!JgS4Ab-DR+9GScT!@c4pog$%?Ft;YnakVLcAk-`sNGo8D_mzHE*4 zpEDcF@A7a63v=}r8z3z6$=%_YY^7okf1T^@>e~9S{Y2q*SC=G(B-6^(RU22SVdV)4 z1*-^;N%m9Y=xMKicG>ni)b8}#0-fJC^y#1i3U(k+I7mZ9$+aQ@`H&gHAuuE* z@K&}cqM6_9*$aI!&MF&AkWzj$GgzQ{snoUJ%;m{`$3y;PwQ35{!J<{w=IK-6je`QVF*_3ggn)|>5FO#IZAZl=eJoW7tt$i5D|^=y#O zvo?*Y7o^Tn;eFhC{jif4dMgonF5#S3juI4Ka+F! zVfhW&d(;&SPLj-{)}^Kn!G+;YJ5NjRXP*zNE8~?Ru7;UQ=PHF2bCF;BlhJVDIAwtt z0WSfST%tJ{p8l*tiQ&mmA!a;80(kG;<-ZwwpaDQ~i+gwH-hS`L5F3MS_8Y>l3R2a{ z#UMwl4$+Jmm!G!Arb2-Lg0j8vC~F3v=yuFNf>vph_R17xU^zw*g~dwzvy+}Y zvVXyfZ^zwS)_w$bU1z(&Q%WQiA{=+6>S{$wb=~^JZc83l3;(dDd?@cz@$aQZ1e&{D z6*G6nN3Up&%+PvA8vOC4>%*ZxeJ;BzP18CC+>|(Bf*=EuDS$d}21XeZAwX~(f`X01 zXjI25Bm{F5{OyWD_qR)cOC#g--iR}U)7-xAxj25&cltigp)+xEm5*e}>ZobHul=&M zGfJ)Fao_%<>VoBMHGw>#4>xl)*t(WRSwCozfR813XV;;>l!UB+h{ALuyp>FuApQVP zQJt>;S5_#B0^YE&e@N3XyEr6dDE^LCDRvuT|8k0-O?~{}To$%NBkUxeu+;;te>qM(;3MAej7k5 ztK(H5Cvp{(Z`^1I_#8VJMHY#nCZ9)-Ya@3b?+Hc1a?t;$VI(wmu_56n74_@1? zt7+?oa!w;z8gH$@ z6CRR(&DwA6A03Z3QqN&jQ~$rNq)sgB2f4~=-rc|bOoEf_e7Qd3_nd+8e*juRrM~Rk z`}~toNuiV?qCC&7cf;YZ)H8O@{T#*%nEeV#TAX*7cm}(G2;O^1f`E%OX9OJvM50+= zyME9{I&kUP#Dr@bKv z^}(l)q@W@j4tm3aMHGY%r2~q?NXJzoLIMU*T2$-x^Or8ST5TPmb1)cQJ~%u$>~uQ4 z{xC_HISeDE6d^LA6v7x&R+|7YI|t07Oxc6C-f5+z5Y`j~q(dzL2K}yJkO-j^TkC6a zs5F9%Lxq3E<{XH9ly26!wDMY?sHM-zsdZ;J6f7TW*(jQ&n z8=oeiJr#yqsGs^&Jyb&U&T1)$$a|Y+g*8?y73g3%95xyaQHj$uwZ=4>wX0Vz-+1Mv zih_Ue_x{EkZ@ix5c@W1;)E_2;;oz6Q{>p#--~ID2!>;c&#{?{p-qCZ9_L)f(cMl-D2|ostwvA5Weyc#l#ZME@T`5F3kM(=V@XOxFb;BS zQ3yu#2=^ZD42H=;r}O#k+dI3v)oQI$sb0KrMJb&mNv&2Rq9jRzAV|}ch_WmzGap1` zt@YlALBQ2w)T#*VtU>R{n`#_xZ*QMFcP@?t=RheC z0KLRkV>!7CH}?Mb`tIKS2M-@U%=26bS+ch%t$V%RMAyPOSEg5mKq;`_>ms5c%+s`5 zshr!|s>Wff*#PhIEM@1mHaFu?BY<-r0i+<~Jp)K01}MCjL`jw_r2;X=DtHhRggQat zxIY}`)(+C_u-i+Ef|Rz7^W0=vUgX9(Pb7%QuMCYATIW4WrC=OEohKw%8unc_?hc-E{9OMdSid+Ww}hyKOVuWZIV4cI%I8@Ug<2w* zEWLd3!nLcHy|+=Uw>Q?``LiFs^~x)2aeR4uTMGd2Qj4<4jY_}-pzz2D24TikpJtF4 zrXJoT=!*bi>QBvI>XO&b_3=F!a-ZSyotwL390QE<*pn-ry5LCjvES#_j%D5uKuO`p z`51xhoE1v-dc9g4o!j1uA3d@ruSB8N!S3F{o!hrt?R9Hy99M*p-ZLT0Hf zs1)n=-Yca`u^Irh-YXr{>tUI-&9Yvz*-~1A_k}TOGOSf9QKecW{iLwnVOr0PCz4zTqF8=*=TS0D&Ye5gZpC>4Syl+8n>8_9TTiom(C?Q^hPB2Fi!jhc#O$0g<>F-v z_SR}eMKWyE8;yD`l_Cs-dK3goZnbI*AfV}almH)5vjAGpr711(Ws(R0qA-{QPn?5N zgCR|fAdVuf1y;haspSShr4kp;t1vRo50muZuyc5Llq88~Po&xZd?KE6*@wv*u{`3t z%%DD-dwmi+`n=urub_vzSehG_hH4ibztls0YUp^;^^9M@?Dd@1JuTf?tt2s9W4yKX zdVOPKgAlvj?x5e>+uM!9sL^ORXOE7K_V@Pyu2n-wEZn*Ku+#1B?Cn0>*?IZpmyIcY z`Fr0EBy2Te1SmWdX%fd_d%eAR2`H-X?;rGfJsk#76j|$xwIfpgFYKYx6OxOI`hjrq z4s_vsLj*sq`1=7=`Qq=XG{r=YOtm-?s7jhrWl_Kh%&&cx#8#Cq$R`|9`F%!Dl*S^^n}ECG?@XO zdnR>0tXyU|5ZG8lLP{aPIq;6yOTvo83)`EaR)gU%45QC)-TmOBn}kfrQXr1XO+_;7 z1G}qNu1G2O_V)5TmqI8NHX8NIm#;kD-Q9WoxG;s*N=wS}B1w{~moHgs_YRJtFw{zh zVJMW^KR61su*Md9hyAobgfvYBQngxHYqvl7_@jQmm!zq^d^t_iot>Rwn&lpy2k#vK z1X^pY1Yw?Kp_0ZJQ{(_pjiN9NilP|wy8%HEM>k%$dinCD!C=VV)v6Vf=e=J4=W}Kr{-+x>eBx{WjRI633vv&{7 zzxjjTzi@7=)9t?d?zP42QOZ~_UbDyR0IfudL_2ZKYs6n z?U!Hc^?GFh%vwt%%HY#ks^G0MUQ?;}Q#9sT#0<<`9bXl|~phZ?*QlE5wI*3vKEh;8JJf1pT0ogluqH(vv>|XbY#+li3$>igmlu{6R_6)qyYChWA zCxEJwa(zuA)M|BaY`4?h-dyYTdZB=#NR#d%n5=)e_wvgx|Hijo1Aq^2#`o^slTtPs zjb^KT@qB&I?+`m;XS1Qr60L*n_14#3dvSN~FdcM-KxYbXU7%E^6cfrI0;FMPytBp> z?EN4~c6J^EaJ5$N_If}2@I&vcwbnRB6)GJv`y$V?JTK>^lEPV2q;o;H#90gD}ttFe2_pG~Op^R%0d#2{82>*o@{m|=?e>-Ocf)9Z{r`TbST|NO3JbA2PvQYnP9w%_X!;`a9TYp=Z$ zhGC^r+1uOu@WT&#{hkow=4Ur=-uyIB^5f4xkHTp4;+4ar&iDV#pC*O-_@fWg;owI< z{>kMF=Wo3H;`J++u3o-y@6O%d|JQ$%{_&sZEQOGbMuQQIvEDlp;>?(#o+$8pOg|M7 z2#|4w4e_#vy~s1~EP>EU*5c^mh4YuTYMsN@tFPSn;h+48&5JBaqfjG5p5;SZRO*$J zW&_}uHJ$vwtd$)T3znnCOI_Qq;5r~30wJWii2_wpD)!PrEvh;O_N)amKw+Jhf&dER zLNy^*n%nYB(b_yWPJ)(IOfZg%t4C4Fu{SWTW`q(ECxjpXECG0cr3o?Cm8dxeSZg+| z^-5ACXnSL$D2j{Qo7b;g$TC+Hg%Cn(ZQp#Y)9G}tT)cSkVxC&1iM~`>5+H1X5{phG8hzgS?15%PKkO%Z-FpGo?A{^1- zxw4YIunw&)Z(ayNN;&VcG?PL^QD{w(DZPK#@dt;OuUs|GcYA&B zJrf0CbpPQa=i&Ob%URMVgfI+A$a<@}ySL9IE?+#CSa8mVI;d8wy+L0Z0Z7)B6@d%! z3k%;ovwiqv-Qe+3!Sli{$C5^qrSn*Pa#_9UG19mhXLL1>_U9D}ej0vfPH^<87g-Vs zol3HIKGk}X{q96M_9>BoIbUkV{vFGqdbgr3>`cE+FO~hpix>BIA0O=RYppAlN~hD= z+uK{K-uU7E{`)`sS(ar)6jv(77$JmbHb7Bx0|1T^gF$8OT;=AShcc?y!zzNOsA@^S z^UBB6DX zB(+MozrX*l{?)(ozx7)}h@->9|KvaZkKev=Jtp7`n4wY$tX1AQQYH8IC<|I%jVRNx zxm8LE8nFu&h1FV_!g%L`FaQ8R0qjeL2kV`Z3IGaI5S4N_;F*mrp&nFLe@sN&&ZI4S z0!r<$K}l6w_@%VO=PNR&rIJ^hsk`&Hw=K zy>+fko(D=#Vhv(sL`PJ7S}Et;h+e2<`6^E&r5{z813MQeRZ=j^PKH4wWJwDYDi^p>)o1tYd}sSZ%Mj6hW33-WCL0Si>?H zGrp7&s7YZ_N!3@zrOK)*@Q6iGgi$4ou*mbGD9TzcrDT@o^;-49_L{S-1d6glY#{|X z=bR7#AjFt5fx!cm$Sej3f)D^6?d^Z`$tN$pd}C{)jR+5R9`79->L@nW-h1#!>p)6b ziDIpESgBdp-#_XU)*!e>qqY%7QcD#^DvUg%1qdae)SL<=;Tf#+KwzwwQm#aO3Qq$~ z9RI-64901|CJRAKr;OGfGYS6_X=haq^z$k!dS(~-op;_r_DPah=ZFXpAMNb?n;(5L zOp+|mjkQurMgT$}1Q3pik*2ZF2|E(8HF-BF9_$@;j}8*!vvim`RDj2J7|->7pK|<) zt2RzIvU58m0I<#nQnHkVv7TXVeWTfG-?@G3SAX?a*Xj)fkO(>gZ@@X0iU`pIJ9f-W z3<9Y%t|hGt0g7_7>=*@VrMv~D6etA@MPW*seiFzCh{7@efc1dvtvA-XI105=phj2j z8L}cX#?-5|GwJYU&3P_K+DjuesY8(|K+YThbdsbJg$juPnsuEP))^y&2m>voaE=Xw z!uf8VdA&SC{-nz)33{xx);aGzBM2d8oL%-MNR2^D=>e?=B2kX3b52X?M|U#XAP}IW z5mZ}@z1=d-9!ZL12msbO^e9L);;<4(L?ja3G>w9Ad%Yb>Eb?3_$pA&O76q~*VWZtJ zd1j5#N-zLh&j4WL{IZYUnFDtg}(O`b*Lw^;3cl{?%jLM zMtw|oC!;7H4u?N|=bc)umgISV*`}dIO@LyG~k|y+cGm z9YJXXW;mh0AgFECem-6^v&!Skvr5RNXD~XUX9kjzy)H~<8Jg{lN?jiwb;BUY(sVEg zf{H>0u%HAYm2h($Yk-#&gN%$qqIaOA0DvO5MNtSL!$>D-9>oC(NHfPCqevn`W&k7@ z=K(+vsURrFQYw{X1>!WQECfYC7zg25O~fTtMc_S)5fAHJlL$~z;@&~$?(JLO`Nr4# zdG^UCAFs9AaS$EtAEs%txw(1i;(0C5dUj(l{w(qTlOexL7bZW7^UMO}5i!eiA`(IX zArekW#*iF?8?WmqL^(GL<3!0u4Il`ZsEi(X?*t(NI`7KRv6Q8$1p;PYl6itaVDvHqcTE5@f6^3!}7>%$#MJ_Z~@*5Vl0$k4V?X580Smbhhiu{|l*$!gyzu z6k6*dONych6m4&A#!-L(&a?GaAP6E7;@+dZL6VjazcD5V!?m@ws1gc^4xsR`^LVe< z@5gaG91e5G_Z~g&4l`qIx7YK`{WQ<50f4YlD^imsLxMy~C6JVq;9>94 zijkDO5Y9P;GB>MoTG000H$MS+MYh>$!mFbfg{SQrN$ z^1P5zDj7(DBoqKBCGbQUtFd0ovfh%31d%9hwqq|yNHGc!FtGO{jDD?FFKuDT-j0aY zdFOl-SBz&QA*5nNBxyWb#~^V;GRY%awW)B#G%q~9D#j=Zj4{BhRp6XUk|dDw@}&zm zUV5<+Ndm}^v4s&taitch002L~ zecyVgwPr+PnMnf5@lc&Xuz%I%b~Y!ptZe2OU+V(1%}+8^3)kG$C-hgY9m{AQ`_q}2 zz@MjkdTK!Lf(`+U zdFOnZ!zjsMl*+3u}mlvtYduS}-yb60wBQBCiB7fCaVy#(5+ngkk1% zAgl*K5CRxrcL;-F(rCn$syIlX5`*`E41z#NK&d2vgOPxNz|lU#d25W(LG)awoCdEe!rh&DKiU_7tdV+1jmr4sSX20P!v8%l6t*bUX}O2 z3_<`R5D|~pVj2g05W#uxm?w_9^Cf8{A<~p>3rR=?0OUOqkdVFpQ0Op-;xMlHyh!@P z+&Ce|8#snBRp~Ki(E{H;j=$yCSt+lET z_rjyzpea?g*+7K7qyGNE!6%>I93(>_WEe#viiJ`rrHTYF1VM<#7-vzaxTXtZfJ9yx zA`(OlXsq{+%i8J2#-{PsS&PaEKo2;`3R4tPO7EFGk`#av5uFEPog%r)BROIKebP)k z{()s%#}h|BtzhOP`esfXbjc(<;iUeed#DH}{Pic)i9Umex~%T=xwdDkLp_$uL;yf4 z3Il*rYin&`90}o(m;p(mRDi;RLqs6q!3r3OG(eeI9Vb(RKs#%IeZSwYR3dAwRO7XM zyp5X?l^PGtDjw=W_mur&FJ^J^5`sS-J9|naKtB>Zps}Ay0O(6T9Akn&OC9d)?SFRr zZd%yA`?u51QGb8`8?V29absN)NCANqz66B;Ft7zjfC5If@{ZU6^s`hb6=}^%m{Fn* z48Y^A{j(qb`K{ZxuU&uPSHAb1S_}vvsU&p)1Q@0qhgfDIjq}EPfh-6GVi<(W&|j-# zIF`*rU#|mt;WX2dSQ!KZrmuzC#%((2e8g- zqE*elbIa8{#zBbLiBgL2Iq+GQ9UL5VdR@<~mEPDmCs3qWJ{%5p5H_k|UYLV}!~Ok( zwN|Uytjn@6)q^Au1f|$eS+z6?Q;!~)QRD#t2#6TLd&n7t00KZMMpuHU0?e&@_;@df ztGQ*50)@7aqEIudHX@9wmrLEi1^WwztjLv+))@4zUaPe(o;$a>UX4X=Ih4rkr4SMc z!6Skq`FN1uxqtt`!$(KG{@sUYf5TlY2UvC*x;VC`m$~_bLpCs4xZy zOOiOt-mxbp8o`e3SQ~|KHumdXAO#A{`w2n_z(gnzVWg6D207F(l0BX4pVNOcjyC}l zrp8fmDjH*hpkk8LdXzypOq1RHL*sm{UaM3q)oL}aRDuw|fH4k9^wNO}wG_JCUpw}t z_cAb9<_tlwbFjxmS1w-e6}eDBETL1tgGYNGeDu+efAW`i?%sR?f{AsIF-DtIl zaAU3g`l~mp6`AFQpa3KU0;D7aV(*<3#=5*HWEjAkufNg^ zAuFJ!FEhY!n8y;d)QwP|U;9Qs$r^E3YH_0qCS!AgxqgC98hLu9W}utoz~&BQRSHng zdc0h2l*`H)5;_z?q#`S%jN|Ig;h|PRx8Ki_q}Fa#0dy2F;m_Xt*^4h+uT*0tq!i%% z6mT`E6E1B!5{OxuJpd#i01sfT_nwsy0zd%djNbcFr!CLSj=0K82L^>!; zHc#DL(uYk|2&Xwm1O%_qD=@A|w307eKL5(KZ2~Y30*MlUg!BZSy|V_u6Jcfy2q}ZW zc-}wkWJMl^;l;~qN8K(7p-5y!ktB&!Dvm3%qQE+9op&6^6{YnsO_-rxtM>Z?A%q~3 zN|Gi51ZL|j5~2q}1ZHDRk>vs@(7LQkvECtj=PZGcN_u*RDT-(GKAc<{rnY)gBr|ht z>0eHZ$hp)cS@s1uIcz4~^;}3xzT|eAknc?6)4MSIr1L!GBhPRj6aRVqMDt8Yb3752 z-RX%w88I=9v`o=C=e-ZY019+8NFV9b8QvvnB=fc<_~YaN9VAxKeb z_l`weORWFcoX(bdA>%ByF2YmfjBv_iGG23@98);)TrB>I%x`wY9y~YBn?yAq!vt zj8zB(NtV3x{(E=sKWMD2-+QoQfxh*fU;gy-Tc6zgY?$WtM(gD_-!jHNI_%uJ`=A=d z{eC}=!uN090`DI_xQE`I+gg9=`n9jU@#>}RmLLKh80M7<5*BpH%%mOH!NNq2k`c

tqn@9v+6hTb6cAi&TUtt5CN=rL_{Y-DwD~`lWr=xLrWYW z06QimBpT(?$Ny3bpMG}#@&10A7sE6UqnM=J-`{Q2E8g2YFWT)kk~li*IOZ(RqbLre z*f^UcDFB91L`21~C(_<`zW!FTQTN`T-`+p~>sbVVj_%E)!`0}TB?!EufCtDXT6&{q1D%Cm(RpgdP#8GUr9D#&X*15qjDIduq zO^5x?i`TAz&HnK}{Chk1@BHB3{?Y&DfBnC@w6zwjL@qzJUxY}LF=b$YykHfe127DP z-~kc`kpRj}EF}QsMG?gT06ciO^WJ;!Nll;$)I?F79eWQ9k`^=L9D9IgX3a!cc*Gf1 z&fBd}Qk{ItCN1>3R(x~=(rcz%!82X2M zy9d40_ma(X+XwxAVvAdM@36JkuU`j%!k93MHa0fmIAUNAEC9>0pgAU{`Pn;8j*aQ- zN)0}SD3A!?Ja`8vAj{Zzj$+!~>mD2&cDuc@PF4tt!eFi4%+p@0S+8tuT)A?!)r^K2 z@9iJlx^?@g)9LK@!#J*2qOwl3)9H}6TkZO#t+htIUS5W=*5r9msq_Z}t#zO^A(0^G zeQsP1@ZfOJ>Gg;xl0t_;$>YzK7XtjIl$#U&&DrM%XQHo@xRqbL5Z7uoL@0{Pm|RH` zLRgb0NgBnKC!rv|a64wYj?J`_AfuJOc$wzz+$raR$tK6xyGWDU_im%l|NGzlz0W>+f1_1%0BK=IoH#2qrnv=Y^iv1u0g?;~_HjhFcaA#! z-kUF72|{HYNC8>~M}xFhjkeBjKR!5=%7a3X1ag$vM}m_M-m|xIqiLMo-`~G|>z1+h z+STjp?e^OGngRIi&V#M3ZRcF4(_P!o z=zedby%y=A!TpS zPjl0jYhf5hl~`vQO-x}Akz5a#q}!}*T4V$KS>5Xbke5Q zBzX~WZ~$?&3IGsgp+JXt}s==HN)|C7z>0wC)`!0NF+ zoNTRTsN6?3lV>8rzc_7~?(DInzTmUKQwIY_oVfGiUelvSwzMoFMM0G1IeK4-BY|X$ zt<{?^ym&p9A}{PKuU=CCUcuY1T<%`JtQ5o&k{oIQFss}+<6R{TqzV{700W}2#miT( zUTQYZH5)HozG6KX&r$_S%l@GF^wXO^`|!g@j~<=hZ1#HnB+c9HYOUG2|KQ=l!6Ak? z+~2*j-Tpg&>$fg!t@jUq^U8(ojan>LbWay|5d#3^IS38RoTXVMihum)KiWGwtj6)- zR01yUYyWK9S zyaq{@JGg!4-p3z*{F}e|o8I}4Kf676_d}tSkg9O5n_d6lz{X2KI*4HndJ723r;F-OnnTha(y}+?5rOB+#3qvH*JQq?*Aq#6e{T?cP z(CG|@!@^ib6j})>rBXp05aGnKF+!T4b3yC{l0&&%N(4u?wV68ZdGTNxxgX1W$KHjHSqS3CQY{&>=wGL;ok$Hh+; zE@b=+2K8AN#4o$ERuX|lX3k06?>nSnBlql(J5?d5@$ITifT3@HJAP7*%<5z zz{ja?0rBY(jxXAl0$VV6oi3=haa&O=_< z#KO0~`7Hvl01`j|G$UXD0iXmp24{g8w9+|%F^-UlNTL{KX;p{dSPQ&Viy5E*@C*WB zv#qaw=e1X_p5Na;c>VPk4v(^($9t7}qt>YZ@JB!W{`bHC_}0EN#kYRto4@qhl}Lcz zye7U05;G_bjv)x}-lI-GNk0GlGY9Lt+fmpB%lNkep+J%6Qbf(+FT@l+=3t=L?z_b=H?r(y>6{-)fB zX=bwgw|@QCO_trgb?e5}i(DdWgd`j#1OS+bo(gFjBicvDNv)joD2SwV0EM%?LBBgp zhH07`XS_AelTd}TxivPBpWgiR&Mid5ix)07n@#U*KjAD(x7)4t#>)T@X=>Kudab^( zzTSvr!6QgiDd#dwjdL!F!a&k&@0Cl50LY76N{NWp+Hwi=-j`bFiytt=Nu1{7UuUSq zo)Vs{R;%9o;c!Sqo12?K5bW>o_j>*3ZBQrXb0HY=%W+bVSymn=qi1`RR?H1A+W@V4 zp0nzQ$(ChVTLwn`!YJq^LC|qNb7D$oYnGlFNIW~sXMNULSi$KBfEiZaLaf+uZ0DXE zaQb*omnTq4m1FxHp>kmIuD1P-UlCk5@x+?+iUCV>*vpHl^i&Y zT4Wp;=h(Sn>QoS*5Fo$+^sNsSDMSK@qPP-O1fWd|rSxDhR7$B(lYra-c>BUu^QEmO z1Jqk#O|A>6D-pbQdHe9CtDR2gZ~pdgz5UuX0gz@!hpH&j09lL*R#z(%nu7$5e-gsM z;b55OAAayN2OtPr&E`iRf6Owtf6(c4I#GLLbLbv+diM`ISFc@@krIN&BBy>_<3oV7 zLfI0JFX$wLk|yB*taE`7TbrBAOeA^_9>p8mL9M3a`1bw#fz+3;UW=>yg)wQCZES25 z&V^CDwy}}kPDzT~74=Fi0cwp#Wh-2(22>4-!3F_X$4Dpz0DyDA?2&+QX?f2{1ZRnB zM+D;?3Np?f^?OI%PPgAb>h_wgcC}suC5}2hW36Yl-enoNQ0B>CFc>`E-LKbbM7XuN z8OPBuH8O}zHs$wnTReJa>Kp;Fi8?b)LKVT6a=A1=w>VgDg|Z8zwnTzHZ9EF z{(&(@YdzxDC$iQ$=N5ZNCqrQ;9{)wf;0sRG>2!*sK*UX~_{3%xO(gH|r->QkM5@zGyovHXH&bs?bXq%Z!282Gc*tuAKjSy(q& z))b;> z&ENm%Q&RfHmtU?&3IY0sQN%ts^)QqIgwO=gs8vRn=ULdC*%LV>RJYe@)?3@PsKiix z?fSV_uKovV%%f`y-w2hpg)j0(wL0kcqE(#KV{y%LaVa;{g@Inbmm3oXI;_MSo8PtG z{qYa}Oz7af4?kXCUpI`Oe15w-ObZY99zB*)oS1sgl;c?dJq0Ma@0mS&UzWcT5+Vtr zAN}}8!@@LLjaOcI`P<+4r6_=#H+TN{kNya}dG(bS8Swsthgx905=C(oZ?9k8Xqa^H z!sW~DYM5lM5{ehEUa*E0;l$~}(}g_nM93Ea3g?nE)jG(F;?d4dlI39>`EED2rWHk= zsM8-1iYN#idx3a(xL>bSYAQl0_l|n$aM7V#mRw~?D2WgBKK8m z3*FP_S>QVdW1M?uY-|}O>K~)&QYL1AL6A^V3n36t2~?c7+8Z0|TUvsuRI~sBuOtoA zR7cfP#qyo^-@ke1{%c=*``h3B4x>5T+pR~@M!i`S{#+{_Enc~EwlK~JML{JD5InGP zSv?8_H~`EGYdj;#NSB3|(CrPSK+>^93@f#A5jz8%AObKT!PfR>;aqdA-D=keV6QWD zK)?Sde;x;;UW!ljH(Y4*=z(jh=m6hg{SsY$_RD6n3u zf-}u}B}>w+^;Ro@gT84uDz!*UsbWRdTHR(tsr8OYHR#{`^DtMpJ!94ebQ ztt0^$3j*QSzWepK(T?lQ?d`^c2Zxnvwb$!?`u=;(b`vf8vg&wtQFt~G;)&m<@dQ6U zqI9J#!NX3+0N=fR=V$M~|IhyEKT|@0gEUFHooXA~N67LV5F)LwT-X*RVdI#& zvBU(?On;1>uW=vE#z9X!(0+7bBk)UMU2aSmMu$h8&u-riqd2bBA3l1#wz(O`RUrED zPk!3%51Or3uiuZN3cE?7d4z>SU<7YWfn%03oURchb-;_DXG$sWeMuNyuH7Zc@=9wo z12IZttduegLvP)1I6%TUicC>RA*2+*Y)s*tBSNipmStM2Nm91V(Uy?0(K+WlMf40p zi1HXBD&fba-0ZVVmeWu4MfI1ng>lE)LO;G#Eyh!P(d6rhu=L}Pm8hPiYAWN;r%6ms zUrcn0&RX7UdSTCM<4-!ilLGchU8!f_alzigy2+DbsO*=Xf6@4&_mg6d1=zG%dDn4i z@?2cO&(|wYAbaCX0TM5sK#K4NI@me)1W$?7t9w9Fb00degGXWzb0ScUQP{52eowb_y#OoPb_i44ZQp%5AqQPL$ z?e%MUk!4x8+dVkyc6!~xU{I^o%1RO;Wl<_9OxQ$5HPD2r=TRzSg=d)AM^R|4?RGnoM6Ft3=HYNqt5!`>B!d)zrIeD0y~~qC2f8#5rF`DR zPD~|p=Li-+>41pJ+jq{De)BRO!LMLjDKuK{v~Wy~gX2VdIZ6}rIZow1B^r4Qz4>J7 z#IHy@rqjOQucto4N`IXtf5#^tUtYsB;azGpjt?7qQKPDlG08iOu&d?6cKQt~!*eP% zKD|r2kUaAA=O;N59%awWY^^OqK&kIO z+WqwQt=jqRO0Ah2^JhQ)$=;)#Z@&J9H=D zUHPA(PF}2uQ>%5nK=CcdGMGpnu2E`gegq5-gxx*v9neQS!xF5Sq`Mf-!pQ>OHe4GD7RGeL09&E zF_VI^ZhSpch7JJ6)!6>nIV+`b(0ORDQ*e|iEFub(ks%jz;`FA}FwV#acB%S@A}d*)YWE(x%fVJ^=m zM}CU->;UE|&;C<_BD3db2IoBjkEFf06m9k&%=Nc^pTbql2|Zv)}K3_VLdewc6Wneyv)q?mc=G1o|6adm&F;6rv0({VZ#=*0Veb zf&hi^;0fr>S6{w%{l$+z{hWUA!<{tA6I+X-h{QYZzW2w!|NAdqzWmGI`o{K!UlB9r zjYqBsxcRKsl6XHH1IDg4BJ+jIlgUHl+W7HQL+~t0LaCBgkibi1t(<4fc=mzB$^TY& zQWwLLrq{>Qp8zn-6Cp_u1wxnKWlh1JrIglMKoC-T1T%hJ_97vUkWCD<#G3L5rwp@5 z-zSHBnb~>n^#?i(gD~uN`v*sz?qGP->kFygcgmV)Jv6OQ5X&guSKLOaFg@!arf(~QQu{u^Ba$kj^<~Um`QuIRq8}&Kf0!z>>eH@XiS$B$+#CwAb(%1QH{O05oV$AYV!H-=JBOFI+oE(Nz&Ynh zC^sf-^8hy=b$g${e1bu_iD!C=(Zv7-(iWDXD(E_nukKf9qtRRt`TM2iJ`o&AdDDDLp_v ziY@y*%P7+Qey>rhOAxsb<~@-^ot$%-C;GfMF3V^%p1I9+ z)Ci-&C+bZn2QPdd7rJpLcOEBc5O8ckaT2hb>}^-~H}T0pwLS~R$FnU zIBGXr>+5S$h=&g!-oASu!$?O_i9{fxYPDLjGA#`80brTTp3onbcGOz?^8zJ#_NVWi zxgl9{{)HaulP_s%P??|Xp`IR;w9KGBwG8I?`zt=d%j%RC{>p%M#6`at#B|JqoWeO4 zUGsvIF- zkV#nQ1fdkf);eqAKsRa?ML6hoz}bzp)>^Xx><9h+AT^IVNoSZzDVwbZAbW3Gt;YGS z&5u9&z~(st$APYfVHD_gv(ad_byWLTfA9yr&e1>m2mjv9k3NV4{ZIbE-=;}$$a^IP z09aEv?}gNkNk{;IVe0cDkK!m$<*1G0i!%$ppK(>^&D$ARuF^J%$vj2y2*(ryXvRs! zQLJTRisp`##FHGvxbK0FO`u#z#KS;AoOBKYGX0!EpZ+~xhw^FOu8jU0? zfFVs1WDW!pOxAQ9rOJ8ydL(~T`qFr8!!g^+sOiKbgb9h`iVtv>CEHtD)oNwXA9On% zlV!|a2wH14+pXs2`o_k_MzcZ)(5%;^xYF7_7uD+he*dG7KHAyYDM=)XqA00@g%G8s zoPd%l)mo)e@!og4-8|2gQYGm3?B>W>bRe6&hM!q z+0!Ka7S^qni_fuo)6p>}>rfG3NtW>mIn+rG7yJNdV`7Jk-=^wXy*J;?HjW@F(x4X#xP9 zqod)lpC`kl*Eu>oNcz2M7+kq=<7=V*0v@=(=Antq2{!QML z<8Mw3ZicUA*8KdYuQ6QeJCY6q6{@{8nK^?{YG2K7JBrvmXoqg3x=0 zk%TWJj)#x^=_5f1oDK&1{J9seT_d9R-+k|cpS`c7ymay6_rCj`W;{~dbpQfjd!xF! z@#@e*D50n|cJ2iG-bI4eS`9=>vrI}E1ff!jh^+I*7-Q|lD_5JXR#6nUZr$41*(qW4 zc~JyGu<}fKrZ(4~2rE&?mALnX)8z?MXfd-7Pe*g2Xfh(2S$?ir*3|LJ4!G$3WxK)U z{`eUffC;tm6g4&3D$e8oXE6h(2l|eA^-f#iI!>4P879Kxh)x_A3yynXWQiyIO0!Y; z2{Q?OVOse!X~+Aa+KmX7EcYpYAe)!(I@9sW+_~_w-uidx`5U?vL;vvg&fvgA!0R@4vDhdDr zoXd;cBgA1?i2~;>LK#b)5T=g642wL}Wu3Ef#Ft^tn$AHSM#F(KGZWlAHS`3~BWK>7 zGY_jyy19bk6T^J$78#%{>j8i;QZSp1#Hp7(dwVonS9)UYI(GlFfn^xGhm$Lj0)VR=Q8HI6DJ;Rh-k^t z;}GJUgN1c^qF)f~~)xtCAl$HVwKMn&w5vpRZZXLz1e0Zd2gM3e((cP--^B$%@CB9@MpWndqw z0HiX7yL~$rf}BedH(6c-8UY-_SV>+QF$ zUp!aUKmg7G5Dvnkf;m7WLrn?!AKHAJUde|5<-IGUm=kNah`~e;h=RWS&`+Z%n>v=7mZ*k5x zaY;hbP_bw&i}kvG}}aGE&SH* zR{rOCpvs!YHVeIwskjz2FMKVEs*+YlX`e^NkqM9MJOxlGwWz3|x&5*>*VV4z=PrKR zz`)17=^CWyEL8?rQ(&a2MDeljH4!-`+Ml|gkW3@|=xD@s@Re1r4cu!46$m#>FS8KQ z(9mot(! za&N)sHSPHWH|@{!6#UKGzXy*_vVYPD{yB-+9tg+$CzqL~QYd^{X1nmqD+Jqtx8$H4 zSgCQa5m)8atSZ_93Ml1r#`Z@HFCl=rXNxbX)N!G$6&xh*HEhb&tgik=|5`pj_R$zi ztj9)K`ZPpO&oDU1*;fAa6?~T~z(Jp-_5$n#`1nBE?&HZ?f78y^#MnkB-{V{4em#PE@QWQdB1q@pkWRO{ z)fge661QTBrGi)~7Nx$rdmJTKwg;t^WKU_QU*KEFUpTEjG6cx^-PXVNF9{9Jz~iX> zRxC5W_8j(SHTF5sy_D~sbZE6`<;k>Y^zI@J`CjDVBk^fRgZjAb=vd|N%9o?<6?`}> zi6Y664H^D>-z4jJb905J!B-k|AX&=5*HxRH#PT;fQ7Txla4ue2$by5=4EYD|dS?!4&xL^L4tIO4s|*5!V`F%c66MK^`l;#%>@QDL9)&Iix za|{Nk$?cSpWW44}b8|i|=j8Kkc?pma{G{)rwPhzO1zcgKEFXX46*kTSKIYocqnx{s z4;CoAx4707urbH}E1iEWj~CsKcno-gwnQ1p^J6`fX`M1zYwgBA+4CXf~ zh_8)AN^Y$amh==oM(?T;_w+~Pr&CYX$We~7<}<%IW`%j`cmAm`&JuJO85m9Ce$?di z(JVGLy|gVN{?EAJ$9kFhZwL4;lgFnLJGGdl8>17}--kE(&EmTbnYp1TU3i-lj?U{c zZ<@f8Q*v9BceTH}0~iMEI-H7Li^}2OsLVEkyK7bRX8Uu4^lG z4OP55NAn=;X?)|P@q(8EhB|@1*^|CMZqEZUmM2fqv#3fbyjW#1PQ*5N|Gneq89`#d zeVCote!qUsPJ<;UYaef=updxJ1@nYD*O)``?+U!7Z-5uCt8>d9FhPRvXS<`Z)NoNx z@DQazrTS#36ky%8{$(=|kOx}X7d02eZ^@hq_kI(hmd=Jksn_xXh?_#(-Wi+HgDmYK zf>?4Z*5DpgLlRPKv}8$SepZ+oM{0ep@FNH1luh$;QIA)mFmUvs)!;$~(ERqf$57Kr zwVhc2_=3d7Vdu%DM-S~Utq--44Xff3bIZOTuM=k^G%!r4pe9t#Xjd!PAE5L8bdFW% zk5{fwd&f^l$F|`s^?}EWR^%CwfDZqAgF18QY-CC1z)gh4qw&TJFD7_F{h{YT zEZmqA`qB^D)M8!*j?GJ=gM|k*YctA)2h}e%X)qXXRcjypA-hVN`I64@TAt0UYI>yU zHHa-ve!sX@)W#Oxn))lJPeO1QH#!VuL#c*F2`~FHI-&Klldqj$W!u>l7oZEDA-qf+gxmF_Bt3cS#6g8OeC83Li`EEU2 zP-JRDRZtSe|BhjNPO?@Pz+D+%@lbqlt4zv=&vLN1W;4|2m3o*^{cNC9iQ7;iY;0y? z`;!X7P}ND=xU@BcKK{BKNn5%9?=7hJ z1&Mx{1IEfL_f$Md%zGWnW_`&6ujZwxTn*&BxG1}J;2Cia*^D^ZkYDm9twQc1n2_b4l5>k%b|*43&HC7rKh0WlEWTfKpsiYzh%R(Au>548nYX#n` zzRz}aSXHXSN;Q{vRKT5XVu*~#{ONM_=C?89UBAo&UGUjtcdc&q{_nf`;C(nWYs_F> zMQs7=}kH<0kYPJ83)F>CBLoT3=9zBzt~v#{$i$ zaL;U~0?Fe+Qj%9mC)l_YFVtYQBgqQpWme>`6^WD@8+ou$p>Xy$s*cALknrU1#F&_v z_YD8~P)bi!20d!#_dGjv9FU!uUklGmPF8AU^E#8memy$Hd+{$Vw65N%%=_*Nw)B%dJwa0m(_%brBV+A--|z2f z;KB^LHPcF^arSWRmL3A>+cF}>9kV_C41v(U$~ zk9bAP4?=k1`W?$oA{^5k#HqzHXll3K^g0{-jw^5jyFBDLOm~n1atW;=1}vwQ0Ml08awxXm;28sMa#t2OME)_S{C2 z54Gw5ZfjjFpIq=YAtr;)D_=njw2w35`)JyP@iW(b-vwCy4PncWnkA_5{ zL>9Y+rU1C(jr?ij3{*~-exO6;2*{}r2}oG2m#>qtej1jRH5HCLPHMXrzo0?;zIbS` zFRWlmpqP@!pgaJ^YMGJjxMw0w{T6uKYgG}=M9_g~;bXvpXnx!E)qk>aYdc-fX)SyE z8Rc>GT!dTW%)>^R(T5(D@jj!HaNJ3n>$IoPSj1x#ZXv7?pr8L;UFtwD{g@o&z+B!5 zdpu`SZH;s-RD9febs^1qemm#$yOW@q>vrre$HHw-WTW4?|jw2~Gt>?IF5nXxs z+vA0;jy&e?Om&D*X0#(8=d7bO{M*6?8dfs8ZcyZ8vrAow_A+TJNj@wMAyP~KKFf~XnGS0Oy`xVsKBO1my z*>&MKAO~#~_z1-zO8$9bU{&wHXed)vgf1!ywQS)cWW1lPC9>e;6@6H`Jm@0&g?zev zI@X-~#{i>m36m)^sfHL>3&!Dw#0+V?HT6W;jp^2D@?bv6@qdvzs8xKnd~epp@LL>b zYGBS^73F%+RM0r^;=%j1-XbFbBp878=3o`amDHE4on8h$=q$3~ENHA!M-IGypTJz) zO;P+$tW`kgm$(~Oy_)(3sZ;mP>~rU0)*l(4I8nR*mRMJ1ZucE3vwjWPa`ax3j(&M7 zVNDrKB~>!5_G8mGSS%TpGc+^oO=h{`AYOm(9}GDXjNBeuY%IeXgXH#AIuc*nq0^am zk4wLVoJp?k`yG^pl3}yIt@1JYHOy$VSAK5PbVoAyVgLTZ)Q$HM2n1w&L(I#qp?&4x zvS;(rP#wEaBXq^J&b7tl^y$BOU|N2&Z)GE{*(z0RFWjaD%}w# zrCqug_d2r9opcRmBFyWTUFc|N4k3O4hYPLU_lw=PyA}T+mVSc~e3nK>hj&LCAVTfZlDBA* zhZLFlAC8gN6v6kt&8}gk(VB&e-zI|ZOaY_~Mr8vj_JHcUJ$JXVcr>>DD)k!={@Px` zk?v^9nLi&L++nfc=WiV9YU=F#yCX4fXRqZe;(t1N{S(x0Rg#X=vUeHfeY}!Tva|4+ zR{}&#u1GJ)l(P%eOs@SQQLLGF6r#+~ib&z;7W|||@;cPRI!7E2RYxLTPSvPNH=jGj ziE)1J^yoz(HWRI@tPe^aWmc$vSn3t}h-N}DQb)f1F!ckxdCYel%*We#Esez#;yKoI zjt`+HCPLv~2mb^dFvBV-zfNzTkLhK;nOoYedvNp!>*-ILU(3~p9mygZSagLxzZKw4 zk>M8@Zw#cEQ_Vxx$1B_&GF8aCqiuF?X<#c@`bn0(fm#_u*b0%P|96 zzg?gHLPd|3JGwhMIANV`mrWjDCl6VDc><2kzfgEO3**sOvs1w9KP4sZUEUo(NCvB` zN>Q_*_q5j-B%U1vpGtPG(0v=1eySu!7t!Exaxv}j7Y%XYAIySe%K+lizg&yOGf*w-VTu0->o`_MySrX}Bpo8E9tX62(5xr%v5K$8Ya zu4PALLkS5LiBWWmYfk|xp=vc-GODb-@W{9@{mZd8v5|`O>J(m-vv5ifh;l-(88e9) z*328vd=_Kq)r5HxLU42pDC&H1WegZ%dsiLHF0I67kT!bQ#Rg3@kV*SGhGL0WIbj2k zKHI))6d}Xpk~xs(pLwh-J^Fp-i573Paht8No8|DyJ-mZkQx9vt>XpuL3OYT9wIL~{ zkrkh|U-hbiMzp*5td+?MD{4(>CKnSw8IAvG6|dppP`&$xmy~HsnnFK*rVoEVDFTVIv~Siro871z?06i`lZj*r>4|Z|PFY|P-+lKx zueHh3zZgfTvXP@;ht!@&Y|cv}OJw;&+)jF<>8Pw*fi>(!39O?f#NzR_=*;Xwf@84_ zdDNE~EK7=b{y{$$E2+(yVE6O$$5I~Ez^OxKBc2v&@rjD$Yf6V71%9fVyO>Gmo1+-I zwuTjdimLKge|{z2*`SbBegAWEjlO|+$Y9)24tJIjQnobf1Kwf{9StmIzU|Ghcc%SyDKyiBFaq736lNU4W_Kcm4EKT2RnAtUkoU>7HdH!Dbge z(sWR~h&VryD?}=02HsPx+Rr$)I_j|-{ZGqMqsBp7Ls0?ah+n>=$R1k9#s|jp*(mu& zt@UwTtoQ4>x~R9S6axk2`r{3;hzKd zb+GF!+TE@Em&*q29E9<4y$+R_ETLjMvm93KR2jg!J8G${YKiGyf$(6iTx!cAw3sPm zp8%uPktXDt0Doq7W<UWDkaWdL#h73bBslQSAa+?<9AWXhJ!Sv9s+DYV>m-e>sRyo z%lkm2DO`V24ToN>$GGx)) zOB&(Z%qCW+1dMP&$>Vr_)Gx22FV!|{5s$YTsN@&-KppP1eb6DWRDU_h`P+7xl5<3Y z9Q7E{JVObE*GxMO`dP;dqf7F}>Vkj0#CqG<_l}6w8j(2wQcZ;{%)5<2X*MGP!~n4x zb2zwqs)UKN);rPUw=MM!7>n=^B@}_FK&(shl~24lW`mD2?upM$eMD3x1&Kb+=hrZUSZV(w3M2iWp)Q3yj!IJZ!&_NOf81JyW z3VR4TIp!tXo6mS?M3$*|y&kPPqzY8~ho$D%GvOU3&_jbd3*T>Tyl<|KpF4u@3yQk@ z*Y;g$4y3zoC!$3$5yxGZejWPnLM>%duqoS1tv^92|I?pK^8ZZuf(8`wDHE`OvgXo- z)IX8S%rcEC zG!cRaC+GaaN9Biam3_SSG%H3_0+J~}YTe(stT}LH?e;&F(*+w-cSb~L?C~lSV3*L; zGnP&bf4jIn-55&p@&e)naFaGbRO`A%9GfBhE_t8Uc~^WcThEc>k6W6-x#hc;`?Cce z2}&F5?ao8-F@xEV@klWJK(UON1muAB)9k{bZF5yCewZwK2AN{;pWx@m>jfy(pw6^v zcK?6;MJ5jBUoT)yeM{d1ktda<>95r&_Cb->uXT387XbIJ^E$MLjK`_#da@f>oNO~b zoZ1E+#?LT#NTyTC}BRo>k zM$yFW*e}Vh&)Exa=977Ouy1)xvQ5wqO@Y}clUE2_JPz351B05t_er@`Qc?Ei~horQ|b*SxxjIaLiu!)QDGyg+Q zbQTG~GmXK6*?qS%x2Kv%E5Y9y8&ChL^P&_dH<{Oy&8Q&f4Ws{|%lSTw@eKQ(NsSs$ zrt*DZ1Exg;p%r;%E@$@L?j~|VjGfWs^3LtqVkWL&HEE%nMwk6daK2d7`1iCY0(J+c-C8==e zqr!V1{jdAj7)tz_wQHt(ny;lfM~|M&UH`n&+2OO4Rs5TEOAXW|f|^DPDd3CC%l8X; z7N0kMSthH%Isj_mV%5x^9QmH?eMxed<0atJE-fy$2R?s^p|oBeB1+*U%4luga*ySVg1SyM)CL{HKvy&UGx5{AmrzVMe&!jW z=W5_4yWJw@k^ZLmfmErbb!X$M4M>M6_-)*ot%`UWBXtIn&u;OTLnAt!p^CT zb>h!ScGR%C%&Q+^O0T|d{M^X^+w7aAB3Z_hzAs-(KaH*@aP4}`j86i5@-BSuTzKpK z_3>)Ef15G<>9PC%n79E$%Sx&p6_Vek; z0~bV1mmsf?AJgrAHuzUE!F=n0KmX|ZK0G`~n(gNKD)_mc*X*0@zw`k>)lug)Kc=B^ zHk?*H>^KhYVR?So9(ryLK1-@Ino7ZP*QOwt z2wFIHFUggvTgQy(FH*5lhTbfEC|6?-2WLkFVtrxqlbVNX{us|M+cfvV6U^p#Z+JWdI1b9*rG%%h+-q#D81TW9wbYGX1t%;*ATzE z5B^9C(%xf>;Z(zP$R!$l+F%u6O%7on}zOcaS(W*{PEhhSkszlU-Tpo*aKd#ZJl5igX zL~r>)(|S+2u(u?=ex&%tD4W`gxyGUYu<&So6bh6X&4{ywYesE8_)Hk^9z1WM>~B3b z{JJTW_7RW{LY0=#j+TJAWzS8;lDVDT%-7@wKi>kr1xPIk#!Zi{G?)m8`%#mfe-Hr3Zu6Y2TxgrU~ zhetME#Mw^3(tN)(6BPhBGEPpluFkd5#*99yTZ5ar2)>ckLkhLG!|X!EWd$F6%9D>T zDAi2lH@3FOUBy%>I0{VOZ2|=Z+T@w;Y`F?9@%q)H#~5-UAit=eW`wt=A-D>(pQjT) zToHm~*^LbM^WUi@G-ZI$lF0_c$(e3ftSV+TOUMb)aSBX$KSeM}SzDP|!Fj3rwS!Oo zt%WyCpn-@Y+z_Ys*Ts``J75(LPCYi*Xw$>Vjy)f_TIyFmCQ@u|7n1UcPwXSUri1O-}a(v@dYQU)=a@Z$W?G#P`=`2%9?P+M&-879kQ zKkU^%p|<^X$ju&|Cp;oi4cQ?>baUvf&09P;QVEpD$`y1)g9sHT06Gy~l#UvSP73gP z!jv;7|BIsSlIm$G3snql8r5c8IrNN(TU^ZQdOEZS1n9GVITjXBwFt34%cbF>uATZd zXm~vwm{k#BeK*V(w>(6&MU&E7 zuks{%|MB&ylHx-T@tARNWigY>9H9k#fEMYO?j`sjn^u+zVKw_)RQz zn2oTLl`%4Tun*E$GizS40|Z0z^z$h}LudxIRT4{y`;g)GvttW(#Vb^WRPr7aAL|!# z?wtu4@GC#~iZ1bpvQa!~M^;~BW)H*W++O-%mFXJ7uEg#q^3B7(K+Yb5wG5kd^WuY#_sbKWfM}`g?(bn7>Q9HNrBZK*3VB+^($JF2#3*G-w9u)Dt%s(PTXCzr;T4rETzS<;%Syuij8i~Y11-L|EW-7m%FJZ?Vvo`S4f^G`QrT;bQk}R+A1sP zbPF%BrD5U~R;YZ6=&9Z~5}Th~-lOLTlERs=$Sz zkn#SEFY)kbIo}|;Wl{OhhSf>6%_^BWnH|=XD`;NAwrkMEiUokAI)1)ackKlHi2LW0 zEixXktp1!V@fy~jeMB^o_^Tc!9D%5Uw{2jo6_56II#+L7&(K6gRr!)x9tM9rd_>qt}U>ZD)Y+Q0`ud(~tA-Lfm?Qc?F_o@alWupbnn5Re8*Q^946zAjMs|MPxW5^6=r7r%hnBNooM1eoMy9% z*;E>HY(Ma`lzD=2r4JDmEs`@px@DhBzE*LgW%JSgzN;GgvsXb>bX)yZ-1MppW8R;a z`SsvJEmjyPWnE1#`b(q8xPXF|PKmdgDsy@tPy&*G^|L`{=Z}Bz?Wu7`;Kv4D^e5%# zH5nJZQUmjE$u@7J!eY>f&MP4kz7|nC9|sBYroN7Q(%|%|F&8q0t7`4G8H(blj!9oz zoYKlnSH_Eyur~G4jx?}HD*bArCMpFJPHeaLT7JC!%gmiY(ns-%%?Q;ayQ1)EIQ!II zbj!C7PlTQ$G!4A6dloVze^KEaBdd#((Z>W2vsUbPzbQ)(tGr0fNKdQbzRk)=-?H+n zZ4lfqO2Bc58DuTG?SGTuYXt|t2P8}25;_D>?e?GE24^pS54=A@_=f=X6#$VPKeQTD{5(L68b2C4C8k7d z#2xPG@UA9X`d^8K9iAe;*<#+1k)WfLryPELP=t3L9 zZa?e3O{v(WYWXNV+Lev10T()$yuI3V;A>yAj@xObvk-9h<+2yfB^lJ*r zt8{Qu%5=knR&z`A>bG|rh#gVPn-&*+2|0{ir-gebRyG`|m%2Ufdl5ju`Dw2{Xg_10 ztZmG>4uJgYmMF1s(qhxY80c9WpH=Sybs9tw-ua%xY^4TITw9}Wv0cKp_D2oiH0myI z1;cx=xEj(I6`1v64M?9CpAVir&$lbWPA;?R9aI(9P`QbePN%IU@dw(Me)=4AmnDil z?sfm|ZKlh)7XX2V6H?@XWBm2#8~HK^zw_qB;&sPTGx$uIE~qj+4q%GHw-K6?Ez>Rr zHPe713v)1r>o*G-nLwA@J?_`~qjiSCSadQgQWATnT>lbrC{b0%oOS5IIaso z$)C;t!jwZYW&jdzdc_k60X1UIfcycgasKsJaKWOyfym{8wy5uM(&!3 zn={4@pDJ+Q>pxt{+zrLd?R!N|QSAfW4WE~wkr3f5*83y!^!<^Y0=<`;zXnhP*6%@T zYAkZhcf`P=K{X(yJRa!pX<;<#EC^CTbL7}zt5Pd1zsUGQOF^0om@ebqHV{O*pUnV ziC81*NDIDO@9F2E{hxB_?;P0IFHDCLO`BE=kY@$_?qlK%c>N8=RfO+J6n!%zLmg)~ zN*{+-KDc(>oh`a{-YszQnu>P^ZuMPl;hMBbKZ?!tk=~lPcFnlVm|X7Jc2IDX#0nSS zF9#^#Cv}@n$(*N!Xwve%H06Jo7OCWGzNHerT~nsB`0f*m=y?A3#WLu8Fd^0`c)3I~nhE`TiZ?v;8*bFz9g4Z-gW0J>grHQWpXa7fv%B)Kc@N}Q zpj<045g!Nv1lEX9U!(vp@2$3 zyX13?n7q?DvF5c4ucN;il*e%)sPmaq#+`|Myl((VJWC==) z3APU)6TE?=_k4cF-g@4822${M$P8tL2uYcNc2QSp?aQX`P)hPbwUJ+0zUQ0mtm_fc z9nWah!M6aNQ!4Q6VsC4t`xfrHe0wpeb$|G~wc1nRB~c`DNWjRZYU+7E=v{qqY4;S2 z+j)(=N4z5AeaNY&j-HxgMLN5ht%@QP+11WZ&`&leGe6W1UA*m( zs0{eg@8tPKESAc*xp=*9vRwC9$En)B1%5_G=cF;s&&~DBa7anAjr?uT&1q$j)r#{f zl3`>xmLl5r-9{9}D^Gsmu9&PL;|V}Yb}x@v>GqVejtAYXMJuxo$voeVYq68fF^T+c zD&gq7KGa{FUBR??JF+m%upVCYhIOo6zlPMLLahcvU6Bpk*nM_3_;5+FXCU^zdl2uk z8;hqsMC?R@qo{%PrG5(YRF4UnNX@)wK$8WTV&Pm+TR5tXcFTgZBim4~zrl>6-fXM) zI4yqjTVCijT(z|^eo(#A_SK#6u0$tKaS(-tUa#W&?^rM)(Fh}!G7;}f2xN*k9cnakD+`wgT_8p2^aUDW=ebgikgC?^dSroln{`ZelYIs7NPvZaMudA~T8J=5 zrblbJ0&=p1Fa%gnYRZPGz85CUSHteYe|}^+x1pE1?>i&@t<3<{XJ=M8Ei&#l{sNb^JJNMhAAxsqh9bXl)-oX8gkzY8aY4R_{GzoMioO&r*b9RxgDqQ)s#4 z*;0ry@$Jg9GN6MKv6-nPpr(AUOKALb2#{Yh%ZzfjFo*i#as-;BCBYe&RkO}yPb>8h z_bZVxhx`?QPPDE1-ZS&PY+gN+18O0a_6I}zCF@c&B|8`j(v(Kx82wS;+N5izqPx2H zLfRf45h*8+70ZwHuK@V^O5=Qh^EOW3!92{T+-QP~YO-oBdCKUxd{Cjs5s%TrsQ|&I2H=~CFcF6qzUn-whD!h8R z<|GCYSIC3AxFCI%b!v$qj!v~}#nMOZ30-njeq=f*aU`uX2xj%4}OW!kRz2BBD- zB5vpMPc;kd8pA4176fsZaaYNF{_BQiAqS{VjkI&AF7Lb>ZmK{aTm~V-CiHa?{2_qw z_foUEq;h2a=Hz7aW_bF?*v#NZANR+>-!76xZ!1cThF{sFpGh+rw|^g#{0S6@1IV_v znb~IjYK!?J|Ed-Lx{3z=LlpbuJT-2n!>KB}#d;QZUZo?hs6A3Lu8~32zr*z1T+^3| zu3pl5nlD36Ue==pUp;&)fK~Bh6$2^A7F1iqZ>-#%OO$yc^4b3C@6S0uiw*Pe$c=6}q zCnfP5IX!N-N&6rN(Lq?WVm^fW5pgQ7a(A%FnDLBILAYokzwWt&QT~-`9tWQ70_|&~ zhBfI`0br z^)BzitGyJp|JUBj6i+C#j`JC<8vDh0WDyGT#U2M=(7PU>w~aS<-yokq2K{3X|j#@MRIrodLBtxROv*q&BINldRKjah0NW4 zIHva#pr;`2cY0SQE9&azM?Cd2ZMG;XY_?t~W7X>`gvg2UAq&P@O+*buMA;i_r^~9F zy!?@e1hg6Llg?O)`+W?^D3$zroKjK-1_!y{DsnL>;vZY8azszJrOp35Sb!+x2z_aN zh~!JxpQB!_FG=b8=_v$XcIMV76?FZx(OQ{5-VpbUU*`oQ{$ZV|-5f1hxlHKhU5{*M z)st|)eh2z;LyOHx2dZlP3Ir>mE&Ng8-Ztz9uBIKfLQ;MoyE9-b-6gs#AW#TMRY6Yo zzHQa_dZJYMlQ;lT`E`H1Vs8Qpsjjq5bE}yC)fAsoaIVG<%`MqyU%22@q1l>VQ_FmA z>O8sgjTI9p2W}-EfUi8zREM}egkS<^lLePnmR5Cmtjj!3C`hbCV$wzk(01i}XO;Y1Kps({&{Tp_wPa#$jbV1|`akzRk4DHfuT z9zybTm$$@vpPINL3Ckx{YbK|cAtSHycD~hMz;ioWZUZEWLXd_b2F@KpHsV%B8H3r( z1Ymr6KJ_=!X0L zjo;lLe??-|>ki9@fze8|u!xujXkOviqgm3+qN==mr7qQ0XSVxc7ieFS}IG87u=I&y?WpG!_c z)0oUgFK+=ck&^X=mV23M> z^qo^v8x;#H6G)yzmz)}VE3=dA3a>AY0wspxzYur7vxCNOMl<^#5N{V9PfG0wf13DM(TV16Fxi?Da%K=YM62ib>|>hOmu#Rb~v;>c2~gTOsZzX>T>*>out(i`cA zJ@qlb*4z#!sI2|FYTa9%U=9#S5$*+KYiB5FMk3s+w^YtCZaHz$N9I;;1>BFS*z2pt zVCUq79pQuIr4B?bqz-@$ZC!{&w9Rxna&`AHmNfBL>|Eb<)1$^le!r01=RDNU%)Lcu zO&DitMSOHvr2iej!VtA1jVq1C=0xGQ|M%;RF{+Gz*Z%%pxNC4twnoLq>HTq69`r=6 z38L*wtcgVRAt)5LB?+Hyr3=2X(w>>IhrXkKUsrm?iwYL1bs@?1=N?2qpL)>P25Q|U z2PO_~kArI-Jd$`pudtw%Ai`uKs!+PvFcqcyo=>0;TDe;68W@HmCKS4pa-6$tmle-z ztI|(5L*4fYCeZK|O_}>|`SG0|3LIl6gs7#(3_9^_Xq72KRrX|VLJ)BYoMNMjbhlJ{ z!Q8~7rN9fgOlKmPIGK}Iw)ihY#Czh@GDe1jf{!s&((*|v6PqkwnJPo4^P@D46c%nD zZ#o+A9(0C$AGF4ebS0r>cLK>iMpv&bnt0Nfue2tKGs_oPW5{Wu2nn$%ZJ1F*n%J6! zCq@L4m+BmvnW>SmsUUQYRa&)OkS`0 zdk5NR&6;zbQHR7tey*O;r?N@W1rfef{0%#2Q77r$KyLhozuoHbSHb&0Sq;+DHdget z&H3Z29T7z+r>FOm-X0FuK$9iOHm&-0f;vU}{ZSvJ70VLhK+{wINDHvNNgfw9Nt@03g(;7 z*I)P+`4<+QeZ%WftGRXf;Q$LJ;qQ6V>D*9>HOod;;#M6$?vM;s7Oi2g?#e=|lS z=kia!w|$xPVi4+WN-VHX7RUYzMq;o%y0PLMBVW&D&3;m0EyVAkEL$SYR^(^cd759o z&HRHcA?U0#=NE%VL(m5|uG!xw=n%1({I)k2HK`Z=hx^ZU!)qgCSK>#1jB_!}({fO8 zQo&8&QdGd845i0nAW{<@KMFXTQ0mqzSq${KUZygTxmoZJKBs$r{2+vCfbD^$<6Bq# zOB|ywEloQaJc^^mNC7J~d7o=f$oi!^?sSK3F2cBKj1O{q6P=f}`ty5u>1o6Jy;>*3 zw1jf>aFm$FWhyK*IY!13>zKPTTs2UiLzu*Ik0|%7==kOHSYjnFfXJCT=dU+c9SCM- zvO7{eiwj`F!BPBnl`o5nrJ{x_Vub<9F~jgx?XOnoZ0bNm$hABreA+_z>?yK|x$9zbEBkxpwSb4& ztc{W1G1YzTv>wv55V>-{v9aOOmd6}>{q%nnorNRZ{~yOspBTq9-{E%JG{bIc+T_&f z>1NYyVtPzYo33NJ+jMu#VVddg-{*IK!R6=PpV#a8d^}Lgp-l3FCYKYTbf{)$caP7f zdhI7^Qv(}&Gwf5=-}9_f7x`_;Tz~gaYaU=^^J+0_VFd)CKW?Zz+4-6}YmtWH+#ynZ z_Gygndfy~hyX{eZvnbD?nPvfrjz+;W(Zf{n2>L=Q<&)GIkK>7s0J%Va_0zi8<2z8p z*+P)wn>XzCeC&)Es@4UGP>2O#1SH@maZZ+PUsm9R(U<+$In+3psG+uG)c!YMCR)RU z#O(lykNjM=K@$hDSn%a*xCy3m4p??3voN&nwuDo`LFgKZ^d>f)5Yl|pEv-y$jEpV! z{<9I^KVL`nG@@&}yS^!*U3-o<*VHZ!o^{PoOQ4mxys6~>PJIwmuYeE22oqlog9n1> z@n*HP1$H00*9UKgbq9WaCREu^j)aTVc~aBtZxU#Nf+?iir1=3y;n@PxueQ&VhM>Jg z`99~}CADrC4^h3X)|~C`tp5z3eJY6#Xo;2qx&e_IQ8#W3_P5U zL>Vj)ZB}+UIdlQG)c_~l?=!NEg;*?+Gy^dC`o_00>?eXv5YHCTFR{XHlhxm!m z_G=e!(}xVbId`okM)6>WXj{m44v7%%lUN%oS3c|_kZ7C#F@@OuN$VX^Ef4c(yX(PV z*3)j5VOzsl#p7nXoX8EocmYIqlHa0CJyn%DbYAAICuieJe8$j%ujB6tbx3(eHC1C@ z>#YCU)lgI;)in4oixxoIyhHoreQhk5Vc6!UnVcipx4q*VkO{Y<)T0Xf;B5zewgskp$UwSbu`mhGEvA z+Z6LMc(}cXjS>b_fM-6t`54*8J}!RI$r*1^)$qU)#|4ez+UjNVCO^`5?aRL$B78OU zKCwSc=tE7{{7cC#2v#@EEB%iNziQjuYT9KXk1D|8lZ?#e`E|ViReNIf!qa2>Q*NP3 z=9YC6@6McN3S|bhp7!Q)vpYaa^Zyl>w_7}x70^{tCr5Yptx7}AU#W?)lJ~`ii)u<2 zNQv2%+4=qI&cfj%aFg3NMN%s)O10eJX)8o)BMpX&0*!ue3rO3=NQLiqz2E+6$g|R) zWybzbMI4bZr4(~`X3b*8NQS2E>Sa*;(Zi~2OeUN-n`7*X=t?AG*32Vauey=<`f{%Q zlE{DkE%`WYhC2*Xl9U7jnJ6Nk&=4B7AI#;Wkvihb9INJf{r)sH&Jp2k5)LZR^tiu1 zIasQvgL^pn_{<*yV~tx6XH!#=4C;IYC8%byBCO!-@}D-3zw*`5&pHvTfRb`4n3B3Q zKnn_yxM?ZmZMU|pD~)V{tVfH}V=)8>jeT)ZAc(cG5y>J6G);qn`$?pN5s-n{zrv=g z9{e9wY4g%Y3f777XEU*QMsy>4Uk%@RgIjdUO=#aLDIQPTpeMcPGGchX+djVTY{G`Y zoejn%2{O@$BBe;?kk{9|ZVFiC2**yE)GjaTyL;MI@prkJQsKW7)o*Ix@pw8&yKpJf zr*HQJ#@gTNW`9BME>7Wy#s@~@u%9C_J32*gG64Jp0voC zMG6ErQy4Et{;63g!iA{oEFN;eZoD#-lgzdD>3ON6Evgq>M3g2Igb8kaF)6Z5fzG0WLGub{YJ)Kib4dQf6m=(kiV_7514l<+C&rma3AN^hJ z_q&u0l#k$Er}0Gom!l(T!8!>u9`N!K1(5IR;LW4)ucpf48sEBlcMq2w`^7^S3ki|^ zG+9~i{j?=jZU3{}tSFiFk&%(;L{ZU{+46E#$)x$7)OnVAU3MvB2>Dt7R4N)n?R_Ow zi%pA++G*Vrc1lxmrY%Ya%8xHp$@05gumsQ}KSnG7E6m(J@AXLZ1-o{+U0H>my|`3- zm5ry$Td|84tqXSCq6+POGr|`jIaZ6}eG!|zuZ$dl!;JDDS+jdr3?T0*2R?N7_elD=dS>=awI2A zBRH?XT6h?l-#SRjTsbSNTl{0jOPrS{DiQ=S(6{$dPb5@(r+iPsj7DZmFbNYW29p1) z(Mhn&UwwTaM0hdqcoym|>iu|(dW`p`c&+`$v#xS6i}oNUhDcERwh!k{h8WLd%zV>^ z0v+Qe7GxqoDgvz2g9Bj@M{4}bQ!e&*s#$LnYBY+gqMCjjtj^cSi5izRLv(TYkM& zSRC#$yo-8AE1sZZXmL2IcJ}PyE6uK+P5FO}>XfO1vE1HVw2!NFPq{-Bi!p~lq($r| ztHP-DzVkIoY~HtAwe9S{F-en^_7q08*2E@Yl3D-_$orA+W*A#D0T}&CUDGLS7F8$g zy&4fUe?+a&OF+DAT)=yhvr|n)gdJuk2KBo9w{UXusd@SE;ts*i4E;DBK`O2p3C_dC z>p)HL51higRgT1-hT3mS2WR#vxSlqqn$1D+7MyaWOIhzDTc$iO|J@7@;^9#2MfhU< z6l6(NeK}nX6^hA=<6z83faLdK#TdZUY_mmaQmekOhBe|dZyGE`4KqG|{m%~o$ofLm z+a%y=?5Xbw<8k0h>^%~N`qN)sGdJ+8!%D<{`<0PMt^giobVN3%?e-pg?32Uzh*GiB zt}?j&k12iEiANkv-b6`?#PcW%P%*y9_~Uh#VfY3M)c32o`DuVT3+{Ek17OCWB*?D% zx;jpSCbK9iC7IArZvX{LdyXwF%wAB%k4^UWI zkN;jb3qv4g7IkgocU{WHZ9}AN+TM$UJ8_tx`eMxXjcT}I2DH`du|+hS6Mdd$G;0oP`Ye>v=LTMpAqJxDlH3WX zv8mD0X}MaYgnkwc3jm;#KY}Wo%5Ar4p=|2lzpe4BPcu*FvVAzevmW}MG#MS&fdt&WmVj1TOAP{)z^O?UgkLy^) z`oh2aV;Wm}XAoghv@*)n9lz@_Z(9re(jNQ@mr-IuHP*M={x{l&tE)R^rnYxZLXzqt z@)<IzJ<1O;E~9%!WkJ+w_vJbKT} z=RdDrNR{!-Qr7A>AQ~n!6wG}zWpn8-x(MxXJMTUx^nA!a67D$`m~go{$=F9^aUSGp z)TE+GLa{!*-uro)T{F{bWzQ7<36Ugk^X?evXz4CF)F%Mz-?{QFt7o0xAmT6~x)x>_ zG9etjlm94j9m*3)H5d79B+EUrEh_C^`&{=2M)J!2MuldTM>IKm?QLmH*1^xopu|oO zxXX-7emvvO^P;Tfn~m+2r=h~E2ZG2o`k&?4n?t+DR-Zrf3k!4h=9c^jX|kX*uYmpX zNa`TTV;I9z1y@0~Au<-EGQ|8$;pGnWJp{Bck4w%drfOi7Ji^qLo}HGzwiZf_Sku)ZtLd8$=&S%$NI8smd+$t+3UUC`dS8PK)aubhdJTt`Mxba)OKqj54rP9 zjCtLVnZNet_23nLVdv?0CV7q*!>tl&u-8guP)t&3aWDxShnZGilRCd_qLSJSDgV5* z7GTVIyJ~8guk9^b)wZ=Ark|B_T2ur0iZ;K4R3ZshUk{J*{mVci=MB?8AIAd~A2ln& zhEY0-3iur!TDfn;X)>bsqem1i zk9xIAlqOmpD6a*|s}ue#*@x(`o{o}Du?7w^<*Jg=ls@P=8h9VgMqfED`&=F9Jt*Jp zX%*Istcs6i9`TB6z8M4M*~O*6B&1yrFpm%F9c!1Co9o4DBSa9l7yswSn$)M!&0VT@6l?JJhrihNY^$uCIJyGjj2_nB zxy#niStX}+X>uixKkes-O~QB!W7ZPs~LAD?}{r z)kwfFRr*Uj=Mls*g1p?e`CEu^7FcfWBpZ{h^VenT_Ybtg8!K}Gw}U}nr1ZFA^KiqQ zH}jIy68@~MHv@wtpX1f3lWH8eFmD@oTkvP{k_9t(No1F%`7t3BN{SnhZb?Tik<`(_ z@drkWnIjGkfcasg(?g%P8+Sr_ye~6t$6RA4XEyEBmB0R^ELCON;rko^uno)&@qs(s zYCv0<8&f9;kartWbe;#sxPmQIz~5QLl1blYgj!8sK9a4HhD+d zw)2lm!^+SybFU@7S5_@pI+!d+t*0~j_w-yM6MrxsBTvclU`bWKx^2yAdHFsb8Yu&V zO@8n@MB@5HzpnGi-;nrt2I!?%E5A}*yqlAfjq}wX@dRoaJj0P&%L!X=iV+$2>162h!cn__RA@%`oWl z=Akt=NbJVwaeZ|5vX9QU%gX1CcHmLU9+5pY>bTs}R$U#x-RKMeFOYNlXdoQH)C6^qej-Yf3|%#~&im~% zN+}^s@yQ74aDHLSh2vxqlQkuf(RaNz-QAOXSCG-;6$$!|#?4>5;)Ze?QzUOVC@RuK zgdH7YCy%`0X$RPG#kkegM`>}Op-uL9XdASDdM+pCd1=R=l0mB^pOOe%6kUSDFpFvw z$^;f07B!_qHWGoqMFR*jK_L+e!lO0((sF(A-?qhQ|4jqm=NAnbpqSp=$3bHe5ze83 zt!&L0BES=qHQOC@^7vtWsNCee#@m$WzLzJ4tdlbMfw8HMz2C7U#zTG#^enH_QUu$gG|1%qKFx zqHS!()?0Xmw=0+-?(SugVctoJy=8I3q;L#c5CG;h-GV74&X%WJ+w+!2L$`xUby#Qi zYM9q2Zf|=>_UH6G7x(M3;GRu&m9>?v)q*>uXe3zjscZr36GbZry}G_Ztamm`hL(it zgM4$N%*Eyb@z%!K4y9;5PN1XT7|f}p#BGL5OkWX_=TIIT=TR!#a8gjOALg2MtI*!9 z5Rrs9Wvn=wyE-5HK3s945hHGS?fY5!RwK`rlfS=x?bBiH(2CEtmjwd@Hz<$6>X;xt z_vCuV$#)zhL#Xq_Y;pgB>eJDxs$RzSD^kzppAZQKG zy>eN8M}h+?UxPrd270z!`Ym!1*g;{oVZrUCa6{E{%9J zZf;w96Q`n}1kJbXgC}J^b^b2=v?CTDU>uPtU`L?HQ${e!-|BXu(46?@s776;6!?1b z@Zf=^0&!x87v0!j=LumR>1P)7S{)f2?9B_Fp{D-&W<(daXA)c}rr*Ky(9%n(+HbgG zI~QDbBG+;|S==rF?F}uEox|RG%$kxY4?O*!q6mVQeFP}$?TXWA`E(+C^ zX(BRl+uT|$1%Z38F)o@gaMHXkNo3k*2Z%)(l!=JtK@!t*JCRqBQ28>YGBA7o;=!yL zFBM@Z;DZCOsr8oxo$Z&H4BiKh*{8KQm}jo*1O|8Lq$8s-b|K=&G4Sze&t~xx%v09 z=&K++z|9Hti)d^ z#f^V0{<=z|Nn^mI>pD5XQn4!Pd$Xj++y@{DhCH8EJGF16hs+$kK(I{NR$*VUXC%lQ1^M(sR*Jk{hY z22{nk)`k1-KbB^veyi774A%gnRux~zjvTH?QeHHz{<$v7B#>84iRx#I27hU^z$JiS zFu%J8fk;5u_qNs2bmf_{F5o9~Ra)e9(42lEmhf>#+;cUJ zwO5_B_?ceW0GlP8Y3J*o=-l|#6d$Fn5_p*yAm}fMRJ86|6)D`y4V&g2>I2#;! z-M5Pm9@6TnuBgja)9TaP&uD~w-S(Jb|eh@39%K78=LE7Bw zJ6!bD?CsXEYBPKL&DEV%WB=D(yuHo+GPd2U<88qg9%t)E~GT^OMO=lAmk3r4uVZZ9DQZ0*dz^LcMndn+k7gVuRdxM}#Nu-JMZ#fT)1_)+8_WK3Yf$cb zyjycM@DP;);-wziTUtSt^k^M&1|+FD=QDO9DWmG8-nO>MdiEel{ys!?BA!{L?(>0g%L@hEa8Q6Eka!`vu9e$k0)Q=Tg0P>gP9_5E31VmWrz+^R{xkIszzHoJ(G zLarIM*CvT?S{PF9#jp4=%xf{S#Br)Xj-(Xq3zpW*w@x)Lu4SqYr(lBN>VJhQR=F*n z{|=ah*#Tz=eo-R8GB8READ5acJn9(OliDCbkz=cn#KfJLKTf92dab@?hC=~o-lK9nN~j6t$3wN)`#<2 zkWaE@lvd*GaoGlRtz5&%f2FZ3;rLIZ_V;Q9he2cz`#If@pg1{ zZ{=|$9>-mD zB=QL<5K;Yiae)P+X2A+*x*W?Adm2y?`?I{<3|!eaBbTI!7gHp=Iv+Iu%5m#l9y*U_-ckK=j`wVRi*(8qh#c|H!wWm1{3Qq8AT-c6GhjF)Nzl zKe`B&#$}S`EOK zYLw7;vmKJ68dU&OlZW<(O?;CpBQt%=%G?#U$Yc$0wn^l%y57?hkNjW`@4Pnq$*t%V z%~$Fn$rG&0icVmd{+t|1d|ROFxORN)#QRE+%ZM(C;iy765|4oempZ*uoIU^|hbtbm zoV8N_TlV=c!`ra&^JKA&nzvsS+wmi}Ch+_Ab6D|Id&IeFJ=1hkb1gYX+;P8%xUYB*$0VFK0taX?#D2q4Kk~!>IQoB9u9?F!wT<@mfMrRGZOud{*G$BQBlubYCNc$ z?4gz<{^l(wgDI)2tgO6?aYpmvsBt?aVO-xX7y_a7=BG{|42UGc;l}4K{vz?P!%XMq z)tWdnv+{80?!6pLiVGrPF$Lku<;r8QXf;_J2goOFBa_s7I>X)BTkF35dODu~c3Z&q z{}#EiWaNF7^)&aSiuH>{t5l~_k%T5A&_y5vu!H4mAT&Vphc3j~EO_FiYfXgE>{?;C zNMrRAe0uY;*GqF$X5D&o?~dpNlV@EgoHfG1V#_%Dcbm#qz=5`1jNc9RHbwfHfY^+e zyr28-@7|){j+oZh>q94Z|1f-R=O}hKI{6Y&e26XhoR24sZ$UoZFP)G7y@Oa-h{M!j z(d*9`5^Cv9lJ@A2S385euMS&X5BBIDAI0o85v4Peq;H4Q_Uj`c9S}FbSh4K5ZJoNM zMS~j_cIF~4E~g_-lB;vPa5#{mBDU5v{Ki1MsiAdw_ZjKnWpC=DuH)wJ+M{2lr7e3a z;4040bS-kttOfnzz()gkE=7IJ+cZi-Mx{944Gq*il)BD@UtO>u_*6``un0G#<&7I# zznd={9y(Oa(J5QzUwNWLsK1rl*Ocbsh+P{!jw~g+mrQJ|4#dA-_{^`Q#O^`&dlW+f zLWn8RBFQachD=0JxEf5mB1UbFGMqEt9q9K6VQ&XjsLivPli54k z!L;hD;Yu74K;MKkq{627UE$P$o5)mEI%#zW!)eb;cPg~+q=6=?)v2F&eYY1^t$Z3X zD@bRq9Ut#i+8<(`mL5(ttfOg{Hgubpjz4O^8M%U4cj@;;== zGg+zI_Al6z)A%EQyoe4;^{Ka)oyxFzPyYs?foG|1KQcLFs&_3 z08pt~yOZ5z$J8FYRQRDtwVKbkJjt1QYkRMLLP4u$mL~*>G56&=KfMQ9?$5;TvYy0zYo#t}ZLLUevw66;#CVY5 zlIPez`vTw9^#NRvPVV;%HFcFjSDxJsYj&PN?c$#&$Cwf&C2*?fFe_(gXJ31)hM)Zz z==$3Qj1fr|#}r8K_QmxX#eKywSAA*U)f<^-TaP{!WcQAPzlJ!HwYM_P#tM;za|SOu z)unAdol#Tv{}quAAeIEnPmbrD!B-X*+q^dSMz?zZ)`$jM&AmIza7``P-``hz{qDIr zJ9}5=mb5iF{YMh=FQ2vCnhu6j4@NF%<|^{7FMZs(26Vdz&QS*{h4ClZb9z8a!+p`) z+xus^o8VkfKz0@4MR4Z90Uhm&1k;&Ob>XqVNT)XW6Gks%N0WZoy@i}g zQ{3z|(9&O@%_Xh57!M*<#BQxzTzuBM66qfP#Sb{mD_1Sf2)@=tbnAbJ!ZmR@rSF8j z*CmaUlrZZN!KC=}Zzr#4|C8GL|KCw*j%o_rfd--9CBHxH$ zu|qy5hI>EQh<{RMQh!gJl10#rfUy@eLoC`+j?cSVw^gR2hvZY;ntbQ3Jd^l>cm#*+ zHJNLSyU$r*21We?NW#&~HaP^MAq;T&xdL;$V1-%$NnsoVprwqFN-sAbFiQhDCB zC->=EXgZs)j!os1MNfKW3NcrXo5$@qNgFI@ByzSX0d8Ie>o75|vp$xuq+`bm2hILx z^(${gL_O~SEUWL)gF^)oXt~Y}Z3y(`Z7`(qDD~H0CIv7zv^Cb7!~GBvuo;E=kmvMj z3HsX}f@bqt9ZU;WJ$FOg?*s>+OZz3gO8R- z1ps6Euj{RFSXP?|x{lVKo*&d#kYVAkPHi`b_I10xQ8^IAB?`?w+sE*$<@@Wp*=7Fw zEdPiXjca-ki)EPNZ&xEQPUjb~uH`-O`SG9QrO1`o?PHLU&*`$G-~LHZXbc_v4`tb? z#RpX#jr{fT^mwRhJtEKYpPY3Dj6hxE!c2r_%)hWrc%Ab#zI$(A&5wQg=*pWtNP=0h+`(}V?p}>ho6!XtC}>~g{rsD9YWde{L-E`U9b+?h&UKu1!Z6UlP-+ac7XZ8enQ8kXp@1 zex5O{TfMZj12-JdyV#QQv>*MkuxNsxP9Kh=viS)a_U2jgI#7*^bIP{%$Y%`TYNq@I zNvR_rgJ$E&Y4!Sey=NfRq)uuU#Ul_?JkNI#DndPgJTmqINZi#leR@C^j%AKmR0Co( zpef!mV?+EgHHGiFzqR=t{5w7zx!)r&45`z*S=>`7oNDyi9K4*R#wV3F&;rrR*hW*K z_j%pXde&PJw)KB9l7qgEA>^>qcP3#ItZR`#2VrBIRW3@=4Oe|_wQNpw9?OISas1Gr z*SZcrqCmb%%wcgKU2_Q*QH0TML&u!pJw znueA}p_i4-{2}cM-fd%V&bm5$h+Cz^#YyQw{G#=Fe-8(|E2g(!(Q=ImcVfr5$P7~$ z4_Nqk=0*)oXkenhKL0k@TvSa$)#?nD%|+kAp#675JW*?_t>i#%zWu|juN#LD#ZHzr zX))}(+F_S7cm2m99YhAE=ay`r^K5I@zH{>MxV|2k0+4rv*ccRMM?gAZhea_iw>v15 z=rE=)*P+n)W>VVpy^X|y9kRS^e)WF8jzu-+{8@Muxr9OwSHH`@B1hOn(nQK{)tIoSG8 z2r~di4@Jv%`a+^a5>X{0O7-Gd=v37u0b>>$Q!F-&M0`xg8;vQiS4xFJhT+4Kf|QOB zcj$K_X76tAu~59#iQaW!SFN*z5}scX6Q*(nzB@_D)hXmAgdDU|vD6>%iP$#4Oj(|Cy_sQ%WfM7v0;SZ34VwR=WJ>K+ewi~10Ps;DnO1a&#bmTaA>%w#s zir338hF^M>j6(w&xIwbyh=6~}O7GJIks9$o8Fdb>)Jvb|a@m#Hm0fD-SywEffsSaT zSAHO&*3nVMo~ z)r@x;^+)HaTg*w6GL1Xvib3AaVD9^4c~nmSXS5R(j^SVbku_Px9P!T)@;1HO8kMey zCe8TMVOn@KWOXvsqBoJN0WH5lF1 zp#eyVH{{tF6k{g#uwe;Me;Hm|<+x}*$ynho@boOm?lj*KELM^2-pL zX0xzCZR+(--UtM#nSnvE2oJ(vT5@^O>XeM2RA#LX7NlIj!|oQeOA(C56Wjp`O4N+6 z`xctpIjGCtjd(`EWpFdpem{gm^g<`sKobi)|5>&IhsPKG5O{6qOaCW8Rbm+t7*VAVd+UohkHo?z#ty^g{ZrPTQ}&iB(~eN&x6_L8jQv8^(|w`*58s0= zWR~C2-Gy0GYvswt?(=+CH8Ne>0&I0bS?rhG+$7X`*gupk`nuzR52E-vw(5L;1v-e0 zF$^sLp%0$=by9?EbLqxu+o~bP8vKvPJ7Mib2&le#a=q-@}IHzvm(%sj+fq~YjdRZZ7yGL zzka-^ZCMM!4&gv1g^`f+H!*7d>z{&uc>QKX(~tpR#EG*+DKVI%!pT72ffFGRq^kF3 z#YBq~2c^;2{$04~;80+fQdb}r(2YC8#qJ1{3d00TZTLE&*z=>*LD`@Lb%#T-cc1V# z--0NS0u1Ov+XFk4sz?c|&9t;Mb4@RkRh`~05ao1tMET$%hG`x%7Hci z5Y?(E1@NI)fZ;WX8WWHrK9jX$eI?Q1(98%T@7FuP@Sr1Avq0;FFra}WEs1DHe)2dB zD!<`yURw2BLVlFzIOR!yO-fAR(&b6@gQ6Qo&(JWK_{4N+MOtgLUs4~l_4CCEK$W zEDLM~r0IQR|3G7jzIZ^+57*}9#6+?!<7dC+N#J822S{8?w)mI_Yxtu-R(DXZvVzD# zpB!3swKNOs-zC*n_PrggD?vdJwT8aBDLCdPx{D>O%khsp(0 z+hbY4Dc%Bs+IL}^X>5Gj7HJF4+AQ53D7C7ENe+uuT7?4_Y$+6rRZf(2B*UNf_~g*L#NkfF1)l9%9H_M30q?D@E67g zC#GhR-_=}NBZ;_w~rE290?PhLLJ4+ZSep3Dz5yyiAg+h;f!JuqO zFzHJibqw$Z)+zD&;B!f1q-hQl)S_7OD@bO4QGXDYn0Y_Kg zSB|xVC9}G7Xk~$&#^d`Jdrd$gOjl7#Q`6qTAtDTr%kQ^VlqlFPJD8tasLYv^4OWfo zdXvNK1&E8+tOV2K3zs59ylCM#IK#mKdFb>QQjO~}N|5hPH=ghelOeXDs`F$lZcG^s z-QUttQGzv_EyH#tDExM9{`LC~>dQjef z_-K?!o9&h>@vkpAnj7C##Np|h1o_vh>txZWVs+qzTL@`t3U3QtE7zx4A~G#0_j4HN zbF|L)`eC=SP3GG5R7nX*DF_m_F%2QWq#t^YJ^!Xy?B=|B@Mgly>j?D# zQ;JrKdA880%T@V8&Wg2Uk$Bv_bS->;t)3DAGZ_E>2#f3LJ41heS1)S`f<9ykii1+(GSFok#1{-@Z9mUv6#ic?mK(e&)^$W-+%boMC#6 z@;znIi04pgJ0p7B7kgUp?XFE)4WU@uU|%M9;!R~3N=03N?r;Q2N9L5be0yGBhTt*k zQBHi9jHf>0B{|W7(wy#NDkNNqTRwv!LdyU(%9vCDlf6a{^K|1s$ zxvEBxoEBWhzoH4WDRDddT*Z&`QtT@BfHEXuv7?*N+k4Q1%8f3erT>O}cpEQ~79&k|1ex zl{IGsD{Jw;7d_v)={+ghbB|vR!X>`AyYbLfVp``=nu5KG=n~c@ueKb^G`Ifz(bC)A zUI6cch@F1`~v~0eMUm!?So*Jgam&?0w5xGF= z+1AdY?pEPY%%f9y^{m&CcpmXAQCA=WWwAA36&wbPc$OU~K!k*Zf1P?>DH41c{+VbA zY#Mrh%sWl$Qb-d&kQknUr_!!evCwuRt+W(HlVM*PFk=H2zkIfO%iqI@uY89HExA2D zx!%nfsT&+ve%RS267|GHYx#vk*st6`h;o*jEMwb)+gn#vpA5&<4vNx6`(I!0hM#2y zY3W*zpmTZ<^9UB(&P^9Ufb0`Xe83eVRoU_bnw*{bOuk@h3Ld#*h`KAN@|NG@#mHqespN z1_;Gf978#Kmy75E(5$Gh@^KrUr6o4xxC~bIKF0Yj#=te4GTz)1lKH;Svzbh?sAQ2+ zQ3}ltyC-a(&2QL7_6$9?e*;_Gs|b;p@%q@!LZ+fkO5Q$@z(WA(0~E6S%+;9H+77C zoUSeHJ7fC5lRTD)g{|I_QUi7#ATG$r0JGjQi2poXdNU4k084^0gM#wZGUKH21%7e- z4LOrw4^U2p$$_kp-K?c0Wj(m;-unTho#k`WPsnV z3WY+BG%X|4^gYMfmNoSd;gEzkgCePKz&a;@w|N%YJzz)8qmw(q;xRVtT#H@jYt20tz6PmsdxqR_$gsd39T)vjE#^pd|GsX-fKHUV7AClX4XBzBkSk z7w{_?d{-)*LLgq9Y9mPz(O^UpmFeHZFJV$ZpwuXBcx^IW7E^MgKjWCQUgj>RY{2s@@HF@WcPuBI)ce7FCY?s(`!Z+F4L=@2_kk zMW@U5rS)2tm3iZ&ehs_N6X2vugPFleU?@xWnHw*V-IvA3>41X~sju04;AsN<^(xTh zvT6z{#zQ0x5^K+_Q$K--Vdm)g7_q#STlAe6(jPyiYCetzF;^pQ9!F?`2=mD!6!xeg zJW8+7qk7-rb~1;nzcnT0w#p~V+$0+;j^ocb6Qzmv+{oi)mX9k);iU}crx%Y1mScBa zY)P+ZWvkSUF&?kUbD_GkTbPUZ*|5oLYF;#Q__RZ(| zbOZ_@FKu&Re8ibt<(&cpDGr!zRWdaD^r_;Q&EcGbpZPQG>>bJ-?f$eq0C$p`M)#|- zV%HffH=~Pt#?Gd1HB-TFe}NV$bEW^fv7)B9>Ro`|N-G^n%4rA_A+05>x*4(VbZu}Y; zv~W{Z7Aq&Pq=jVheB79bmnE{SmP9lI)dwF+!cat#@X?Q;h!_sOK$b3LheBqY&c=fa zfTi>XkyNXT^lL|Uu4EAo4albgc``AkW&#!k`8Y~blV@xWDW*CPB-MYDMO9P7B*O5p zph+(nt>T(~Y%Ef&f2>HHt6o^gx$4XPXyb)02dQ<;dB=JUo)SzA3zlHkQdNlOp8=4plmzAW z&q>GyaD!PS$L=?be^6If-eeLo{^|>uO@%8KlM~j;h$DS8@w2ONLv4674vr2MQS0nR zPoqR)-X@%e6JccRw(tMb>A$xu*p8B#*d+bC^*Pf*u6=2e8mOhp9nTi^{DA0ZrmU~4 z&DuvZPYswgRsD~mvy5uGVZ-Sb`mQ5l_?_LTU!FOmoW050J~qM&#q8-IE_YIER9pWv80 z^;|ZELc%gYqje*ILI(~8o7F`h)Y@7FfO)OCs7?2OO}pr%%nuLC>CRi~TD4-L7auDTwZgsWVX#qCfbBFp{A?Z7Ze^#E(|OOa=g9-^t5O&pp}y@pl%P^X>$F8ECsxPTguAnp*gR~M~N3VL(E~Y=P8UT=2$22 z#`%#JL(mj}>v=)^qr(qU(|@k}wz^t+_PYj#i?jsj7HxAPqcikCz^;KB3`&iO+Mtk_ zqZq#FUuR{)Z+;n|vxgQXtJ4y|6XmRRiAqzmB`eoe5~S=YUOnh6A$bYYQRV|`mJ$XH zT-md;>GP+jwMWbw6jj@Tx8m^Nyms}?q-VXB?17DNG?%v$owD3lWw=DS0fR<$(k54FP@5~4fE$v)%tQwg(7{w29Vtu|Be)mn(S0Lm6 z{jFbn_D!~6SWQb?`^VdV!(3s>%7Kpu1@v+ey_+sVtRiF4++ozTEzC*cxQ&$t>Ve@s zXq6&jW^EWfG8xhU9f={B@}~%zL09g;o8J?WC<58AjhQ2X6v@}TT!;*=$}F3<3|1~C zeL+B1Vy-}@q8#7v09>|UK@c(|zdAcF3H6V`fZsvHb>DOG^z7BQLqGKKR)18C(^}Xo zu@dLi(sjgkL0Bl#)?f7GS7HDCce`gIg3>WJvl|XqCszX5a-vEFQ=V_JiDyycnD`-8>@ zxUXCK6PPIkJZHG)4-Gj(+jP4pg&vU?2xwnsd^_XIQ#e=trcNgTfOUmfCbCGowVsZb zUoA`MY9iXuXeU%nW|*^i!UnQ?D#6;V$6wK# zyJ%4;3QQE7eAk-l`S)_Y{p1Z^&0NK`pRQeDA}R3ALWfIjYO9wEOFd`zx z0QwYQ3<6EbnWeW>ftl#TFFbu_B{A}eNjZw1ldRgIzr;vB;eGO?de1)UYHt4cuH$YT zg+m%GZX6&zBEIP+1!p%CbLpC$j~2 zb*M+(QyNix{DB=U*4~=E*X6X%U)o<`@I~?u9Uj*bZn5yf?{ zsKbM8)M1f{(;5JnDI0~Hiq;IUT%T4?+&x;YKFc_%id2O@7RVaGA4lpuf)2FDU?+7i|&*EkV{ zi2d{nJSC>;xaoFYUkb>!)XnviFHH|+R3Hz03%p9koJj3@aZmXb7$)woshfwf+I_uK zSbuF2i9<`Th#Axq~KA+O;eCOJKxsIA>mDmZl7>mvqW>C zPf=F!V`#4~7tpEzx4H&=Sb)RL0TpB zXlNl4$13^>l^VDL!eYkNX|Xd#AF&);0%(x34h6$$#-cbWhQE6ICC*y#)Q1+pgI{B`y}8`o8Py0u2-?FRjI#tcnXAm(Ul zX$iWyZgpNa&^25!FqY`6VFNaqE2S{XGvlKQdq7L8*xOP4(~d=_Mv4E^ho)@=^bM=Y z9#%goC2XLxMV+v@L$+kPeW)_Vkv4Hqgk>MLnS~?}YG-?7ik`zH9o9!Z7E%YwH0qJg zGVK8auz}R3ta41U!ozFrA1^}j*LbjV0|!^MIV9aavY}ercySOdd(@u+`g=F-@taO-yUGrZ9FVcwjoX*)bT5TRi!1gZx0*<9Q#Os#ettwh#6$q>~x zKmTeV1K8~z+ERGYG%u8=+-2dfedZ~{bMde~yYi}h{zrTh_;2=eVQ=188R;1HTu7xQc7=2XGP5CHsh2gU8A1uJ!C+(K<)PedGI=#@#D3|E z`u*+vl8=PRNa&8xDHzVR0b~VNeC_b?Idl$sLO6wbciLkMgVq$T*L7*rJ2F*@2{Nc6V#3b$aCeIGddcm zHB*m?=SyzfN~hGb3=*XGO0Hpkc;h!5+%`ag!w z85Q1qI6_5rl1)y9i_sof8E|nw?}>)G`BYTgw@)0%TU+}b`mH~kswHW?LdCqH?Ba*^ zrLXN-?OEjtEnQu`1w`s}tzZk5arx3@(->C9twJE@BzPX>>HCL`*QdrEu7cI+FK|O_ z-jl`Ym6KObOJt^20RXXrHLJH z&*8g{i&c6#lmc5kqdX=xQS0IS!ce@qsva6vRNDi_JXIsjDwIokK}40mx=;J#X(SyP ztMX~2gz|DRu`k7=JUP%*Fsd~r!V~yAKJmZMFeR&ioyB2MZWYWGG7)eR@ zSrS3^Cx?fw0hi?4e;&n~rM)?cPXq5dKCS=rO#z}M6@+d4XAh?UOEb@eiGzB&Tf5*F z{J4`haN`PA^H{Tprpv*cA@XwD^jcdqc}FwHOPm>{&DU^54O?jmZ7zLvg_U`19Gfkz zRW@Bh*v?-`w4yNO(@gnS;W@cMnd;eKU`flu0*SfMs#ELYYO}ZL!|(8z4_n^??;Ql( z^5lG6yv@q-);#od&Bn4GZt|9!ZZ>-+v?>=5J%vh3OBsh_HIG366D>5%hJ|RP8<0K+ ztoEM;k*PTDU%SFb9KW^y;MyDg4|ehbVE|srZzOsD*sSi*a}< z%6)~313)o_ZPR65uNwb{Pq_2;>Ob&%ELIcqaSLzPy3WskyjvQ-6}>f%m4?(4nOfL_ ziO2y&P7NV|d>AHb7K#jKdg+nGFEy1uL!ZVv!Mnf&rX_%=LZuAzmW6AgDg*Y@VqelI z#*E-_Cg6~R2yL-Y7HBq;^le#FE!cogfrCo{zQikm2x0t_H}5Jc8ZK0s-Pdf&zsBp* zHE*D!+l^Y_3=SnQHjq%f|95Hq7#Gu<*k0GJn_5ug$YIl2wQ}v{E4AyErY*S3_YO-p z-JsdMdS%#6@72R< zvc$W0Li<-1P7$@L*4FrJ0C_UY%vsN!-SWu4aHm>-4uBMiM6n#f?|h-r+^kY6ObqW$ zkr|uEc2{pgv!kKD{|3njfcXmpzY0A$(+DjMTd7sG{J9B8HcyN|!HiK#vDIYSe#ctb z*AI{L^)Dw4nm0%Q^Cme^#BlL;L&LtekaX71GCpz&C#Q-PUgw+H`TDE2m7ssO!*yj^ z80}7#sr2_7w*u8ID~`1{7*MRkmJ0ZiRztFS<9bj-5O4Mb1}p1v1)pzevSn$zXNoSc z*siFC$5kUHRQh-F3VqZ=l+|k*b;1Iq)Zm*;ztjUAx70g`f@EMIMbb&~Is*V~q(_Pp zQ*GF5g~{2$B*1FH*3}&Fg4h|i%p3p8Fp_hJ-EH=4QI%>(tTi558G>ZDU};*20kccC zZXXGuV7jI5Cz(85HI{s8W%p|R4NJT|4eg$bX6%OBLg(q8;281|N-JnYB& zPx9WrOz(9syF*p-OB}^7q&ljyQ@-LfGPsCXmTPex|IU@>hjY{prC4a~umCHShl+ai zFSgH#LMU78XoUrI>H`dIGMW~k6G{S5g-nx_#>MH^E#C>Sp;e#cKw1qAOZE@sg>a zpfs&2wQQ$X_g(dcIj?&-wuw+;u#%dNkB5$L1jr|45}Bbc9)$LK)sqTpGOS%^+w{wQ_7q&zaiYt+QuD-l8?+cz z$Udv?A4YdE{9Cut;ej9Vvc-(8H8%hN(N?cX;iCG324T4bPRu-ylwBHd4ndA}Ybz#Z zWU!!|x}#zO{ZC$ZH7P4;z6>HJ%AfNdMt(B6H6`|wBRY<=x$5l_pJ+=%pGKCKy}216 z8DAwhPTiM3d>Cx+&RKO*DXdN0%JXFXrc`L#x#C!_U&^Y@ag5uNwd7v2eAqP1B=?^& zYV!jc>TgwMRhs!fiLwAuHllTZ9Gkh-r`ot0EwYjN`K!B50nI3&i)9?ZCvLbXt;@~B zY?)}$4VebaY$Lf+n|#7f1&`zsLolQ`b?35Q4AyLvPmFTKiOr0f zq;cRDaI{f7{mxg@ahf1VoEzfR*;&Iz%)@-X0dipUwj+7N!!G1uE1IpdwyErAWp!(0 z=5YK#BhGow{o{S09|-0cAI zs6}T8Lh`ITaiDmMXq}B(iu1er!4V7Rx;p_5HaeCK^kq&IA@F_~ik(B8l+$K|!K$bF z*=~IKN7yju4?wKCf(gx@=gJ`Fq?d2``IA%Ud|}<6HfsxUCoOR;I5HiqYWrVp({g1+ zndrZM>q-2PK$Xupl}uQ)^2`PQi66In0qNQ#!w7A)7nuw4$K1Kqgt!=)3v1^XWl%L8 z3lb0bN%q=b)*&|uTL{u}?rqR&;vh2uX3l6_?Uq>HN8Bzo$pUz-{wNCRQaQADKGdzs zU+^aX7J$mgmU4p`BVfS!hX<9$wPydZ0?ylfJZcyl7C{P#PeKU} zQMU;13Ih%UbHe7T@#f4xFA91Rsu*2Eg1PvEUIG6|&Kk^x!N7(gTEy<#yl-?dLp;r$ zgQ3_G9P&6ih)-4-V7jJgYq(pSN5RgxbA3YxDTu9m!j}r2B&o5|$bCZaTBf@xwppdhSe~__W4sh} z?d|G%E8KY(=Nz;Zpg;hZO>noat>n8~PPHVA>w{8HZ1&g1{^Xqbva1WGDH&(`N`HP~ zX5Dtn_7{6$#`YLB^_-LA`j;fOv?a;q4Uva`&BgxLa{n|)mTQ9wa0?Zpzak~qt5h`@MFpfdnq$u%w< zy1a<`me%*4mwB@PXU9*<;&^S9XfV4V|1eUJoJXhs8Bg@z(qzZO=fKL< z4`ROe+xzn|#Gcw_ao_@DK4?LZnS+M2fIeEeA5<({?kYsqY*af~K5 z_SEziQ|YP*U{Y@FxaHT~`)NL4>@)d(97MR8)fI2R+#1P&iw+d=rr$NkR)aMazpBnv;dV1EA#N;IGPCwAxq zGVx~ZtBje`k`5*DUN#a~Xmjj7;KAggnvXVAR{`PTlLN)pb0_O+3g6x)3Qv08SV<34 zhZ=o`a7zjw21p{(g|brS`iH%T3g6-?&T+caCB_W-U<#xXX}B?Q10%!%rWN0*&cS2k zR6|JhjjkB?`e_F{77_W$#|_miHNZK$_bEkWS=J&h&757JV9et5lK#IxcDP!@^6yj} zqpLptnfb)MU*;~)Of)n@4h%SM$C0rO7m|gU}wb*-p9;NIyGeGisygKtDtT^ctGM{OL@c8-*Q&<-p^o|{kTnZ%1X_m(u0`Du9 zB!vhR54FIEFd()EbL54I)n4rP2y|1yv=A2#zJNT@r@gJK(|=Z)bG?a=DsyA^?54P`+A>te?C#U(rxACf7x@Bj#VN6rm#00vQVv`a!lXAWhEi ze(nV}Q82AQn&P}wE|eF*eOnT{u(lS7^z)eLZ@@z`h1hFzybt{6?NRVBv9c&_!Jkph zkyy7SudJS~SU8_plv+_{&|GsqJ=n=qT2f+lc>2p9HSx=rDCn0`l!j)IhO-5$mek0{ z^6^K_Ru`AJKV9J*nxq$22R4n3evsPHworBkyQEG&Ls4s6(Pd{q@xaHJ7l>}ADfzd) z1tCgU7YBcE*b$7JU=U}PGK7A#hA?sDoC&0yu-y}mgH{#f0@FbO1P$gV{1^*>!-8U2 z69*-}w`Xc*9_dyKjB1i!0kYdR&hN|=c*_5K5lwL?AM-6vS^W0Co^^py<(sJCvBz4_ zgBDtXjUnNGW(`uTSx&4xJ>;2-TCC=@7)DSuRw>1oXdlR*;P-cIygT*N+x?+wYVixv zNq;@SJ<+_j1(PdH{(J{V4&1~(CUGe}v!#3LRdx~MUmPrJF7dGYd;%HTV zORNxF~+2-JZ02>wN7U^prHNsD9g0cIcTM^q^0rp^Pe99MK=YE6QVo zr|A5skhy|}Th?+&8YDg?AWkhB*2&bt1}Fy2P)G0nw%&l)g}+jgWV#mfw%)z3&l+~W zpZ&Jld~=p#j%i=2UG#=V>ZM1lji*Gs!24{`Kyc4ma=Mf$ctcJk+KDZXL4KDvv1;*n zr@gzl_}bI!#?uQb&T8oATwLAorzK=V4GOgl@9-oDK_Eb1sBwEJfehXoIYTxCA&?Mr zys-qUG$g_s4@m$E1}nJyP^w|W8X~ZBgqb6vqaIz3W^nJ1GvR#b3lK;eG<4$YaHu8f zkqKqSmH&<(BEB_EZ~O{OE^$Gs_k(yy4Q7L7Ax>&Ot^pR>P^5=Wh2R~Lm|{@YF@<1% zX9Pjwav`y~4LEusj1r+aG$d#8Xb<0+oC->2jTFilFhx91w&_O+A_szBm4smr?46c? zcz`cC=I2r3q7ntxoM2M!m$l2mRpUJBEXcmq3t9xJIWDu*Sk2MzYdk<^><8QQfymvw z&!_7hZo;RR52f}6I31b($E!C3d5QMKjqe^{jsn%+Ju?#eS(KzOn6=!;+QJ@25M-66 zODlG3IKp(?|3=?iSL(4y0}!Myy8VpjJv24f9(X71chjV8L-js%6{xc)ss6xt7y&TK z(V_E9SJiNXgLxEY?B1`^}0%BO7%gum@HgO8}lCkkJ|qv|yBlC_d_UbV$! zm3gv$PIvG5&i2njIDATAII2Xiz@md z!p1k5s-o=u$p)L_@jk;4pS>-Uc9**_VOBS7_lG8=OR=zaEAcxDfnOjWuT@=9>~VA` z2caV4iA?>)ED{Np#T)Z5TwDXjbNf0wSFW7aFFR6aCjEJOdMf%B=zFu)n_N#ZDUhwG zlwQAV2!u;ZtC43bMhs%wA09fRBW64p-a0xsQM_ZxMi$paFT{@J*26*cs(Q9soX%lP zis7c;nHGiuxCV_{kOI5EtqhnglWYsp>T|@yrvylVUqD&((WGDdTOn!$NQ6{v32zjG zUD7>}3-!ll4BN5tJb`KSd?~`#f7qNoIGid!TV<=p%FzE9VFo~19Fa5#PEtLSD&!Q& zt9M!P8Ny!Fq8A3puMt=glv6YlkPpaS1>yIlCBrUM-3DuICMGT}Cpru@!_~=(PZea@X!c;iwQQd+_E_5fN0j2_EkyIM*c*yQywAr5k$vcowB`HuMfv|6IoegNt*uC429FZt1W*CTa>>H zj|;Z`SnJB*43(oJEWL!YfPtAeSz7vuu50?`D?X!4nm*Yne~cf;jXN(+gi)M4AMWfg zP5%dpqIf2@z6DwEvkm*o|Hhxi)}H8p*03r}_AThO3a>gEKeu@aq>EES9A%`qmwqr= zMOnnNq$evT$#EwR+o_|E@W!WErQ7Cwm*Fc1T59E1OA#vM>&P)Cj+I%+$b1HDAiU15 zuTEF5-COm^GX1`ZQA2*jDq2y5hWm7FKApV3LA4-yhtHkg%s*Ux34?CTmud^^ugL$n z^Y7py^Uz8hMcX=@?xd4OJ#lZMC%Md9Bxi9i{v@|}veIy6+g;Dac z^7RB=da4@gV44DQJZE>#)+L9Xl?YURs^fKxSyQu*S7oZ5ps-lG+pcnYA!@Ea`W)FU zxH|e@dEB(pVJ>k<%N`|_py$3{Ir;AI{CqT72>_ z^w|86wW`HDpXGUIxs>(2%9ZDbqY~%n(!{4+iq`Md}|=1 z85jtpSIaIu41wHfyK_9%eIv%COFpp2D0{!sA|JQBwDey1Tc+VynMeDRs;#5`p_y#H zX#_+FRLm(4%<<@`*Q&@_^Y`e0sHV(ta>k_pkYK@L9gd66U09(K5zNSJQ@k{>e@KyY zmi}*I*E%549h(tEGz3;G#U}h}j!UTn!33gBN#6YQ{B*=l`n6eKKN&_$Ox$mCxO#&k zZFOA#z3oh!o7P?DzpnQr{|XJ+A`wAD|1hBN&J=`31CFA>Kn5fFh2B#F%y5yQHau~? z<34h8FUUTNAvIX0$ExrN|M~7&6qTrj{}jM-d;jEVqlrri4V4uk`-Jut3=jkWTw+D- z9O2-LJG2;48V0?^a!qOg-G3%INN!pg*Ld>87iLI4E>6EN8FA(xmS|{7nWnNdRscCr zKQb1YL%3Zp-U~EjZPPYO+l!&E7g~QAI~zmiPzp+R<{Qc2x~9kep#)$Y3U&hwZvcBZ zzO@s_^v9qKN%|*FaW|ea%lS%%{N;ptUhnr#_FKlhXVslP4QkGYK~ff23dE6xwnUm& zi%$dVUzLkGZ=8c}8lQKZsi-L4``u3OGR3B0UWHyY7`$UdkY~w9N;g1 zFD!i6M&Ofzhxy(yfnTbTZC2`y%&QNJz8Da720a^Qs|(9q1|Ao8dKX@%B*Z=_)VaQE zPfx`p|H}`WTwbLZ5J9rHGv~cp=M-8&QmhTZD(^?PFM${BUP=6U*<{yib_ds&+f6(% zzSfR0)CCD}aBS6prQt^^L+DA_h4V8^VZpxiBw1YodUvJexPWa9_>xLdQz~j^giq6P zgnpY4w8T)5(=~dzR-ts?vi=aBdTae~6jUxYU=RAo0w-_rS4&i#g&Q{F@~-`Y!R^Y+ zFMh-$Hnv)Ptu{z#FjnT&za+pFu;{h&bP*)gvptYtE}7typPy(zCcoBxqF!xYH*ud& zg8rcrw_C2joPwRQGm06Y_-K*S5_}pde)6{?_n!mro6=QI*E)Po7l?4C#ObjBdQ_z~ zj_D1vx!zMpq)YkA?4r%q|U5%aTS3>p#9b z`90Y{lXz#=g*MTwDP5{#ogO*;Rkez4gN}K6g6fqXul=+mmC_NiQs;wsaIqcu1rE zFmmb?h&Up7??p~Hgc-i~n~Ja2>Psxicc8me9L#7SqDql>S58ANbFmz1hT?E97|A$k zWwrU=?*aQ&4!!XLD1c&+_DM?D%chJcyheb4ErGPw79J$PJD3!Zav5Um6C(Uv||#EzJ-3tOSk(gtS#&q1kDM zvMc-z9$F^x40?wolDe97TZ8))oH8 zz#wZ2N)i8_wfY72Qo9bORLl9gg-Gh;1a*%v=>m(&J<_~_B)`Q9ly#+^;$BRq_%J0c zviCbA_wbZe8eW#Ls)u=z_Og3dx)4_9xUm7%=O09exM5X9$TNvQ;SkUU|4360!qxE156HZCSXG>vO) z`4yau0Grf&kKpas_^i*OQW(Vt5u|k(N-i$$=f)_8@A>8S_G{;L1<QZyq`Ix- zirmnNgxIoHdVtKN?8ka`P#4AzxM-@ckgTbBmF>#r=m=6~(r`|&Ab{UJ`c(V0F07NST9dTmaR3Nl&{qDj_(Q%CS0p?*$Iu4~&$ zmGU528ygCXU69|zAt$X=Z!2?v&knswVs``}0F2IqpqxZFE^D;L!D9jtt5{*Xb8&Zm z&P5>i9o2`jNAoY-pgNJT*Mx_*u(YJARzIj#`Y zOmk!GI`mGv@#@-{!8Ds?V-J*RD$45<+JDuFiX(pjUU&0(SS1lK&4Qo=jzS|k#2?!! zb1LL^S$8C0mCr8?9{a!j?Wj2Z{VRN|%*@`n@m$S_>}_E4#O=&CXy-pVOFTSI+M!SB z3k-O)a(cuo#v4*+mCdD3%RF=SH&qJ1TG=!u0rX!83;^~LVA=oD@*gj3Npl_B9PM7W z6NB}znZJzkb3x_g`{`9_J+{UOCpX=^FyOHsvoIh2Asm2B*%b|#IZOk^cWw$q8AfrsjNHj6|D|0L$nflPQ(ie3n#4eO779 z=GbnZQ$$`;5=w<(Ij|>H3V~1pE|~VF3^`HY}1SaDhNYy0gsmap)LsR4Tkw^L^z(Tcu2mgyo9zI0T5HF zn+sxQk%V@^#vE}sa~|1wyW#aT-ud7abQ>D8Zy--6^upVV8=}rM4(@OSzDNYXWD~Hy z&?g*?{iZRqfU8TfyMjJVJPd*9foXD5GK?EYMD8M0!0lB;X_wlwasi@AA=jtvdWJ9daXUebb!2DII__trovt0**Xy#4i?Z&}R5 zK!(bRV&opg9`r$x*2Z;!nxssMiAzy)3hOg1Ug5}xC@>^GSZ_dCg$0QWm4c9?yD{{! zou1o>-1nrFsmzxLUp&o4<3(80IF>X;@p+#f>4Q={kD)nAgd zHk)iQRNn*&Ip%kX@QhJ2obBcjxBTVBp0@ODg=D%JvO068@hV+>dwT4AUfPOu?)>;h zsUFQ{G<-}QA}fwS1ss|#YT7L`g(>Dw!Szmo)O@1u$gR z$fZZ_?VmgL8a;)sR$vK^>btoASD_An4+y+&?VGV8Dr_5Ns(%edIlT*fpl!xuRx-n@ zS>+;1hAXl6@1={AdG+j~3>_zNjcwM>l3OoF0}B{e z1b>f_p{3pZ<=UJ%xr?%1k(R&O(a|orQ3n6sTWJWqSbHtJk`XFl46%FLn(0fdTN&qU zytmm&r2FqKI|yDe!jK?46AL6Grp-;TAcbt6<^J35&P%+&5$9$U6ck(~cL1T>SO{5q ztr_NANRJ-8BU_Ay8f2zI4|E%#ufY|qa;DZuJC~70Gc>5v9<@$0q{?nF*tTCPVzPM~0`A=c#uOu(X^$&xS6#Z&P-uwHW?cHr| z=CA%F?|jZWZ5I%H-jAd@?7Jm7DBOREsk8!SPF9cUhb#PP@ATW9nC>=><(i!N#r=X-{F1Qa3z5#w|yD6`Q%L5!z3$#kKVKH`c(X^50IbP;oyYqRGxsHlq zollR>Z9Wga|BXZFuw}quTsjJhdQ4~zS@woifR}Q7KY#gLl)mfu>&Vx{Z!1L+D~HkH z6jxXxsy!fYSaZ|7=AwY2X1FMTIbe#|uU?T1^w-DmckUG>n-U~LQij4w%2U^D88D98 zzB8uIg0c&L_n!>7dTpJ2eumHl>{7!shWt&Aj;7f~9$1a{RlfbBj{obPMzxT^b75rZ zG}&YVV_~Bgnodg=p#FdirnZtfJwaKQV(Va0TJ5wdiDEyNuEL=|qf0QVE;s04WFSPn zQPpIer&4*?2DliPn!i3-9tR8BErWpu+9r_%hZX0yX;?{NApLdu4M+5~<_H5Rw*TG( zY4mKF(Hb2yEQjZ7Hd$zPReqAN2fgc4z92F_%mK5Tw?G9jtn09F6YqZiGixb3aKf_F z6Q*=_aCR>GQBi8uYyj?|oz4i&q&8R+3R9-@Y-X&~D=)RIih0(>ajJCkPW@hPs5#}a z2>R}IsS^EBS`#LctgUJ z6HZR4bAPJsL&InRXNQI(%hX}2QP)sT&sU;HfoAsQD2RL-BUaA=Cn1n1MjA{r%3YvQ z)T$&91Mj4UQ5zbz7KTu^c_KzwnKAJ`}O9~-aLAaq%YuKhehq(HrBIX5)B4= zGJ<+v+|1J+@-Cl3523#KyOT=VN!PQ~naCmgcA^W;f_3lb@s&l-|I5Q-n*$CDQ4)d6 z+u9HKyBEzF%5P@xYMk_mGe1Mm?&DtTrqJ-Xj1gqnBr_I@k?^y-vk^!s&Pp*CvxsFW zH#YER6lP8CUfi{@DcF}U=xlS}Xh7S2;ljaHfu9Of@e!Ggkyno7G*bBhLC6IXT zk2H>e)VA%_NeAbt3vs4u;=pqup|sDV>(BRF) zEjS0J4(S0>a2aYDSExCzDo?}e*Z45vZRQA@P#A4;JHPr0r|j5lPjg{RnqkmGOD>iD zVdJ&)TEK3=`dnb312imR@6pB{M%P-{pj21kVHr9WoF+w`l^=zwK@^EMmC47(&##|r zk6$-Fk3Jtz0pY}YKjP99i&lh%WBPlf{T#hc`>j<5GcscK9YnM6d;>fKzucgDn~LL; z3TqujxZ{fPMDLb|J>bIXX!w!S&sq;maN<~aGQTJ*7(z=)&B97NGKdOfpRP%zwBpgbC#N~s+)@2@2`*q zYa~d#A(jFG676KbxSABQp2I;%slW2SBk@1>uN&2>MKOU+xDmpq56LH2^O#{P3x;sL zmhZcEK6n3$uM{dLB`)Zstmrl54Gd>E^wYsP^$ip91(AX-*2UEcXaL#|O*09Pns0B64||M{VM(cZ zAr(#WAtYUXop!IEW~>#YI)sG{zKe4ru0&s4c1I53l9=hR5oMW$hbdmEP$0lkh}L!-f`5kdfW=LGJ3*c zw|%!h3=<0?AoGDFxXE_p?nuNta;%+}N1YMl1wz%HiJ_}9(fG-_S?_SBPS~C2I|Ll| z)s6xn7vlV#t=FHwG=&hmJD5fW5IY9_N}3PTvzGtSUvrcng&eYv!UmG+ieFNuBVPVT zC#3Z4Qm^A{I{ql1UjksG62OUTW$g zYn-B{@@*@>NxD>&x7h~+<*?o|Cz#`PWMyV87vA6Y8oS`4RU1s4I(2^Z{P>AW9-yzu zH6TA^+S%DzeYe-$`*?1ZPH$cGMzadk#z+3Exx-oUFDXFi^$LcZ#iJ27d3IKIJj^E> z|GvH7pPxNKDrtLvKb!~dyC|@-*3|HP`LuO&vex2v8fPV#HO2@RM+g{>MYPXF?X4gX z!QbOlF$`)*j5=%GPTRYmR--+ZFp}isH+*d~75>Hc21qiPfeAyI%qcMPEI3O%oh`7b0(&Npm+COe9b|KJn@jeagNm{nui=SFDrA8?j>q4Gef#(BR8NwOi1PB2Ag50F` zmUxiQ)}4QrmoA!6goHeJNqxM=}eLCy*{fA(8+hwQp z!Xekb#ihB4@Iu?NdWzOOhr*?)9ysXu1)m+vbZpC?dwTxlAgxEuOItP>!Q?Xy)=r>$S!~6k}A0i6l-O z?zi|mA$?kw1tJI4c0^Z!ISCV4-d-Tt&Mki%}9z+cuxtsH) zl1zg4X@#|vSTQOje(ZG7(vc(2b6kOl3SUon=_VjX0n%D;2ywYU zR7vW3BmkS`h^V@m_$~kHOK~}^FGm)aT>u$V!0pk}(*C(xr|i23^tVw!s-VC7-fiFO zvlST=hx6_47-beUm$Li|rnzKx4gS-fi1c%A|4}!Qz>5*&it=c953TK@Qr_cQx6Z+I z)WL{(9@R$W*H^^vX7^i&28(vXcqu=Fy4@S3`i#Ul?B9KRr()c}Vy~~?S=-EzRB^25CE-)+! z)<1lgMgR$YT>2d3EyO|fK9DgAn=a_Eb^YG?c}Z+#g}lWs(9vx>D?@35VP;E3Y%KhV zb^U3F>fh5Tt21BNY2axqDim#bX;oNQ?BV3$boF^V(bL@9-{1A4>+M?WsUse?{V~cJ zdzJByacJJ*q&x1R(do$Heb7}VqzR33TmSX&Ak~vY5M8I6xihz}#bcY;vY?o-5pP$p z8WRnH4Bdb4Ri(2pol(Pp|E|p2nc*1>h;%w!s*wrjCHiXq6wzaGJ}&yw>D5<=Mze>x z%1vVE?0!+DRS|obXv1&Cy=n(JZ|{4Q??bra8!2&gcYD)YDA1$RuckW`K8fUo9LEK~1GWH9L8ww|G+J~& zK2S9@pzMY*YbU5B*g!;zI&r_eKB&~@ysD#5=%xSLD;-1BWFwzeXiKcJG+otcKsplS z+Ub=nRl~jQPGs|(9x~%tWr#@vUHCW*F(<$NYsz7b;0N@Pz`ulmK+@H`&t)XPwdZP6DN{HGybWAc(%P>ENHAPPv1u-{QNAKnifrfl%^Dpy4f^54 zPYiNxAgHwF;A-LVej=c|`04O+mSjdUoGk4<=o?Si7KHG+W5N-r-eRc8G%ZBwOBHRR#r^^V+5FZ1zS@H0Lsb z)GYAE)WNWj;E&-Z7CS@Vaf-u~IXI85?%RzlJSV&&sO*o0o!4WyuxV;|mFj5V1r~Nw zg8vs(OxbOgp<96|!*#A0*oB*K8ES47+C5CX9l1I{P;}wl7P$@&{(+y5Ew&kb^wMhL zi?1=OpkJub{LiK@mfSth{`y>Am%lr4i2E==VnuoB8`Ix5`?CG|n6IF0&I@nfm5O5&*YbhFNP65Pd$`wQyVC@!fKsoZ?#_NjpBx zEvj9AfLvc+SFX4DxVrz_-lY3ZkZf^PBQ>qJn{GMp6AT$-{#tS=^20b=im=%(Jsde zag{+^ubn$Q9=wKDmUQR;?mQ8Znqr$DGAhkHU!mygagllJ&sjmHfVF^&iJ;PZqfC}4t>ulI1q_nqbe{M9c~d@le*E%`G1-t=(zedq zi$eDko%+Rcc{W$jZf%J1b<^L743?vhExEaFgtl{IgRmjEMhfhwA`xs8bh`x%GBI!5 zNsUuVAvI;3xBfze1qWsrTTUw1wpE#EaqGslH{ZCuHO@O~TU@1%ua?ai*VDXTx|I52 zd}NFq0ft5L)`!pG*U`+s?M&%Cj<(ijnUoU_VxUTx$Crb{_NH1&p-S)%d*jEyj(7C-Msncz5TPZs;a6%zdsykt)LF@^5w0cduPHiE4cmnr6%L;P@n4EPKn+TH7>@L^er^7*UXqp{y&_>kr4H@#cp0 zuG`cDubRCC;Jr79gn&pPa%6^pOoRl4+$+rGjlBdp(G_!dH?$8SfX7U&oj($ckkQB( zIRuXaKR4z7vKhwbP9cblqH9ogNe^A1xl}rIXjTR!(Fw1FRDok%*Cx+f2OmFpd~|xw zq^$SHC#S$H32)!I^R=&iZJ3J~p{km%yz|Cl**fR4EHj3@2Wwr7Q3@f6w3K<83L&%> z-HKs3df(QbrIcEUy`2pL6o^gTDl&pVND9u!NJ3DS8uu6bJ%rJyKOFUA1WCXVioEdN z8)J;ZYrA{L$EU9jPo~p_)JdM^!G*L)0ibQ$rm2Jwd0uo9!Op-V5F_(ygu?)cEeB5s ztdWVLfq)oV;^ksCO>heKBBg3?%WUoIru5;J`_xve#P{?_K$&d&~>K1@lYt>Y*O{j_ui34 zU*8`7```N=72B$X-5y;V_ddP<#0J>z>HqoP`CEO#pZw^LzH#%~%a^ZqiquZe%H{Io zAN}CooA;32-XNbHgUQ65JJ)~k!9xYGk?XI$b?1+N_`_hm0w92PcJ3Bqw`@WMKTxSL8CUISW+OKut8cVZk@J8tN?AHTJK^?v3(rSoTqNxW( z+TAb$$hBad3IKwLh(Tgxj6|WU+=#nb%gVfVxv#COz^>&Uf931^rBZVJXDjPTNMpc- z`0~}E*6OWy-Zn-PvLfuju^c_GB3@UI|0**2>V5d7#rZ$rB?+NvZ3rPv({6woLR{BR zuiwv_l$;wl_V{8so6R0Re7L{2_x}6u-@UW3 zT*BiQN5|7D>5q+C#ad-~k>y3*w9bdJEPwj5=hNxbd#_C*q}u2Y(lqVmiBwV(+`4sZ zV`C%6XoFWu-MMpzhyq7}BuHG=i$Vy9p-Z<}g@-XCGXf@hHHWuuMSCCtMu2M@E!Iw4 z07(=n#>mlj^Mp*@kgT8I%ZCc?(_}JAca7H zEX%q!!13|%(doG|S>t?B6t-;%R;6cP!4Zlgshg0chH?`EG__xYjlfxZc{+iF zBWObpM3B~e~@J9?Va(> z&7n~0-u2z@ee=Eh_wS#coxQW0|CPV`SBImK4`F)z>g4cbu+>k~Y_vUAvHeTme(Uh) z)vcS?ZeQE||NOuH-B;f%ZhrgS&0!v5JJ{ark9zsm^>ZH9oFR({$_7~mISIxs{DMW0 znn(b$44xngaFM;w@>Xw$kfLW_KNt97cVP!@oKEAxb1^v{3A&bn#5ROIg0vu2kXwk$>=kFDvSLmXrytMOFyc(#B;PMt|iD_;2 zlF_}f?(Y=&j`Z{CS?~J31t#D;H5&sZ0D|M`bTS?dx~u}c3}i(36X?^IprWf%TjqFU ze}8*(=jN^1gU?)Y5g6unR*) z!Vp$)Q17{0QH?QIw~(&$+SSpW@=gfRi6OcfYKQpv1omL-@A8DA~en?O2!xonGgvg$3PrND0ek=gRjVT*4|m7 z6$apHG4px_xS~@2Qp->$i{=P{0ZkjnJgl@1OZXq> zlC|^alc}|KV`HP2rxCz<7Qoas+SkM+e*G@76HWz&2qFR;pUr;$(F3ddquuL9Y44m7 z$-H*6$It4j9B=PkEUJ$mJPJ%9gyZvxjl8wB?V3ehmCQ{aX*!!trqgn{tg1=~DvDxf zduuT0=XsuGS(>J)21DSz&$Y?N1^@y80q8Vi0P8#>8!4{H-Y7;dI!|<$r4Shj5uj>X zZA=$_rxkbx=OG9nAVGvc-uo3;e#PUwI&6u+9uNVAAi5gqikDiuFMJDDF9@s$zXC9= z=y8&e5Up*KBq0PJA|eR_KxkTLjB2b`MlGvqzF1o4lR`;G=R6|jSvDSzi^3p4P6B6ibq5kN2si0GULq$KM(ZeN|8%TR6fi}cz%1g@N&mkkVi8@I3T z3{u%HW}iKLfDH979x9|)pFQcBJmGkBe6%s{|Fv)a1_|-%-VP##5WjMLe`|B=;g5d! zSO4-~`NMzr`#<=-f2~RU#y7wIqd)$m{-D3Vx%u&@pBQ7l`OR-WeDJWY>!R1&+uKVS zdP4s8U;Aqxe{%l-@NfU!zx((9&VTX`|BL@(BT;v6U(ZJahw;1L{Ga~r@BXWu&GAm2 z{~!PJzxS{IN+>I2f9L)WeqJ|Q2>TefZJPuJlVxd=*_j0t9H-0qlI#n^ z&1R9qUi_H zU=E0Dxz}p#UEOc&4io%(LHOKmx~gJ7zmlvZzFoZe75@^WbC9OOI+#wY82rx8c4ONo zPo8XUj3r_ex*L-N3+fI}+)eqAE>ANZ)#q}R{^eEdPkntkilI~L{KNm#|M~a-@ZbOR zgAcFYx>NMBs)fW5QPzSlh zCLtk(R3S17K}c0q&E~VFshK%=D-mK0-utF$7W2h?J}Z}ts#ba|C4QQmPRl1|R|{p-bD61PBm; z^%{brWW2k#{qF5+@7=t8Z)5M??cI&-gp0bNWfR)yNVfwO6Qu+BWf7Xxd8(p;9C2K= zj5-FKw)V5%{H=FkG(3DfiQ+4tK9ePlS!F^SmfEpsBRQssghU)Y1P9RrN2!cZX$8qt zj?SUy(lPb6rwxDl^x(z8Y2Aj=aPzG<-dawVk3Rb3JMVpcesX&9^jVnC{_p?S|4ZuY zXCHs~l^fT!_YXgKdiePM%SVrwXBQU-hs*Pe`PtbpOYL$2-p=Q<+6SQ%qfEW5jWh~G ztX(}@*0bupx87Y&=k>C-wSDy9(T{%kqn~ zk|GDYfbt9m3KEB0CVLyBe&)*4J2$D{JCgdT3y+noiVY!>$@Fa2)Ym7o{?_%c-h1a} zmO>)HFgOdKfpE1@5Q9Jr5o~0Z7!fS^##<$n5X6oN5Cymh)&h!kS%u&u3-SmpLJi;` zFa!cm$Pj6z`8Ecx?Qh+_vA@4Hy0J61i;Mk@0kq}p^ki!|xOe+@k%+d9M$@VRh9Hn2 z28=-x69RGUfX|nG6ha1Y$d;lb!6c9f5M%ecv{uF>L?oopNg|Z?G5QdJ1W5@b7%>7e zA`rALkR&8<0jv*<)UAn9(rmF1QUT(8vH1B1zc5MG>lH6w9i5#|s=6Hvdq&f2;g62a zY^0xj{OEMi)*Trz>m_;LdOkV3AfWWBpa zrBDRY*&wCr26C6{RkuphYLDO*PHXkMzqX71^4N1JUhCeNJUO4-d*@wYvVZxn|IK)` z`Q6|6uG!A23Niy6JOV3$f>5j+K`e;6k$z-kfEK{B5Gq~Ntx9B3^kNLQZJc#R%RK8V zDdy8@xt!PK9Dsv!N(vPE?Cc`Xl0m<(wN_GSrFuo4rODkpxB7+dHY*oa%dBgi*6MQ1 z%~#-vd?il$Qb4t)DNx@)NrKoBUU0U*!Q0N?^F z>&E(^lT;ehWl(tUZQY)qpPiqN^wv04L;xJwC~1`J93Hs7337FQ6xOo3&i2>?mKDH zht>hm^z6)^9hodwGEck!)w})fH=w>q3_+1YP*5@;fXhsZe%>_mGc!BxiLV*y860pb zH3Wpno}*kTHVFhlK&-q~QUQ>VvV#^#Nr14JPIaR5BS>5B7i|IyM}CcE+ho0R2O>?oD*6j5CfEr zZLJ3+qezB2Ni--4k=c3dcFNcl1{Av~K0{}6A)+Kr5MNIvyFOWrkeC$=Pl(Q0u-Zi! zKqp2BYMo!!wN8?Y=`?7tP~g+wN@c=Vk85g6ez`|9z_Yd+NJx#D)D-_dO1++co0$w5D_@Qs$ds_v=RUi z*)xa4C~Xoz5khdzO(u&X%kz|!AZI}-RLaCFQ>x2t;&KUF(X(G`qyM}Sl$T|0vJFY^QEy~lA;}3rPL)W&}y1l)< zZ+`O|w{P8)55iJT`1 z$Czh%=YkE9NnrOil1i>6Z@f+dr>?~cakce!H?spv5rT6zM4^@Jdc~d6M@ouU^!mRv zwfWpY1Oa1=vU^hzm|4IYpt^4TbiYP=9q~(F$SPl-`@Hoo1gRBEbUrYG64J+#00oEy zH6X?altUy4kO)W$7y}Hx&$R938@s40Kgbs?4rqlscUk@z%gKq2$&`^Pqao9cIn%NL6>QjisZ(P z8~^MN|KNB3&A+{K?b_YjcmMq#|8bG^re*U_{=5Hgzh77~3kR+ZA{(&IruAgJvDvm( z3B55I_4>tha#2MlBd5#hs3^3gdRf+sWk)8AJ|L2p=n0lhvzS>Xl$p7HYvX4hKmX>} zZuUlFPx#}X{p|UxmoJ_@+Z_#kK1Lfcx?U!Oo!a@a)JB?K zk*2^BA_PXpBv8T_5t)IycBT)^5IU%wAVC0HpcWDUR3_iNclYf#?{-q5rU4;9NFW4e zaLx-NC5Zt;MAAto+CMm+Jb!gCn=hp@MV`EMdw-l{5-}3E;1nu?&qvQBCdrGwkD!z`scvnM zTK7kzaks#T$tx{5u&Jvj>;3Aw~OioYFwzqc#bu9)! z04cz`0Dz=EFXO&igLTp=Uf;hz=T>@I#W4VYeE8()WWLmC*1E_@%c}YK{-;GzynXLh zqKFVUI08N#EzcCF?io19%rzmw|*}v=Hmxm0EH9;vc+vsQA*rz$-_fFUYgkr#6mtT^}DE zK7Rb@^y2jHom+SA+`WGN#?I!rtIP<&dQcKV1QZ?R5IBgkbQkAGS_!R{F-A$*sq(Ja zW*9!-27TSuAVdJ_jz}CkXq?i50h-nm2?m_am;d~~|DC`{N|_|vzkVHsY^-hD)+l}Z z)~z@1Uhf+S0VZdsi*nv5t(2C^Bu2Rqo%afq5Xjt}MPAqT>$4yt0E*6006s9UW)2tu z>ZSn%t98>f9Wg^IC9&&muaz3WNSD%yFYKudKthV{;M~|&DMf3%nG2DKNW7lOMur%; z3#jNgZNQNLg_J8{5kaC&ClCUbUH2FXH3)W$0zp8{uyp=xJ_8}?DH>0-1e)5P%~>1fps=(Y?Y*4z48M5IX0|W`6Nc|H(i3SO4-~esuro`N^qL$*bej z(ZIhvK56Rmt=@33d&9a=T91H&lq?3vvxT)TO-xV7Dnb>ZjO^=r^V)vi@25$kvIM1Q ztJ;T%LZw-jjRscYMN>`}GnJUzZ`^(N-M4=Bd%rtto7r^Q-`JRyRoT7*q{@0jVqvEohY&1)8v&ods%KoFzjV?+t@H zbo1rW%d@@ht@HEA`D{Ag+Zt@$>W#0NVgs^4e;L^&ft$uYZmOf>qr+FvUY6wtJ9}^6 zye@LA09s{aQ#CFmNgrO9ARUy97>G$?ZJPjWbP9k%p%i4R2tvBno?W~!sodJ#133U5 zhL%V|M2G;9D6V-X1VF?XICiZS;+1RV68#fHr+@Gs1hP@+Toj5zjKNtD0$5IGv%}*P zon$ufylM|m&X3P7%Ek(1(nSB@$3MGqeed0`eC5{7ZLO69Z~-`il0a*gCUabk7lDlw z-Ndy+NCN#&T<3u<+5(t;dqNkxWKtds?+lU(u;!wYu&YL*G&dz z)9T`4GG8o~RT-rxr3rzEv{J?-S_wipJujbr_E-tJckc~B_~^mIrm6S#cXgr=p~&*_ zpq~g(sUlF_G5vK}__><&isuJkFU?Xb{-xD~0R#b|urW9vlr~6^6~&H}gF#OrAi!eT z2*M&WQi!T*y+x=a+jQcB`l0rO|xPOnxJD+wEbeDLHM5%uyODIX()pcrD^ zx-6q^KO?D_Aw&)wpriiA01T;u0I;*w|Hk`Y^$}0bC)ank5g`UYo6YK~+#HW@-nhP) z&x#@+4~P9;Dgm4aC0~PWFZUY)AOVuPCo#6v|FP4z7W^hPt+OSqX|9 zBQO(6LMDRCfB4GIf8{&TaY|M;=asRWJGMCZ5X73rMG64{h5q($eDC?IgV}sx(p)NC zR<-jXOY?hg+_`;or!as3l3>v9_fn&kDyxQ(Vpj%|SRb8M?ret3#y77j^|g>7GF#XB z5W0Y0KxE(;IW*03xr{MNDUH^_GYVMaNLLQ=&H#S(Zm+*xu@iy$z(_(!Vu0ncW@ckd z95NLSRg=)V_`e!rmZNQd;sC8ymE-X`%>1_}$HHpwFm2h4Em=CX2~b;OQH0 zzfD=cbf&DD$!s>CFPslbX`_v^4goO47=S$kgA{@V$&4e{T-6ENabZ;87tdck`o&Mr zUcGqs+0*_o0U`hRCqK=T?D%48na2A!XO`EcMkzWKHHFogQxfYNkt zV`F19Y8Uetj~=i)hpe(|Qc@u{3$U9v^qsqt z7mt3C3KGj@_2eTt6l%C-^05H0vFiWl=-0>J18U}FWFnzu@_?G<+AMe2U-d514kjcEZl&>)*y@& zqR3MKtm@|Y^z`B5&$9lg4bTQ~EP5Ne1qx54FVLSWdO9R6Uxow#*Z|%+VBb$Al2lr*tQ=b9 zS}m4!o~2DyKY#Z0{Pb87Wod#)yVq{%Bu$LbN_Bsg1X#r(zAnaIzZ(2=^n7_m;O|08 zvf}XIXj$2Ads${O~1{W+`QKYjm-oM8SAG-rC-I>zy|eAtFHIy^_)xb$N?D zz}bm?_VoGD(Xnmqjq5kQ{k;s>ZC~cC+5CU|PS^!W< zdh_J3L-$;LSZ0J4W%YB=p^lah7drVWEOzv@+fgx zo36jaF>*HyM2;LgI$`TLRE|9{g3X;G;jQJ@7C?jot?UAMOh+= ztmtKV0f=al{oA*RFwZk7MT}7j>eUq=A63paw)K(oqSwi-)A=x)OuYBk@4k_1b$oC@Y5LxsH{SUAx2E&?lZTJK_Wf_u z$!B%2b>rH$a-jk+NLmot<#dq5?QON0XN8z^eNoR3>T2@h)fCDbN(mwykH`A@EodT^ z&8vqW4mNHT*GC6ur}O0`$u<*}Rdq$nrhxNdn(SZi?eA(9RqM;?bn@Pfd*n>0lbdh6 zuWoz?#K=SMqFj#hK}eWgf({mQ5hLbim<~2?+%(fypK3qP#``eb0x`5~mH~`}6;+oz z6(s@)h=G(cMj%lW;L}G>7mIQ<7$-VAIiAd>bL*P{-H049 zcAx{`HFOOa5gCyoo}L^hM(24Z^a^aqgiTdusqP+);6r2(LT>Nu%B0A8!?Wq)_0$;EVDHO*qN zjFDXoS+776Yqp=W*2Nft_kyVCk0Qt8^9cf_{c+j{+g2vY5CQ`>t@9zKi68(18F`&k zadmlK11P@0@MDC!2|$DbNv!HFDL@DnL3x0A<7TtD5OTg)PN!3&H3IaCe0O{6t#`k2 z_^SWe<40xF?Co8f&gZF*UA}8q#zbDtk}rK3mxb7$x9z)H`k4XbylgkNcdfN&)47u3 zD_{NE-8*+)9nOF8!B5+I*(_Ika3uKF$%&wOOwP%DQ(k~%Vh{YOOqnc60MetIdI(C z+}PaQ$kQxIj7d@wuY2)VX%qN*Q2AQRa;20-{=9^%b98aU;6v~%wP>2QZtTxKxPR-; ztzO=n&C2Oyx?GgebDAXH2iw@`WICJ97mFp4xN-AlRzS0KQa~356qvirMIu2$eCfWw zCSI>SCM%69c8a&MvXki?NHK}BtQS@Dqo03ZeNe^>h9i?CF)|_s?@x{va<7+35Nj}L zU~txJBO43Od!wb1oz>||vt@lZF3%c37&vyMW0M+2SS*)y-H;GK*p;ez(d!&<=jW68 z#iC#Im;o`r{Lvg)2)r^Gf%Th0AmS^r3DKSZH8q#JF(TFf!QF9`+HmIyYEF0&IU6W z18F!x=na44Tfh0UpZvtciAsX+wHRA(kBEy*D@{~v=e;exeJ$5%ZQF|^K@u!<0^Zam z92}PX{NaP;hiQuOrW^`oWVI^To1PTv)GUy0@tE=mr(FLAlDF z4|7NbHFloDh-e$2ufV9TEF=uU2VMnxT$K-OZ*Li++qSK$T5FwUnN%oM-aQ}Q`T1g5 z)s0ZPHyDk^g9woKav>G-$;sJ8UDd4%A#!XJEh$yG>Sh|6Y}1^co-XE7B}J-LmL{n& zMypO7x4kjSv$WUiX@w}{<-xuUfGA0I`SuV|0YYGC0Rm8EL2KCE9d2w7@4a~g0Pft| zKRa*F&d#T^dEgeM5`eudpG@aMs#Qb`k=C73foDhUj zqNT2m-MIdIneoNeu1>_IXSWI918BWc)tuGwM?e1gBGcfR$Fo$J>k3D-1(@y7FKFNN}<>n`Fd)h}LYL4OX~%xkjGpZdB=d%iUJ zFtcn{U7S?q~r2;-CL?Hl0r{&U#t0x3|{~6*xllJ_c`$NmB_3Hb7tq zWm{EM>%2)aZBp+&0!PHi>?2s~94{AT6TGw50>=))e{ymH9AgXsAP}{ZOC={#ymjx5 zZZKeyWH=mUS=tSyJ->eApWjn?JtKUbL(X653cs$R(0LCighYuldiDXTx|uJk@%HX# zPfuRF_|fsvk(MgUvKT^eK241Go&fv3UYaKt7Z;D8J}@TSx;ADOfT*NKq&2Y&q z8KI3aMvFv!_VQKH>l2BlX#xr4h=6s|C?z|mqZFis3?V>>E{4Xn8+*G#nn#a6BcU>r z^oFBU$=#jpM9HRURFWPZ9m!%)^Q@?{<+<(kv*E^0e>^hTFtBJ^A6!e(`f5I_&P`nO zg*38=O*60U>B*t>7@SBGw^-E9`M2JABik8%g-hd)N5rdmm?X<{Mo~O&%wAlIT&0FGVDSq~o;_FL+3lPA zyVv_Bfu^0e7iW_P4+o*$*ivmh`QZM8Fdin$?NjTbKc8Q`4E6Hb*7zImzWv7S9U@>! z&yT7f|Kh=gBziHe=WS(*VNVTwee~J$N0V&&wYPhB-`qVtdZ|RMq6U!y zr-0NokA+ZIAi5o02oNbvGbv>kmDqg{&N;1(bxtXTLPw;@Y`$2Q{o!JJcUPMvH~9AL zjeEB@&L{T#VzMl&5aVDtV!+dr{v4z&isZ*Git zcXvmlk=D9{pDU%L#6+)h)ObDDi2%!z=ga!w==9>^LP|BA&a^Slp1%k&Y;A9AZK|qn zt?dr(+9Y{V5UujMnc4Z!EuKVjURF}bqCfN@&X!AN?xm)&-bi%TS5=+o(;L&iK1^rRql?A0 z+izZ+pFVnVfXdvvdrKvG*}5k$Ug3)HNVuBBt?*BsRp9fL<$p--1ODIso8Mn$+;f+v z9J@7ANc67Fj20Ni{rs=}*7pkyWz{A|GlP`asdYa5^w}q$J~*2$OmFNuIjj&JN{VMOlUrlO!Rc zwrv48Nesr&Hr060H%ipY#jTsyzxLHP1;I}~c>Ln!tKjX|zxLI8clKh0rmFfy)*Um# zDmzGgQI8AU*hUHkL?A%?@@JMX-crb*MZFJHc#&1OW@G|k0i zVbU>>jL|i=YTAk+B&kW$1ONy9aqx6}GN~(p^9B%?S=J5Su1_Ond- z(Rg#=^=V0s-fU%G^~N`^Z%z+R&z}BN*Pq_rZr{2k_x20O4Ad69a)+n>V#;k@+XfN^ z{k{`&*|ZUGV{?1s`V9b_oSd}Q6}?_D7=RFf0BzHjrFT{eRBH6uGk12@T%4Vi%jJAB znO$5&=M$qlQg>%*zz#r81c+IhbfE=^7-DeFIcI%vNYvOS%Q8S*EEj2(4u?bM!mC%O z7n51PS4hM>%d#Y$T%6}w+R*_zTN@H}8IXt&Df$qcU&WRogM=uF1qVV##0cb3dQvPC zfg&SJjY)b1DAO`GJ_L@4yuY(0qLrahuGXPep_S1B1lAZBV~`Lff|7!SbR^r|>&5sR z_wN6jf36JO`_6YxpFBH1Uto}T_wSM-93bsxP)KOc>htp?C`@+4)8*6W?KF%Q>Gd-) zK8DnZBq1q$aEoeKq;GxY)_i_?F**M2-}>&8Kl+2|XMdE(58k}<-oxj2Ci2}Edb|)q z#QC_d(ATjoukUWXeeVrs`0T~25AHwIc^|c2)@72YEYoeXL@DPEfwL3}!(R9k1uw>f zqph)h``(Sv%24kdybSw$UmI?0fq@W0>zzrGPW=-CTWg7g*0QSVJWm0jBd)CKSA+;q zx6%7>bac48yUWZ!{NWF;?eD+y_T66=yIz&yOy~BK2M_Ll@@d_)d4JIB^$(7Yv!bU> z(y?EB2t}T|roOhn_w?!0x88cI*Xy01pTGU~+Xn{+FJHbCLUbhkj#jw0w|D*K=+)8U zd@@-s%jL4XxVZ4%n=~O3Aq3~cjT<-eJb(J^*^L`FPfyP-CXxqE%As9j2L)TLD~RHf&=))hmU{$!7tj@O0Abo8)bsZ=p<1}aReV?mx<$D+wT?A zi}TT-_xJwJUw!%F{Ikc8%h?p#_Ah_``&(OE-n)KJF+iJJop@zUQMx{hx@ZKxc2`Tx?z!+$yS|J4#15j0#<#O@h@zeL-x$Od=>$uF&xNtJ5 z4v$Y;A5B&)>sFdnDb=OFg~$Nx+R)Txnk0jbozZBxxw)BV>2R2A;&iRa)(8EEoYIPzStK#sHEJ9uXpAlA6v@T3J8=P2;taopu_9W`wGB^Z7E( zGi{Qh5FVgz;cT)vJD)6;4T_>|(FaLFhA6Cy{lWO&8@Ctpi@m+=;h@;s9Oqe*C+gCS zY-0=|8l}=S4-7W26xdNO$~JuX$-{$#!_Qv4wYRsoxv}x$`P1cmzO%jk_Sq1l4^V!TfKVOspI9rz1 z2V|Vi7LDCYHKb|kyjPN#qaXxWsTRBQSy?U9G?ge4opxW5EHCoBH=WJWtdKfYN;@B` zx~&_lmA355x}Gf-q7wbVc3{wknohtNfe54!4B#0;U>{j)LLq@b5Sp}*IxWkxIXSof zzA?soKbcILrjb&{7|YtRVkQQlfSN^Qh%OSh+_tUtb70{^R7xu)1&Soqo>~wJu}@%x zYf@hJxz1>Db8l4o>Tp^u+MJaLfq5~VpV+_poBOAGH*s#qW}e{1@_a%wMWD*_i}GZ; zWwPx0jm$0T<+o}XPDpC3Lu zpG=m%IU@f3ajfSWoIqFd zv=#tR)*-}Tj5etO03Si8>Eov_wAR=5cS3}N<71`N#^%@qOqb1z7tcTX=%e?)_TD$% zfBU=N`#u8Kjn5MqLo63F4t~(@p%efxpUkB)N}F-6zV+3&@7=z!D4W)Y4?q6&_O07{ z*Kf?1)#=3qNi55HvaItoIiFWez{+uXK6~=y`Mh@C`-|xk0F+YQlO?4Dm6FMiPbViQ zCv{yDi7e}p5Qtbcb+12~&1Tkxp-%4HdE@PO_D)at4i66}lgS#FF9?}BTdNR&*afH! zN26P}Zf|YnWyvQ;ukKvi-r3ZK;PLaxhadcGKAnE>;YW9FY%@TXo35oLrIdnzfkVK{ zl&;Ix7O&VifuU(4a7+^;rO5I;4d6u@N%w$?f&kD4{_y^T=PwUi=S|i#SsFl8t?M$tlO%~TR&|{h z{lQ=$rCc_yIygqeG)=e0!>vIk*qcQ6dZgF)R2s5fMk|7lC|BN82mo~e5}*KVh$sjV z>efXDrBp|BDs42HB7oB10g^<92(!|8@6yC*Eo$p$%aVm6ohX31frI0-gQJtPi;LC= zZ=I4#%2Y`L3_iegI{)mmr+??SzvCh(0s#=#8-L?lg;EP)J-Dv!M5t{fDMH{ZL6o95 z+|<+M>11&>T_Qa2);3K&S=7DJ=8e6v$+UG40bU)==8NUUWEPmENumoRl{RL)u^D4r zE|(V<7t2L$jLDKDON_I&BR_-)Qm2jQSI1|}Y<&O-?+6a1=`koAR!1p z2TOp+Tx7*sL>Gh*0su+oMgREpysX+Zvq&0A0V%1HG|Mo8)TV0M&RTOZYx{k3d^XwN zA2|;MAPKC8*{m$fG6Iq^lj&SanPu6sY#C%^(Khb*AppT*Qcn*kM>R+x)`0u*rG57N z#o^I$-C7{gJm6ju-& zh!But1VKn77?BYv5ZR{8Q{zJPK5&T3<&uQVvflaGJkN`|V?GS}O;t5blVusl0PvdC zwIaYGb~m?kClL`ctXX0V)S-!yBXW!)1dLX(L~lbKyaR{cfr}J?xGYNok|-5O1yZ9D z-D_q>5jrM$3@hkajJ1vU>frE$pZ}Nt(f{Nx_rLqs;nhLUY`U`a)$-N!G#+8T+uL~S z8tm-@FdV#sK?0m61DO)aZW1k6_;1?esOeRxCp-nm*ZN?Z_s^Qjd6QC@s+VkPr zL`tdieh7gP0}&%fA=`+Hx;?*`&1Yo@A;tvZ_X-VN;jh z2Nd$;?BZfN*IJ>Fl!6!`1xszz`yM2B{MQXnmZQ-V9`5@DY4~0CH9~sFFmBBrg`VjSz`w zG#XvIc5P>8r)iqw^wN%Ulkf5c7i|Nw((C_yof+Uby<+@@zud$+4y3xX-s0Rt?Npvw3il(rvCZIpQ`j*TSK#K z!po!S$M^4hA4y216REV1PH8h3j!uq`ilXQhxzTDenUrN2yfwx+=e1HXGLY&Ga{zGG zB4Kn+B}rR_*F%v9h`u>He|rDy@h9i64iBX=Ce5r5t#v4<6KF^&oNL>r28g{P z&+;Mw1m{*c&d|jiMdu^p3iY&>Lvw@(%rPQ#C{1Ru>cRk`Xqq}xIZ$LEWs=sq$Y9a{ zG(pS0oJ3VOOC;23V!ba0{f(`Sh(J;xaQ7VGI&hZ(2v8s(5ytgrP7J^#gpjauZ+S+B z7$Y*10LEZlbhfpzv7rs<7+FXKC>d2G9R+!01|$*!1pxsPBXr4$j)+0eDjU4|#m^u8 z;=`x^;D6D)`CET!bayy=@Ua%Ms$%Jz^MmuV>BY4-rp29`Fy4km1!*$gDYnb%ba9$d zwT-Htm3PNCr4*wgnMu_wE{Yg5v!5K?-0^qb-#>YB^2v+SYhQT_LAYg=1=~+`K#&Al zQ;2~PP)KQ#+A;%i^cYygx^KenMxM!Kw7!k5s?S{;8HZ9So$P`dT})`%hBkUD3rO<1 zZ9aW@0KPTWeeav!dgrY@0GQ5$_Z|sj3_t$)he8mGI9*m*e`xaAXD?o{FiF-!5^ufp zu2RaRc?9r4_a7Y?Ew{(RL7_Lc_gqtINk9Ss7v~pAnyWPJ4M%|JBUlGEK$3t3K!Ce< z_siP8JUm(~7BO;?B}tYUW6sXb>bl zo@+rzd9uB^@$;Ym{QT^+D6+ihWohz##px@S2bWRB=5Km7}nx@f8R?FpX zFV#vSfKk$Wk3?Dt=bRMefSqllcY-j>G9pk?{Ca!os<*VdFV1L& zk@#8#3PggWav{dxJKnN)ZZ?}8pH82@JbL!x_|?(bbWy!LIu$wrshLDo)k$Ldy<#xv z4+ecH#dJD3Iy!3VnuKu9wQbv};EXX^EAJhk2$9RWxtL6sWhJC8h663ZMmRmIUmc#F zo=q0Z#zz@R27*_|%lr2~x&QHf@7>16mQsWO)`vw|11hC(+3*j3^y5z+J@%1LPfso; z(`8+gFahNA7l#*(9g#}3g2&HJfAP^LvqdemVH83c zWfB`WEqYbco}N!y=Uay_UcGw!(`iRxm>obRZ2;zeF)b1$QUBD&ie?;7$p?|Dms8M+_Wx45K<#aBpD(^MkLw&Ze#=$44q9T0<%C8D2PEY zU<}||$xgAuP=Q@&Y_*{_kYG~n#Iy%}INZ$3eh)E8D>*nS#Udm^N*!l?JiRq6uWyu3 zp8ji!r*H0WZSQW9xAVoqBMYUd=q(NoCI?5rAf#M2&8w4>=P%A4eDq>5D~TXUl@G3N zN~v%-?gIp7$LzJHJl9gfaydOdIU=E~^C3h8B2pxjQd()l-0{l^*UCBO5Mukm%xa1WH9D5G4{(mkJ`FL(R4U8wYhn%jkrRQi7HU>;*-{C?qgNrVz}uYEhw$@KKthk!~;okSq(qCp{( zytLY$SB8pHwHuBARA4)a1eV7=m=Ew`lpfx`Qzm2l`7d5rv3=eo zEsw^-Hx}njiY(beY@97aXh}(uCb004(lis`H8d(r_lNk^yW?CmJ*f(nX`wnH5hF6C z5r<7EW~G=cT@*415JpBqr8KzUtUo-NKYw+;tZE=JUz9Ii9=`MLS8v?9y{Kxb%{RaP z_GoMW^!!3d_5AsZlamwY+HM>2&p-a;!K=fgi`hcztUt`9Nl2N93Q3y0 zC$w=&$29uK5z&e!sOz@J6B|xcP@q?5IF>7 zrmnh-F@|8Ry|#ayBQt~Zp>1slOeDH6D=C#$ngKc$QorBN^TK=29k*f)MeAB1XD25J zkQl9`2+mc@S+guZ3|nh$ z^SLx9kGtO0t*S25W_lWf84N%`5CJ?vq7)PvlmkP-klyu<2Sq6K7wAcE3O*>n2nHz; z0SSf!3^16Pw$t6!Rb5qGb-g)0{pYq>OAkBq+*8#x5TT5Wd-J%=FTdR1UhZc=Sgcl< zdTU!}k>3tdNNJ57;CiAnvx^gzyD1sN=jG&pf^S= zq$y?8^3@6zK`E`RMBf3DHmd90^OvuLBQr-9BwY-KE`VqXQDWC9MTQV!xHvs|{o;9Y z8gkAJ$72r8doR%|O&~FN??rZY_hTCAhM;ux0xw>lELL^bwZ8A$rtZ3yV=!9h)|$+Y zCwt4~Vs>%XEEjvbJ1zunB1f;a9u2EL!qZn5&tDxc)^*dlM^Bz*3Vq*+@Y`=ceCO@A zqu_kGc2T;Rg+2ixBlkeJUKpU*6Zbbm}P2EmgCXT z`%Tt}q=BS!QCnq;0dwqKuM|~fH6E0ML0-45!Z;{1!sH|&yd4xUKV2tfL7uXAULD1F$(W|2)qwV?m1+$Q{Ceul%7?H9ZGXP_)3tpQ% z;SZtj(_%}*brC{DPV!;^kuijb7*PVUfRG3XG64V!0i!U*p3r0L6gMOx*3Oul$gz@> zfjK^`+P!fFc4rZa7w76|Y0;>?p_IHT!$r|gFCI^Czdao7U4v=&$)EkA@8SEu|JU&5 z?ZxrgxG+o=P+*CKVibmUc7Ae-knip72;g$Pj**AMA&^Q+7a_(NgK$&|tn;DW=BMm6gq`Qv?WgUS>Y>| z_7DH?4<9~!>*>>{pMCmiU9Z1<^62R7_;qNg@GJ(#k{-i~*w(Qf!HVF)&6ZmZWb2Ix7Zer{~s; z{@UOE`@j78PyWmQ`X4`fb^Q1L-ru}?{Z44-v*k3#P*wvLsaG-I*X7~$)yc`A@Yk-7 z+%#XDJX6j2gM9Ft*T0aWDi8On9UXv8zvBKx>5Jv-i}9^p&l>W5=XW>`V@*3|V0dke z1dgrig~((jlWtrDA)^T#Yj)T#vPiqxa60c!PFd+n8*j_Lhu8&-p$I`U6~+t;TG&d} z-O8xUiYo0u2BvQP#q5{}_xARJVAC|Gr)Pig`|mdn;+M2oHER#6rmIFf-~Zk3D1e{- z!rm#4GFmziywwbp8HXOdaFUaqt;hleEqoX(mr z9zD94&RD?tkmcpNuCuIo`1ZpxGokMeb|QrWOq=UpK7R7}+4IR{x9h!URwgH7ler3@ zlmpv4==x>T%uwXL_uu*6ci!76;QS)4m&^5HwOTgM-0NXA(MtDi6r|aF2}s7;reC$4 zQ`&Yeo?XmA8D(=9IQGE>*%=N6SfXkAt}2SbaHn1`+q%xJ&hy;$Jpe>@k(pWYqGXY# z<^3Ic<=vAfPab{wMNyQ=s!&@?L~ZA^u~}(i+m(aS-u|BV?%Crnt1>UE!Duwl#7(_W z;+=DLJ8j3U9eU^de7=0~;spSP5PgVQmhbH!T)%$3%3C~9)#OlwOTgt2qsQufFNN1BqGmIx6Utu+xj7n42m#tB?R zYeYnmfE+YLmEw>vB|f;sWZFRxEQYEgtuoj3^QKc&8S3`3>9ykM)~?S7@M^vHa%Sgv zuU1{5=D{6@=F>sGzB4JTsc3u~))C_5!*AaMkG@r}{^IoUtJlBz{7+1@c1``%X|xA7 zZpEy8eQFPO2Ek$PecvLeOsT4Oez{y{d0v*oEVCi_dcCUa&byH1TAN%TRRt8|rC2#{ zg<6m>(UgD%B0wM`qySNpM<8y1kG*$RVOb5s~zaE@Zh`9BOpbh$HQ?ioU*th~Hj4Viu$O6p9C`$YTg@7VT7y^P;Atxb32k3=76ElDiEjzd9!#j5#ygomD>pR~& zxO?-z`EUQxbbb1N{4f5&BNoynbd?^cWR z)$2#sZ`|H_{~$Xw!}}4|kzb6ulW?(m;rU{Ax<0%uH*bFX_$iXTp=o!0vAA_G8dd|P zyTG{Wxc0txO&db%jkcrMH{91n9z$&U#fn$dFV;_=SUaffXdaXcMFiIDDL4~?9+ZWl zE-M0e>rA9;wDgKmNSk6{0i<=IKbwXSqR>D8&Dp{mqw;7wdX7+0BZ<*?e($^WJ>1cs*+_>Zgh@dT*^659boXV!r5ISC(Z}l`(|X za@{n|a5w-|Mr*5eW|T&8-u3OOEHVw!_T6weM8xHCnQN76Ro8Xu`Ckg*YONXB^}TmK zgop?lNhR@5q(N1YqPl592t`&b7fbI$*Y$Z>q%A{IVVe{fn6oT%eYb8K5z$(yjrynz z$K%Cf(L3+FM?xeu+1-8k&fB|tdm+Z4RfZ6P7z9)*6{%mTOt(rmecz)X%=Bxn8e-_Xj^vfB!%IUlF9S_Z!U!0qk9{Sq1{$`?L`N zkYJ_gVnkYF(SdRDr1N&lIP`MIMT-UeZO3-l+sB~NGYX__TI-3wJ}ko zD9bF*g(Wg8rL{4nRF-F2X%+|}24(>ut+mNQWMeZT>U&oW2IHNBrth21*`oUOXODjQ z$*=Xh@4x?E@cb|T_|L!i;>)K`pM}V~yZg%6>3lJpuYy2iP&O;7A(HY@igHj? zgQo3I&n{T7ZM!4^h@`AB7t`r*JWTZs0(kGOHAPNX92}n^K7AoO}G_)y2ik z`2a`&B!J8uLIlL7>5R=3=~N}}?;RlEY&snchU3x58WVh9*K4I{JQ|bMNgtR6Q}+v%mMVz!ut5RA!kTUFI?v6^?T z8w>~2>8$HoL~wmyl~o8)YeS?&00^};+Gs&3%92G`IK&WROd?RdOS0XDh+E^1B4#q~)&KD1O-v$cMH z(wr~)JcEa~vs;r;^2vV5JJ$|ydZ%&-#F2nmxl)W%mZd4wfRK9#ieSVTCoL;)5A z6rzqfN|Ks38m%I$$P(%_>jg|chPWB0F)20(1O!4N$SlHwF^cp2;K9SAqvI^kl8fhe zzW41v{nI~v^61H=7?y+a&fekO558O2^2zfTFP^>t=l37JZG!a2C;H&9nC#lwv~CtV z2W7DXpcdWB=j~~$eXr$gI8;p^kEi{IzxTI~PFAN!)5D#eNygpsq+Oo(%|f_Qih(c+ zDP0xim|0Lb_Wj;y5WAK5`tYD!uENo2!Ft5HkHoArWkbQ8$T^@@23Pf&NawnGXSk!- zD736p5C~Cxh`kTJ4-7!s&X+3}Vl@~Gs%I}=F4pzl!Qpr`8RVz|#^d6_gPWt>Thr;X zZd{g?&czsnP$_MU%}DFshxu|98I`tVjEkWUUKE+!nk>tTeBHLBG%3X#o3@!w&%3T~ z8V5pc+X+Jq%q(SDc^`_Rur|9?aMM~FV~nvxrt2MPrHu|T#^lC=xLhuk)+`buXL&xK zFRI}{X%mvC7$7rdvhj>*b6j5-@Q1n}7KG@4t1U z(9kq3Fk7u9gk*lj9Fy?NMz!sYH?3%`5rKuB@7u01Mkn->HO5#SnbviOWR!wc1CJj+ z{mD;$YO~A-R!TpA_Wb1R9CfijsSu!ZlE$?OKWvRwT9G0_av^O#ltA{IV&f}zl2^jv zrS$%ld+HL05R_H`@TY(N=TDzLd+Y6oc-Cbo%|{jh84#6HN?~HH#>gB2L@N@G z5>tAGL`aAN$Vo4eqe868qR2Dm=(2HArxiV z_f7<~$%K@1-uZwc*61R)yOYsmXGjoSx6U)QGpY{ucT@eNwK4=v8y-D+{Q1)_LKY(` zj1_SSoO48mDAYH8sx!6*kx_H5xu95v7`=r}erqn*`WcsuCvOJcW`pN)s!x5AoaW>i1FcUauHzFSqJ zWv8E?w9k&)x>*j(<$Di@yMx}fr@NEV+;f*qH*To+wW?MFCKrMlmE^K--2q; zzn=Z_qgSWL>yy`~>s6z*Rn|rXA3~Pp1WGX}P>2eVgit^TBO+gsaoNJ(V%YYGBsmum z5g_>JaTCoD6aHsACfZsEhzNr)5eX{CD1Zt@fsil(Cl%2iJn5I35u=^%*&5J3zQup|~NZ)yx-kjNng zR7f0ZNdh0pqy*_QauN~(5+Wy^*d#YeZ@h^x5&}dCB2iF)U~3X#wn9v6<$aL8rpH81Vebzhw*4uACcF&@-4VXNSEM1`&kWGsn$1 zP3y~+bY$L0ql0)Kj4=opVlYZ^s`p4Sz^m6Mzx>s&KL6s8`oH|2|4*5v+-8HS+SwVE zMbY)``T50QFw)wZWbKip9+Wc1T5D6kE(9Nf7hxjMT5DsG6e5vQsp^U`I_DE3L#_n( zOaFA|UDvkGxy=|?ggK@iN-0f*fSX1os`ShnNwI+Qv3H?$uIYLoxc7mSDhI>SXq@Ny zd|vCC!JBL(rrVFb3wxk)w0od9RHHA_if^ z&D?8qJ~V7{|I7PVlLisO}h1(bff|<<*gDU!-fRh`#^IhbSWu_dI)vyr3%usTEJw7^}PG{QM#(NPz+g z0eH&;P1#Z^8EI=?4+=p+qOb@8sMMna$csv8vskUy>l#T3n!a-y$#>m&P=5D=_ih~Q zxpr*`Xq!M25uySlL=u*5*oPGG1O*XdjHx0J*{Y`DMp>FRZb<3qQd5J0B&}N9qy@Ms z#7P)=>(NY@FvW-{vbk0^ZS0Mgv$pwQv^yA0{^(!*n?L*Ek3aeOufX&5gPR)7-p)aA z{OZ-I?_vZ!Fhzdvf$2SYQTfPD4yZ72?*@%WpZ(&a@$UY3ylb^?PF~%;fBn6`@w?0C zpSfmgr5z2Nwr9)wXk9m;3ZjvZ#1evY#8~BdWfaOf%jZQwA!b1g>KxR-OF?=lD(k!x zg-i^Huyrd(xD=_w-zrpq5Yr0SxC?Vihr_F9Pfm_b9zQ#J`uynVWO{KiYwB8|WC|vu z^2W8j8`lqaCp$LFBcpS1G#G28kx+mo(TITrD9cLcB}RxrVu)I4ZHx#qYh#PDD6F*r z=zVam_udVLgBU~CH5|RsD$g@QaG_tVm+RG%qtC2X1kUv!JRXhOw#l=n61;9*rvc1EMB9GB&w92!mI(csR_8#|++ zQB-7EvtG|<)9Ax^I0D2Fg9||$>mxJZ$?0i`u_#MpG$6PTl~$xQ5;`Aa|M zx{DA2$z)kMKwZvP>$8iQi^4#tEtxzpv@W*2pD&s}{j)zkIXUq`vb@Ty0#rdTAP9mJ znAh<7bbfq%h6IB$-y|7q`xc-&q>byIh)S6UlweGEPZtu!IZCZLi46xCp7vU}_H z-OZ$HSg5Mlxp95x_;ejze{p*5n&!$V8W!74y)uqmh^C9{^vTXbU zl_Er>%@zCGnvDQpGpkw05K}ZIBCQM&_I-y$iWCAx4yo8h#I|jX&4^G$Vu->i_$X_% zbCBr9>!wKr$K&&JI~WFLO6IhrBt}fR_-2|&fS`~BacgF_u}}}eH%;S$SBkVYTAL)k zm6AZ_xUv38B7@%m{o2|p5hY7PW)4hI1VwFo373{HAhPvU-IyD0cH9tsm1zT3I0hdP zIflM%n#^VdsEr0vA@5c769o zk2m?26FV9Mi?kI1j7J$WPtR90J(=w6(eAB_FMr-O`1ZqZd8dBy-~RKDKmK*!f|s?X z(psC8s4x2{=|e}niXni6y#2=634L|;vwbSw=o2xA5YmE4igXE8kzVWaPjJgjB}5b! zVcY~a5oYI{L~(sT7!2;*x&7$LGt@RKjJ1Y+FT%T%ore$KYMO?bg(+?1DSb&TGy>uc z@@e~a5}jr%o_9q>?<6SWZmkP-3Dt^22^Cmhu~Z-212 zJKmp+A3uKm{OQXvya1{@M9oypxsR`P~oQ^!Vu)Kc3HCxh&kf{;*d&$BSjl_1^A5 z@0@o|g`m1~ZjUm4Hi`4xlMnlK%(^y^cTARaCZHULErWtn`nxfi5LObl?9;EWhs#sS zd|CPf^Nx3>^WF=aB9O+s!m`j8r>~nHFJ{`e@U6RPxAy=VU^E&7SrGODgwXoHAxh`gP0Iq)#cD7Zlzubrb%8tI zr&F5XQ4_rrBcGm67i(woaxfY}U9akOA41)9Au>Z^Sc3p$d5%i?5ROhxP}ybOKYe+$ zTCH+T!S~JwMm1YCKqf?9uNIlY58i!PRaIe?CeXN%JrE=zCZrS@ih+(X08#`N03>1% z1*nt)5f%YNO>nrsbFjao{^39Tha6cLj6#i2RaTS9jG0fT61_yHkgZ0ekbpV(gT37{ z&qTOuo33pjZ6zXF5r_asjzMBTV5P_yBg|hDl1wRYZkBEriGB9Ss;jGK`X(T10Ym_U~b(I}Pn z#Ek@YQicNzAqayaO{h{)xY2vVZ@6otL|A~8CT)@hR;m;ff<{mXgrJh!8*bcIX!B&7 zf))X!Z`VbpeBVUZX$9k9IT;Os<7&A8N#|Clu~vvN`rZ-%2Z=Fw?_BTtoPA|L=uiDL8E8iU~G+2B37bGxKaX5pa>KRvG>tA2@YaUlJ1=ee&`X_OL5cK9kKoFCo0b1mB~LG>ILv(uMx7N=+3Y+AcchQqz#jr--nZOq3{ ze)e&Zjf;Hzyb`@YQrBNnDZ(I8Vi0C#_93_s0m(7+mYR z`re(JfAIUiH@i5qS|vrXl(=$w{w-?%YN(U#EsbC<-@;`?BvOc%l{a0UnagbBYQnJ% zrEvA9_(q}n>Vwp*LGPIv%W|-{dobDAt;$ioYP{pcqWhtpN>+3X(NIy#v@etMLf>e{_`ZXDkFhYIDtIPX`dk=QT zYNf0{yml}g>^7^mo~@)?#rmYeW~@7Cj(Gk2aHoCyz8dWxJUhvI+!eA+hCzEl7sW?W z#$393VXCj;vU4H7eOC#GmZVz~qgMn4vTR`U0qIPc!epfYh8RU)G#C_lu9XfkuA1h2 zHhXn){QUW;A;lrGFfbq~Lamimpnc~R>daUOv8&e-y-`F2Hn$8R#vU;mgIWWK3$9%* z&a1-g?hXf~MG2bXcvu`B?7scr@b>kC=)&3Y>lmCy34Is(Mxv`%i%hG#H?NNe-nmG`uzCy$#gnf zpPWoz9iL^zU^vXP%(?(B#=OYLWOdt5Cc~o4Z802-#@b@rN79sM%8LS0K#Bo<&KDYCB3cy3gTk5DzXfSE~e9_ZHLt`;klCDMVi9$ z2HppNpf!M26a|<;6DWkY?;Kv=->c`d5QRmuJj?Pz0NcK+n|5|~tc*rdmJqd3S|!Yt zR$#RP&^|@S;3Kfs1~(QxS0#~gW245509lp|heHwR+NN!rGS8Wrg(1y15!0Sk6$K#0 z7}KCC?TpU3bn#cV$_vASh!_Q#2C_vume~4^z_9T20W7rtPE4`^! zV}#TX6OdHi3LyXiGWc)Yb48*^+-PG6rI9EwqiBFj+?i~PR3U}Jf}8z$TlI?H8Rof; zwOdCYcB;vPJ2&p$z14N$CqMaVWbh&OUCltGOlB1bVF(&C*x>sj$5^kU>zn8oeXH}l zP)bk6RarpW=%zzkppXX)NDL4JL4-s!_qs3x1uE9gs90u7*sYt^R_GBK0wbd)Pzj3y z5xqhM;t+abuj2~CS_h1rBV-AdwHdC*C=i14M(fl^yd{)PK)7wzI(kg z#f@Rf*+>EQ=l|lrYv&i=x_2MmdH~DC>t~NbW>vPYGgB42WiHITnoIra`HL4XUc7ku zJHPY0v-8#Q@!9KF$1%dNx<;hhwkJ@RZ1>bWNHHS?nE&Coly6;@xy&466k*L9vUSpo zG{z*U^vk*s-z+vkgvb#ASr{dP#1t3PSW_v5N(F!z!)Q1#S{bD{gv{tx7=){`&{~Dy zb(y)YPfHXr8SIK6Ba*&iEO>dS>EORsTwaF!%Ov1x1Wj+@FFPAo>vh?hv0VM~@)tpr zHAVCg1D?;9#wcMu+1d5p?e4dAE4?pXpES>3&cFNJ@4ox(Vsd@=#nk`opZ)7mng54> z>u;#y_WAjf*MIWKgL{jI4<9^u@cv@8I665xIX%s+x-XuxlI@2%zn&g1i|qIZw{H7= zeSZGze0sK99+cJ2RA#N|@7~|bN8#D4)2FXG$wsJ66iAa^L^T+d-iNPT*O*)nF>SBE zeFh?5(f*+~EvR*OoOL zw7WCL2m=EjzH`4>T%4SqbgO1C7#tp6KRP}c=A-M^Z`{3iJA@G0m5MI6xN7StePnUH z2c>m6D6-sEWn>81p8$fL>0!9~{b3O#a5s^G|@F0v@<;s#qrWj&m2AUiUo8FPqx~P0xFWb=ctaL)~ zZB5Rv2;vS#Ljh>o-no!%QOE1L$*oNs^3;zdfXEOTG@<~4Mik)?kQC+$vVr=K|0n-r z=OHp^14&1B-NAC*{eS-1KZ`Dq(k9D@AO0K)Bw>;0J!!oSqF0?< zWjGww>y>k^s;a%cJ!|ds;@l^~;$=?Fo7GB)F?axE5n)bAG$Lwkl3Z$CH^y3RY>Ly~ z2U0}1scs38l-W=Nx79)_8@EI&VP>EFcQ#K>%q%PbV2veGA;cJ%kZ^<4AVB`@3oL|? zwyjjYqzyMlR76`4lWc5YKoEgaYiWBhvYBqh58wM%nXCD1H^w*~jSdg4RXLPa|J5IS zf7P_dCugruPMf+$W%8o5+6M18(wmg5**V7GJ)E8`j!)*sWK}gV+Bz5NbraD>Bq8B6 zI8?+5#?7Qq6EOB2bt{7|3z4{v-bEiodQ7{}wC{ry|3Mfl|7FE1|Uhlkh8VlbV~ zo$JPUyq@GAhUo&f6=ljlQ*6!{e5<=6|^F^n% zKD>7S%ST^4eSWcbaR2q|*QH?AKX>}6YM>fvaRfRG62gAibm(f7Xd z!EAP8wXTQ5;qBWuPtR^v)xcWod}!M6&Rh2Y?h(RbdfxZ_aIPP66hLa-8SvUX|!`C2-*Rf@zAd|4Iaoyq%e z-&}SyTeU~WXUrT!Y&?gsIGe3{*Oz5kmDPH^UaeQjsw)WCwl~%yqBa(oLu6)&&Xdxl zmBoxVs7^*wHY;QB!~rz0gb*bF3aDn?HoYs#swi^q-PvsU`J-n|ckP|GuJs-CeWw+b zh0P5J07tkuzc@QRab0(Kc(AvBAOO7&h@_3-$RS4L4Kf)KNJIl~;kz-CB$5&egVA6t zT*e#$s4SRK{=fOp{-YPKrY~Ncac(t-*taz)Wo@Rl4gx+zg5<=T zo@65`ivUg2IOk#r&APt8bEQ<*HZewKWwa(Djv)k}G!nBcYu0OHjMj>`FlMc_Qaa1B zzVBmX=X|OlO%L zxoY=!i@n`!I2>wgUcNr5+dc#bBFZ30!ZHXVp;kx~L(tlU-t{ctJa?{bIwDn$c6<_A zLK9FT3M&B+;#jEA))$4e2RkyLI;@YmpH-AEMIw$tDN%}%7z~RBw4fD`Le>P4fDLFC zWg!&V(#tAFh>?U9p+X=+K<|UEgI|Eu#)NX9#)E99Xl?sq(LY_S22VeGhM4b7_9(d5 zFHZJ`#dNl88=nsjcW?e~y;A?`kAMB~|Ly-i*&jRK8)J&1P*l3Ub3Jl2Kl#x|ns_Zh3UV3SzZM5%ur6|j?4X_}_ z6qc?Qg;!!Ka@=U}ZpD>3g`p54ko3U~@~Uq8tkgx89iLrH_6p_@gU>QMnd~%eYqP9( z9#H}CWsaDvg#f^_Pu9PeCF9ouC6@9ahZ>T`WhFsP%l^IM?Vbzf7h!jv)vP z#Ax}O0xEAV>aPS;C7h!o(Go(8z2Gu3b97PBa@8t~gpy~P(FP#jW7`F#0iYM)C=o#? zj++SgZn--dJ-C1C=FOd)00Bnhojx|_tEGVA7|7_+aPRib>+ihvpwJLRLX03$5oiQL zV2&YzF=g+72=;cXz1`|^t>3=2yRq|Hp|y4}$a4z_aPQ^>0M<=hHQn*q^wsg{V$})| z3k1)oNSRU@iGrZ=yvjp}kp)#=6vkTHHVuQ=yt4UlwOSmXE!1r3eb@J0QRaJlD_ibp zZ6g{`xzcEIvew3?S+(B#$QV3#-iyhH#ux^PZR=tT&Zpi|0>Pk09|Cby+S<&BNQ^89 zTG`HX@Ql$r#|D`YO;(w_Ko`NryezHOzISckKYsr5>9c1qUfyEwVv-WdtkEPfa`a#P z=JOcC&1={8_Ya6DvM8l;Qvv`fmFljPNpJj6H)dYowiN&XfB;EEK~!-uihwd^GZ>L5 zelrJRK;}(TS6hexH?HsQAMPpx7qk91UwnCdav~hxef#bCYrYs6l$~o6{eTb2j zMpDbJ6~N(eh@{r*y6asAsFaBzXhbB6z)8^{#27=+MZp{y1TkSr5?PN#DNgtlfEZa= zh{zZN3`J28sitluGHM_|4vbfz)mLwc>6~`4&4!DBnk2>q_`G7)B!Fr7m9$tBju-)e z0H+tHncB75sLV1;@Lp$jFeolA*5k=wGFI^5K9D{+zvz0;%%}i_LkJvY(`ZGEBuH$l zJVb7MOQg!3N<`YOHlT@7L=g}RphSeA(QE8`f0h?;`|e>y=J@&9(z7m#xK+^s(gMUn zLK;{R86-mpgse~iG=VYTs-h0D>H6q`L{QmhyVEh`A5%Q^@GVfhllSe+h%#6`tyoFtAbgM zUY`$#yL}hD?-8ji2Z)$5E$2MZn_Vw`xOtxc`?h?qwofmEB_eq5wa)WAN5sVAN-vR$ z!mBgX%dncVw^R+MfsBYCspO$#YzD1YM0uXOzEcE|W8|0@Sv43s=S`M1t7T?20&Qz$ z*>bWVgg{#{7`n11zbTp`04B8E)wb=|oV0)Iui#3NidV{0NUi6Dmb*MKV>BQK=Ez|< z8Yf$><#M^ZyZid+`2Jh(EEdb>FOQ9}qtU3Io_ojdzWx4UHvi&_=Wo6B!Tr1MKn&~E zq8i`aJ-CJFe)Qu%`Dg$7-~KQDlmF=N{^$SeqtpMYZ=%9-I$NJ!yqxTh4-WT5@%hEY zcr*gx$<9HMo3oSC+1Zbm%i|yY;)~<C?eiF2GE8Ojj@>l zWl119?_BSlV@Q@Y>$*V^!}$;a46y>en9fK0hhAX1T$zlFcA4s9b2={Zdmp^LJ05-d z*%z;m&b1l3m;>#*XnOWRM3hEtNM)KbWYw?g40uv%^2>H{Qdzliof$vr-Er4Ogsdzl zgK9T3l|o&W#qRzD4EWh`-_ERwO+7z9J$mcTJu=nNvx~*TfArB8AAa!RhabH6?D1#U zuZ>SmUq5^P^40NTQ5(hynnO}XVNDb^EDqUnIe@g%F>(lT8|`olg#PB4_t&O|mnv(Q zWX-R2cQ1qJRa}n<+uU5K*sdg4N?i@2sW@g9tL-JL{{C^7)ll?=|_@?blH*#`45Uq9U{3kOnV@!;(@B6C->(zkj zeT;E)c!-$(BTz3lw|JK|0zxSQ*{?mW*FC-+KkS3K8T7(S6KvXe= zhYxO_ojiN~;*(o9cf4OcdG?|j-<~e}gX=d$XU|`s?%%xo;N1_W>lSS}njGYVaS-$j z+GZ@!dtW!}{lkNzDAwzB-}hx%CPS?R=f1eOu+|O+1LvG`u3gM`tU-wpiHTUDfPe&) zV32cT+otQfcyRsx%cE&A+*P@*!#OC>lmlB11dK$ai0gW~yF1w18;wVUEX!l$>BZvw zd{(bJr8FYM;Dy8f?&QPw-@CSJ6T~q_h#{7lO3BV_QGfpA^}&r>A%rJSpL*{P4i9|@ zFJ8O^fID~Zt=BaYz4OjHv)SzP&wo>uxsq_>`n8+4?g-(NXRjYUecn2*hU2DlHYD5R#aI);cAlX@=T$ zUCK(m_e6N9(Jya;#ztU_-Flx58i)p{~mBugm1rfiZsqGi#fAwW+F=f@qQ1cYU7c?89U8+T6#2AZ0SEX$o zoSrV9y?p)Z_@r}D+Z;7{7qe`DBtFEx_X1!HDy6kn%)A(5uk9wS#;al^r@X?IaKml9wRufqjnY-StyVa-~X4+W@!8_?@ zTGx}^;f?G0{{9``siyHUD8!OLCle*NZcbKb5*>#&`Z|Wzxpm*ezxeMzt7}*;+S9YC zwZ;429zS||{?R8d>=&=PzF9ZU#S)5&R0Sw3PQmud+)^|E2!Ne;F~pSQZa}6CTSwS$ zxLtybzB&nm$l)rzM9#l?N&x% zL%XBYdJQZQtRiFuqPgwXPhZZ~?qio}(a7E)8;x3kh#4YVRVf1}C-bw5C1t~x=k<%{ zFHpjb1G@M24KmquS>GCI?q|<`{nJ$+@4xeb@wttLKr2*+3>iDH^1JVS>*s&*>S#ZljI~7;`n#rP|7S<9dc;p};4k;9Q>3V;1e0qFzB1|EW>!t5qSr$l? zNXJ2-ZT;ElEVtL{RdcXc<`zKI=~=y8%;&S&Y`K1ZdXc|42E_HcM#Op31K_Iem_=Tn zELZCoW8-4mb|=%t(1pU#HI>cQ?UQHEU%Wa-ZOCNP`7$f2ZUxmn5 zAnOP)pPucE#(Vp_&2k3O4Xe_}s1>c-Ix9*5>bth>LuJ()VcT4VD+V%u$xSnY0A^KTw?1f5Kp}w1fe;AF(NGW~z{R|O^z_+p9zBkL zv&G65h0aSBeE#x9Q#S;BG?d*RK4m@@Noa|c)jlH+FJYY z;lo$2UNud#Y}>(LU=TTkwypsnsr9bwg*GvYk1<}qe*OLT-agzb0KfyZ9o)Hd)BAvk z%IKmng@(i`j{xTvD*!m$8vN_172qIXE4UYFo)*VyiO4`F{0)}Q|P`LiQ*<>cnO%dl6w z@o>1`&W|z*iiCX|f=9)}OzjP*S-;LR$k4}r9^hiMqwc*m+J9>Tp*I%CI)DcV);sK- zh-V$`<42F@(~BF|_OBfrF6xU%U%q*97!iK!y|YS}7Zi(8jBBFyq~HlN2BN2AeTT-9|`cO5BR4Tj3toyo2?RsiazZM%N4 zSn4eAoePn(EbD!=nqmYFTn@&BAk1ysG))~t%&g6_!n^LW#r;1dpyKBGd~;e-wR#z1 zzZz48QcqO2nu(Y7=w^C)$wA*Lrm}30M+Af=HI*bOG9`6J1VQ8^c`SjG*lcp+OzIK> z;A0d-VM5V1-w~B}&OLj*(u4f~NUSw5L8qi9@d$u%Wo>zKesX+qRPC0pPEVhlE`R4+ z?;tSt%ad2rAawWky?NcAFHY~?y!-sKpO5ygmE--0I-=HDY4XBQ`0|JU-Fkjn##nIi z_(zY<&(B3yluV3HU*~#dpo{bJN+JASnY}Oa^#cXlbd1dUNDu(57 zCw83)oNKyu`{u=R?z(lPMp5o?2v8E{q%$Ce86rj^-@AoxyC@!j0CJGbszEu{onJ6V zr4wL-+b+C1I%`|k)b)J6TNTB6wLCvNS+7>X2hUuNc6$~OsKyfk^f3b9V7wbySXrG5 zL|(R@8OzZ`Tcb3w%GO;tU#uG!c1OE;S;=axwRTM#f?G>iFQfO)XkAsgcOF3ixAYT=pumFRihJmQO$gYpu0*%M`fOr2BehC|7c~q%FKR8g$Ka*)8hD z^w#x*x9{D0^8ES9(W%bMQdca}c56j)cJG8wBa) zwDR&GzA1bG0_Y|{-+N!xWtLA`fys0dr<$z)Ytc0RPzxw1yCoWU!vE0_9+zg@!{ZRnDX&b(f)PmYgW zU1(p&zKJm|mh0Cir(N$&mJ4ZRECV7S;}++Gh#-mxBwn5fLKKcDF|*2doo_p(A=fgj za)>_oru9BDS!?n<&oZ0aOgP5in&^z7`}c0-RuM)`YB^tz2E+OEL}RelUcbKg{<{Zv zZXTSSo%MbH`t|F+UpwapMRDWCjlI1+=iGF5{{FY$X}fjbyTM>EnG`O74^ZYX%wg(q zxm=A#qrIUKfY!t5$&3IN^ZDb)kITIHtH1YGj4_{m_Swb7^z`)1*gVV2VVR>!nkk?u zb2S4KMVldMiX53eGe=a+As~p>q%Z+OBOuOaEs!!8Rg9yd9tmT+*df}zefX7%G_uEP3yh2U1suMs<=oJ7|*P3^ng@t|8Rysr=U2Je0Q&b7Pypdze~ z;d~Zb*R-y8;$7SK(6piNc{*MA-WT~n^ux!GmM@;aTFgD_>p}-)^QA|RMR3S5ubO%9gMi|$J%1u@T~$>h8`adrFNy?ftz`0>Xd8(zPE;~q%8c=qXcfA_nq>GAIF?!&te@@i7I@%8cf%jYl8 zUOmn=^-Vn-6#F0C=$gjx97PSP{Cw3$Q6kLZK{N;xdB(oTqXH)=#uOrjb0&Djo)j4% z5g;N`8oc+bb=&to#<*D497ErA5~H;?%L_u(g9@Az5N)i8G;Jp$sEkN-KH9v>2tx=F zP-nUGo|zv#eU79UR8bAPz7Nb=Det;LX|+P(fP$3U7<{uhD@rQ>hzdY)QoBsT2>3=! zN0N-}HuhZY`dltEYpsYRd_x*N06<+gt95-D%iauCB&o&8S2T7I5aZ6UJXxICOpo`+ zzw^Pn5AN)-Z`Si^p^8&11V4dESqNUrZ!EW zdi={{>RRNB$H!-9=f>vCdVO?!y0bI+@Pqg7-yB2_ZO4n{>f&O0a(+HvtU4cTQAB~x zdFO-D21%h(#u%&hVzC$u24z_`P1CeZWCo->FSd$nn*=!~&r86o`NsALr7DZWXW$r^ zV@jSagc3U6ED?#3d|;CmSy}lg5r~mC6pnQH0Ro6oARH3=RuLuJ8epFrlF%x47+S01 z{?5P}JX^Vix;F19`GX?Bpem}e;OI|JjuGT<{RjU+SyJ10;rR6F(_vX&oSeRO|3Og{ zlSyeU06^bEmcj9HJ)6y(b9;MxH*Sm*8?bZ00GWl(L(@2|jWI|Hw1U}^fA#Svj~+cP ztHHyEZx4sV*GEUspTEej}3=f)Te!8zZ0HtSHK&aI6GmN&*+@=1U6%R2*i>-!JZKmL>1e4$6z zrZR5wYkhfRR!h5Rfn!n9-Ma_(?_bLcnq8cno*YRCRh|v2d{Ejlrx@F_v)9w3dCB{s zp>^Fht!w+(^`Up{gVc3zjm>Q?BJ0(%S+C2Y81C+0G$9iA-9?_oYX`$mKl#;ow14f| z{jSv^W+5sTLGns_rFue-5|R{8652|rZ2)x6C(4i{0lZ`aCm?YfcfNYNRJ!?UOckZS z&ak`;LYE;Y@maOjN)c{UQ@%2AO#`;y#s;%s)4H9>p7;Lr{H!bow{G9*eR%r(`Qyh= z=8NUJZr1DdU^vp+^nG7crOvXZZ5NA0y(*#E zaL%>sWu7UmHk_HHe3FXJzpO$P!5G*7tj09V8i8l&pd7f>Ol8s{O7RtAs#ihD{FVCkjh!jHXT|h)@GXadwl}ZVlz(XeF ztcj`))UZT}mYq9!_2uf~g^_gz`r7Eht!sB)zI^iHx{@0I>kB^Ry z9z1xkySuBkRwlpk;9bf}TNcHz%m!IC$_AAw3iafRPm$Rud;i^UKmN^&SI6^p2VFGz z_=ac8UU4K~1c`{fP$$%Q?jiuGif|I+kmC@P#=-~g2{Ea0MIVG&5ylWV>ZBk>8?BUx z^uarhKq!}Dt_gF17($4V^P*H*HBBP`O6k7uts>X=q*Pg!0MNE=lvw1M)rzBcUF}_) zX{w40BzAp=Rtph=MluKnK#OQZ-8;WggxmCVIn6y&JMe2v=;RBcl-k?d+uhww)#`G& zJUu&4ilASqz_tP+S5nx`T2;XFv*XID?|%5L`?qgg-y0yn>BVwYH=t}@4Xc4M8VrEm zvQB*vtuX{)=H!Y703oo^UvH-3wkZ6X_TT2GGm#(u_|xBf@ukUfAT?hsZC2d5b@S~z zH}Blu1Avb|dHnfrzK9}aH3X%6h>S?eC}Wbct`8xEpp|NxrYMTO??VXV@z@xxv|cQh zsUE)!sLU+P3h6SSUIir;Mc(&4$EXx3!r+5*PQ`A&5N=o6TALLNii{Ohb=OBB#zf>G zL1Lf{C_`a#Z$%)j6oN?b96AlLvY1iq*VEXq_IIk$Airqg9ImZmZnRQ}&h=Vho}1_$ zNL()F-}&|j@4kJnv;Y7u5t>+vY;)jE8_GgAZOC&?+teWaEJR=iYrr!Q!D1ah{`eCB zJUG1OoIg1|?|L62`w*GM`M@m3+Po~6bv+!7IffW~o@L(kG5FDNC@fv?ypKQ%NeK|3 zG6-X%*mWUAl0lVOi+xu&-CBa$AKzUr*ACV}X5(?(8+hwZZw=8l z)13J1)$4iP4R1Yg`RL4vst&FlzLRBTSyE;gpzWIFdNJ>t_S*h+Qw{-jKb^jK@$B^U zq;n0$oa-vIs&%e+-Y2_Zq~t5!wq4)#igZ<$)>!ZSx^06|*KQn~pS~pNC&OZPF+DuI z0g%qc}j1iUD~ew6~euAOQBg+YS+veln+k3QT`lK>dcg6)v3{|6KuC zy}1!XyxQ`;{GAj~uS(OUfSMJQ< z(tA%z389an@B83GRhAs1QK~A7#e8Oz%Cyd`84m{6uN~gGbLVh>($x#2H`>CfFP&5x zzA2if|5c2fG|MibNxwDv{YpR;;1n`NHXb+0FJKc5<*H;7Fht%Y9LyXM6YY)iJWGPw zmmh;9_893+j}SOHooqNkA!ua?6-ST=hy+4Pe1TqA1>OtFc-sckJ8A;UpxD1SIXQaz z>rkI)KOLETueg1FzJ5JBL#yuGy*nHZU%q;|UazackVtjO%xb)omt_(UCsJDB^5V2v zua?WD_dd__s;ZLQThcmRtyX!S-@JMAJKy=vWHR~LFMjpmcYhCUt_w>Rz(z75%c9ls z{ck@~Di z9c#x<7!tcFomz#|_q{bnDb38m2Vo{6(iAu-tz;wS48|A%jFFX6&U>wm0Q9{hMaE_^ zMyu2oMi-K96Lavc%M7*kLP9?%j8za^3leo^*FHof0R^H7EubaL0Ck9)xvAjR^4b5V3O3=+Vg&_4K(KvhZ+QsjujRx1RG0UX1#C(mCzf2EXhPWs-T zot@|9Km@fmMP3v+Iv+xeeJ@!tYFvyyAOM3WASAO~w}==*M4-%OO4|@6gvh+^-5L5h zA{wJbIG{rgS|LIRvL<1piri==jlw4P{&x52V*Z-PDh$Bxw^j9NYx5;lb^9 z4!no)5ZdLSo|ilNxac)e>6dXlaIfA`uM2tp{#aFb5}yMTCV4_ zS&SSxaW_~05 zdZn2A8t6CCQi%wJ=JN$9Qx1mChhKd3^B?{6r;Fu!vbT5p-u)0_a^VP(o3^d0svK0W zj*ff`Ap|1TcD+(c8xmBcvn!Z4E!o&M}ERi#3Ne zo=+v)yET{$^kDdUIz5@K^UNr1WAKGF7+kx!=vUJ%Dmw}&#w-eos;nVxEt3%uQF=5Q zJ$v@dOExNZPcCZz(Qh6+cn~5y{_>N&D$DVx7!GWe7nQX(FBSg!FFv_-bDt;%4uhSY ztgttSlfA>;&%Ze7oeoZrm5NreAz|eH;r-pwWa1c~JUxH>WLdAh??P}DmSxhQU;*4p z(Fp-+6#zmEF~sD&ndgPI7J`UGU`ZU|zV!?s0$LdW={wH?L<9`J?+7t)R7!CSZBuK7 zgQ|e&T)V7i_04O05AVHousihK`r_U+{rBhQbgb0dRCKgt!sM_g-tGjD^cd(pF_N;fdw9$C%rdu0H(3 zzY~FMQ3VFiplz;gE`nXxzdkv6{_^#@X?2zxo2Ar3DV1h9)>@^=8Vw-zdY##%z7K ztKjB@ZBcSw2#W_mfK0>+B7hReP&6_E_kc@HO{T;mmNBzkVmO zdh%*!c5b!-y!XB9yS_t2Z4Dvyu2+h>wwcc^j$XcO)~ns!-Arp1xR}m&Cc9cIB(-jP zWi*i@rILh=4^9ypg$kwb`z$l_MR)Z2$or_Zt=CQ4^uys;8OtoG>?fr+=tpK{b&SDU zljj)=BLWij&e=RCrL-}K*mYgoHUKir*~-Z@! zZ_Kx^=eMrqhr8z5UjEj8G3uvd-QIZb#`Sk^AM6jS!Y-!ES5J@6UrZNIPF0KDygPpM z6d5Mt@x|Fpf?hAy>)DiI+#Bxf?q17P$t|2dJzLGX=nMz5n02pTUYwmQ+Qy}*#sG{W zC=p`d5TYNA2kUyZS}$3mHi`(8CSy%m7H!>T%H}5TYBw5;XVdv)cc<;wA}+>0#$Gs} zfI_9TcI>0b#@A0S8B>6G*(2BryCZ@SaI%3&dN+j0LUd~x0UM2>OPRUNXm6{~oTh+y zbs(DNr|H2q7`%x(8@$pc;%*u=i7Ns?0#pn}pv=dge)f<5$^ZM;pMAD_aB%I$P3L@M zj*&?zAS}vaI-8PG0^pqI$Q)TKEdolZR5@yGE^VEPq6AWB=NF%U_W8HJ^KDWZaN~4L zl=RWA40qFLXzP|510#Y`l#DGzl4lNoBW_D1&F+~u;$B+^Cs3QuViRRk6bC_ILEc!? zASs>&j35F61#7bnM|??HGzT`L?6C;J_E(Ns50-@D;(SQLfpd+&XbXG!Etm_ZnY z2>?+s=n&KHO5Vr1?m}Rt%*)qDqw!9N99eev4u+$h-o?dY@$jv?Mq}4?^Vw{AK3&ch zUER8-+Zl}ewy#%fVL8}8I6phnipJydod<8-ne2=TZOE}-_RZ;P`EoITadP}+p7E&E zzFoD88HKh`UQ16%5Lj{0z$B^u2S7zC3ydtJO`aE}F_t6ueW$E$T^~7S)@r4a7C})I z&O4JbU>xC%Lve-W`n& z_x49+RT*Oul`wH6VU(y)5FHrU zN8k-9gBgh+JFUFU+>rcrjYHdsz35{dpo~f{`t`-ac{%9Zwcg)m97W?r8Gx}NL!oY) zNB17KxU|H*dXL79YNR(H|YJB^&s>=u&2#_;4xJ;i!NK zqLz@6uxtBzdF$H2_kQOGkDr}9dG@Lt46>r^ocrLzZ}0EYx`84GMVs!t0w4&$fdxfn z&t6_Ue)4R+YFIEtU_oWWUQ0$RaG@;o5pp{Xl<01C?JyK zy6}%xIN#kJy#4Ub&Lj_RDX}q?1`QA#2t(3bUe?po^Tp|WC{>kJl$kF2>3X$X*C7as zGGvr!0!n65qzMR_l&HeyWu9jU+_!Dpw!ZhmaB_U+T$WHd%jK#X3_%+Q_$Pn(KW%4sX?cS4(FHMQ~n(tFmmGx@+3;XtXh6S8BtvN<&|k z5FyJ85$U=v#F&;r-}h127%KqDA3D$T$z-?dns2@PFhn0>1SDlNBE;xpa7I&6+Oo{8 z)h4rp!CaOnVRX1DMRk+LQ zKq)PxgJ=iFQ|75)Q`TJ|WvsOjdStITIPOD+<*-~%r|es=Ww)qFPP$VE|Gbv*gsptx8yRKi?Es#diq)nDrJ|r^DrTGXU zq96t&L6SE-x1{k&EX*5AY)?cs%Mbv3H&kI#<<|~&_jY$iWo|VkW5LyWeQ1PRDW?+tz)sg@!BYcMMRsjRsUK0KB1za+J<@ zfuqi|!0ep2#$-jAzLxm;nM3 zA+SPJWC++Q4KYaQ0iwdFF;H~DxrX8O>E}^Dd-sDo55D^$*j(zP=g0Fe9?!)WfKCi> zfj!5zZ@aD=7&ZnGdIeZzR&fl?DmP7})9?M2+lRMqoS(s$U!0zv0FfOGt9jSwKmsHi zC@iE7zA;(>Mi=@Ra#DuP>5J1pU;G*CqF&X#i=OAL56TXXCX+9}{6d6BgW_N^I+zT1 zhIy`$AV!wX_ZRb7*SiP^q?2DN!$yYzD8W(%No_tIW{sqcL8SyJvh>b}5O#(}6$NCP zedpQ>-!;}ySw?QoM}v6dAm14ys7CyZLj$CbUOd|!?__z^FWc8IPp0Qfh?LvmqHC=N zBJwUYP1|*zIr$*PnI4oKmzo}bzLrp zX`3$M)@AY%2%2P)0ZiK@$*-&B0!$!+FAyPF(v|g!q75bGMzSQD$3XI0%QDlqukFUrck8BJ%(Ig$s|;EcjQjU*LG-Zdtg(A{N8nxk8?`Pa^8P9F&>$!Mk-s;=7uW^zDQF!FV#A zuU;OVo}ZrGynT;_giz9gf(>HM1*f#u)>vZ`t}O)T9j8INA~Zz~D9juhYWgC+vWraWp&enW(dJ_6>Z#=4sOaUy{O;r@W?-4P}H>GND z97If}gMjz2s@LnL>0Q@$t#iFbVPxUt8Ken`c*|%}+DPQc;v;Lq5ZLv7p65hLBn`)a zBVmF#G84jACQp)zk}LWamm8lDGXMm@7Ks%mP4+_LKoi8c4lpJZWufS2da2~ zvVQ}#dism!b#rleqqz62_jdC3#SuL}S}c6WA%Ze!ho}@ID+P6vYsmp}AM+sd>(|Zi z{NC?F7VGo&(MPl8`N3EXMP2mM(}VI(;5;%jASexFMCGi&IalVDm;%rZa!YyW>b37X z2=%0dtkivk`P!c!znsr6Lhyn4Vi6Y0)sq*Z5eOmz1IV@OH|L90>pY<)vXLPQ0hm<# zY%nz&8Ui3NgXhRG0)kS?Dl!9&WO#kLRMZ*j6xJmyM`c@8YNz54e(#;t?A3Dd>d}|a z@=RyeSf!(jnntSy%}={}sG$5ZNgWsMuImIVq)pgY&I#ys=5kmq19NO2V@nE2hnpZ=^%Ft~r;0hBurv z5xz22!7HFN^xoSn_ueNtK&2ECK7ID=FMj@W7h?hmUxn1BIcrMhz9tIsjW?finM>i0 zjf0yY(b@U=4}bilciwqxI2uLYX`@4MmnZ7C2gCT)&nQ8SjG+WLiZQ~Lo+QjlG^Gg6 zl2QN!MgWOXD={Sku=lIB^&&DTbmZQESOSfLK|<%5qYr_U64`jR$krPIK|*S)00;`I zO%fvr%;_)`03`#*ElSzKHo#sE|~ShVb~&^E}gqRb^)OcE*#*PIYkq2RjcQKb!Vk zhroRhC%P3AC6kzSj>_@vL1jlnJlGkAb~QUY5?NcUVlSCNBeGmgXRC|7{hh;M#wZau zaL=A4MDd{y?1Y|?B<@vC%7`d;fN3R~ee%aS+LNLl?S+0!{k+yA}i%spaEMKnI zb~;s7n<7V!$o{Px*H?Ah?S-tUc6RrS&FiLHua+;Ke7Q58kj^5IgkDP!-_?tSzI%^> zB4cC_dgD-#SuZMxmzSpigunvG0PB{Mf6@Hn{A5sEKRCE?c(6O!LjbGtl=g=p&iO32njiwKYk2wc z_1XE^x?VMH6QUQ1+9(jBm^ktrkd)C%ldk*T7KOIT^}TbBmC~eaRZw6SxumM1B_3c?}lXzPQr~tG? z%|PJG99*}K-KkRRoe^I<$gk}e$TElQCXd}>;7!I4i4rQv*}qKdNNdj zl+C(t>LrmE=~Fik5fRijDTm9Ly8RcUfX=KSMUf=zCnAVZsd%Xqs}uoj(6&ODdLG}n zasT$?wCm6|7+f*s!A)GbI+07eY{1Lk+0Ntz5ICk`N|FUYA_Np>-#br)N-I(dFhmX! zLIkf7k}d?I1|~#;m^hETZ8fJ{AwAWl_&dB2X-Yz#8(`};nqF4qh+6BmZb{kX{4kx( zKKkfaP1D$-u-0B`0$&nr5+>-f2XNH{=C^N26Y6VD;AzOJjcM!Ezxv~U{h$4(|M6q^e_xh=2-3#JScvSC-Xi zn5W(~rQ(iz*R_!)iWtl|iGy-NK_`+ETP>KBJGNbc&E|qklz2Fsk+}dMXb=skX`|tk z&Ou~}iQ~rzEG!_(r~pw2TpyacGsbA8cmq}_ymMXKrv|~6o3PO|PV$P0fRwOo8yn^r z()VMGDWPndCeMqw@yfy^C=Y^w3J{FZ0xZJ%3QUYdxb2!Ibbdk86=f=~vcb+EFU#GX z!Jx_&%KYN|^wslBzdqdGo$T&TMj2{Dq+GwdYkq5I&ycY^QEr)Nc(7lUGV|N3Myv83h~)8~(#9335f>+J`_ z;Xs2NzkK$^XTLr_dWq4M)=VZl2%u0YrAZkUBxRK5XHQ<x#^GpmeSiGn!v~XLnHlh&g@aKl5?6yVD{>JDF)~XOi7ccv z1LOt8Ik&D~w@vRF=lVR)4iENt8>|8YBbw4i00H>?(fRWiuaA$9MK~)gkx@z!ijIA& zw6)3zP~;>rqfjYAVDCJla8yKTVg~?i*GCpqgvouDV`LBzb2+5FT9RJ5V86P#vQ~^3 z1k~~~;od-&*8?Xb_b|#;8aHvwU>8H&l(v_?7}UU7lXNezZH@1Eoc4CgVZ(5t~l> zD7*XDAgaE1zU}JudOn+KMb{3l-Me$&N|>!$@9Sc`KdIER3%*@7K|tr)=22Fd$6C4C*Wjtu{=JWPS4l%%AKFCB%07G*9PyF5{b|#$_Ttj5FpZ9 zySfO>A^<|$HmX2sngU|yJrE~J8*S~SczTQxiAZZCk}ZPgvWxhQVApT{X8M~;TOvpf zwh-Yf;`OOuML{KM!w$ca!?CbL<`@JR5J(f?#(YrF1Br`VcP^xP+7KB-Nn81uTRp#5(l{1fmE7LbmWFueDXm8Uxl^YxDGJ3vaX=K{!DvllyuKnObWB@IGAH%ZDw?DCK`dloy3h ze36aOmeBSLw!KSP$kxjp0WdOWcEBwoo6|M+LW{KOcmfo~k_KDd2723a+H?cm1meDLA- z-uu=+{YU@hXFvWo_wL?&@bLb%!)m!ce|h%oJhRvK5BA18KX~_!e|Rh3nf%!g|NJLE z{PT9Tm<-FEVHJB7`)(s0xoso?lC{PdeCOSFXVclUXV0pt$P4THZdxyq@Z|ZkEH7+k zMIcQK%d*O=YPdIP*L7y|$!NG zt`EUmqjHjJSncgjj8TZVv$J#kaDR{~WCp>)5P)S4CbMOJAi$9sl}hYrn;`-u8LD;D z%$5rwQkiX>KVL5IMDgBLc@_a&h`Ch`;B>nF^`~FVr(M(ZkyTNYN-OXC7+EXQ-Fj(k zZt_B#jMS!M#}WsHZQ7>qozcc<%f4^BmYMUS^dWL!W%TCyf{mHx)ob;Q_bG1Fui+~{ zW+D$5M2MLLvsI?)j3&326*Nu94+GPW|wtMg9hkN^FXZZj|_Tf67J+~J}M@EyjN|bH` z&e!dFy=v-iprPqp+xDciRjSm|_jR{CU!JLZ_usmE>)>>@p113avQcgW1(jPb|6k_* z>({m{OYg+S7}G4b{qg7e8~27w?=!0^E31lRkximoYC4H*QGh^+B4mID1VL(`pY;zA zdeMV`mY@eo=qAB3T_mf>A~P#pRc1y;nsC?KW4B*!x}k@;_dX{gqsXd;s?i%4fg9(V zv+rJO%`xW~-}n32d25{a0sP8+2;Hnhge&Y?OjyH!%)vVVhvZ{2DNd$@U;g$OThDTR|`Y{@~8*;JH32Up_y1@%(IZUe=|vEe5Zo5CRhv zfD|)@WRg(ZRsbsI-2+iz2mk@tuWSz-k9qN&>cNMVY6LIL7>EoYq@Z{{C5lJvxQP5I z5cZF6{Ne=zJ!<1QcDexoHC_&Q;lLpT2ti7TjH@0bGvg|>hl6AAK6pS54uvEkL1+y` zLJ<))rm3o>bGC6+Xah>Yfsr{HJE91QA%M83)64-u#Px9l3%%qzji)q-CZ1n7?FH{W zkw77&(gEPnlgF(w*(FPR{Fg@J+DAUO_-`i?@Ta^s>-dL0ZA2;MY&z-pI$4(e&hP&2 z_5bz%YIkcm9iOddsJuF*ZpeLJ0vwxO~Gz@{`u9xKBj7c#BAZ zY2#jq%Dy-}iQ5Pvq_ap!LWtH_0#VlufmVuLu2 z+Z|(!o6V5Wc^@+~;zjIqI!bBh0>|}{1I61L*B?0}GkXr`S7tv7t8ER5BvpbXT5o65 zx^3%juY<^mlxd<)-jqKS(A1!~exUIOyl!{n!7}xRwO;dp&!$JZWNW zl29s5Gt8on57~!@kDhKHT#-8c;QphN^I7d+=WsVk^JTl_*iP7h{*aLap?9W<#$P2V z(Xx|CMA<2_Ubl1Q;NW0yC@z&40%*Nu$1>3f?43m^0nz&aD~1?E0B!&{o>Y&IPM#kf zHO8k&#)ws0SFN*vAd~oLP0Hr{$)q**d@_0V^r+w2F1mdpvaT(wC3EQax?7`xymjMh z)7q*r&epNr%Lo`ec}~!GI%%3_wl#}I$qe02S7}kYwzU>n39SSIL{rDbw)e99XtnNs zsI3$gecS*C4jHlrP>jgv0Uau4AP$mPkkAAMu<~%8CX3)_E=-0Ue&y=k!IfP|1T-Gn zwDsNw>s)S{+_5InNwTgp4Ui*QqcYY(l6EcjkH?{Er`c!IjLq90{N#flJ$B_HOBM;) zj?9$+sRGDg0xc?9EL2(Zqsf#}80)3Pey@{2#;$2*=7ZCpC*)uM`4fC%g|eR+oDV9|f!T9t zTKn+f!!*k_OyKyh+r-gFuu(j)ZpNrY3;8XP@evS;hPacn?&H4Ev&>El2A_K%hexvaTdlo+&a z+;UR&ds?+E27d2nKmFjXAJp^d*M9Yv4!4GX@Vmb?-0HJ$P1B4Q)8)|%Eu>&@jHuI0 z01+huBnqjOH|_ZRtk>xh2_%UqTmX)nT!woO-oJU{#`PPYK0iBs_Uvg{E;^l})9C^V zm8MLxGQMe>);MPHBq|bPcYHRUPG-y7ci;H@7ry{9d3tn~=A8ft6mLWi-t#J=+93Eu zi!{;wUS~My7kR2Ad24&!Vr$q}>us)ehC@honranS)CdxZpEe2M8BE~$vZ`9s=?|*9 zdFTCm?>>B@l1!&vA;}tJJyoqgn^swt8OCL49zJ^hLU{_>~x_VhdVo*s{bE1Ox3loTojr2+&WtS=X>MvcQ((8|X@ zee&)HkAq6*m8mPkK?HUTBGJWY(5dU1&`1e@K42RlFgcLy10hHb?0tyhqu54U+cIgD z(X(b(I?tY0eaIN?9tpP2Iaq~9#zRh2+6oTQcKFeP`lm^g;6h#$SF}wkr(ovjkG!DL z12oHOLm?0uz~@rQyy)0Acvmi#9M*2h=!%Q+ zqU$3RU+i-j*0}jKN`fzgzAmaMucoQ%-6Ke?s@C|{%opX0mq$gfr;{`Wpl&D%@q@M2 zN-1NR+^pk7^rz*vZZga-7gR(nt18J->wUSH?H}yE`|i7MzWy4L0QT#tj31yI4LI@Ft9#8=QBL#%JpZZ+h>H9z&>O4tDqdh^%Vlh2<<&HHa zFe@cF`1yRcm`>ZKuF7Qy&Rgr94c>9^z)Xn2Ita9mv_k@vB%~0=*f<;y7~<#KY% z2jD`?E)##V9;95^1d~WyqBp+MN+exHet40oSja$uHJ4>r{|OT z;laMq)#U6bFH)VTM5m^;DZt|iWnCLrbow`M-QK%?<7iRUp0DlR{M^odw>O+Es@g2OgB{~NG6(hu9D+j#F}iQQ znDo2dgM-5x*RLJycEzQkMPvv1;DfhHh*U}dsML_>gM0VS#^ZpfbOM5WKnAIGhDdE|fLUveNT#)fq?95Qyvbz?!P!cRMv~&t zYmH=*LII1?*ad=3l|qNXHd+`6(>yEphwhafzjI{>Oi&x>Z-J5b?w>t*R?SQ8pzom< zuoIwQ)J((xf(WP#>V(MzF2HxekBEa3+jhBJ#=vtWgcO9#96Yd<($`H1B(L3iE zF^bjtB#15JC9ntZQm~XvV1ZizL+Fr=wUu{GnyS&TKkDbVu53Z50c+qgxM|aln`&a( zs#;cBq{wNt;PFX4KCPE?=e$IjF-Tw$n7jw)*}AB$@PMAt09qysXaOCtpwNXN*PXqH z|HY^>-F$JgRR;vmfds{cenYa2$F-HXcb!kN;)p7F`H*_KpkDsUx39usa5bUcq;`WQGnorH`X}z0a$9O6PS1 zi+^XD<-xlsg{T(uZjt_jzyJ3J-HtWQVm=%6`_@+|vYpAsAXVKYp< z^iBYQiP<>|1k1L{y7{uLuH3wF<;Kn7_I}-lrU3>mMF&7Ti`La3mUTS^4tbX5iPjRk zc{c2IPLG~}x52fpZJcSGX}vYxaaEe8v1M7dZOb7D5=v<)1gya@D>^I^A~8A-RR9}T zc|?IEi3E`tpN-E>&dTL-a(0fuMV8H`)7Ds3bX?$_ot@LO6Kl=(_Ey_8oji}Ey=Y#7 zb-z0@v|~rtIY&YyNg6_^oA&tRIL)%baHMr&tvx+G{rcB`b!&Uq#3sqQv%)KX7hH<; zxsY%YF!`|V$sm&0xE@yliQu_H^2V1?|$=NQ)rDTNiqo#0;M1V!T{(w06HQ3TGS8) zLYp@pIUW&u%B#1=o{f~Esw!*UwQDzSzj9|bU;gx+_dL_tbkQ5_+_>{v(I2IGSLkF~ zHeTmJXk%SfwMa5ebL+x#xs*y|S!zv97xCmj6eKL45R?d^V7$@NawSq)0+2)fzjUoNWyuDkHCo{ z?*jzS$m?x5NvQ-$MTHc~qZ9-lJTO2YiBezy-w;~D#qL(xE3*CF!G7QAa0Gq<(1HFo zc=68r&)&Vi0CiyXz;Vu)FsBF!fdF(6ivut+a%>+U13&;7u-M+ev%B9n%hPf^J)bvd zmBMs3ITpeZkzbV6vTW*_5V9o6@a@9==TS`UO(5G0c^0fTb5?2RVoDnc;+@VO#my%rU`bt$!O5&6kAG>R+J_hW#UfH z>-pk*d^De*w(S(q2+4wAxhy%<)>2ivvJ9q0W=%puKwu0Z1P1TGM@CUtwVvWiA6s*g zo)dhyjN;=99VM*gClS8M-nnSVgq4|EMDoDuBvh80uY4ql=@;!TzgSQ&z8?7U0CIyp ziHG3L;A$;~Vvp83=X~%SNRrOdZfB^ol#vgwUAunsW^d4UA+)ANL0b3jzkdp>0UU}f zgr;H7tuW~K_pV>P{z~=A*guT3ad)@-Jm2_upqm`+V+C=>H^=#UbPHHt<{qr?!U3>8Vc{E$ zyh)MGcdJAg@Aov=8ZSjdP!x9 zJqH%d2s}Ag7Todu)+gLAqKj;A0z#IOtO6g5sZ2FQq?-q398GN!?9U zoI_FH+Oxy^Vr9I7@0_AC;7B;{_E2-N9aq%U9XH?S;-}vzpouO*>y9J&?I=VAS{9I~ zz5;(&_cX|6_g(6&yBgF(QbFc%sb1;{Yb|_Dt!8U)oK0|#8c@(M+1tioL*Q`?2BAwh%i3s`SK~MZa7%o;n zA0PlNS-QfKzThtg3>hv%qHQOYrl0IQPaE}?mX%`|dw)FFA~G7SF#rVvwenLYq)1p* zVDRE$L@7jAFZXG({1gzPGmeRySQ`o+sc-YE%hsCTw6=H;rb&4z9+cL9yfvP@>YYe> zc2+Sa!=oGz<`TD#F=WSoPq38u$Tv8j67&;bVQ*)lVlBq&UeMUng}*)C%9F7~1{>dZ zuPlNcpr=ypvs+9+XFr%&56K$y*snsQMZS=sfL~zZHz1{OL1g)ct(X{KwKCPt3?AvygWwi+Ubr4IG zwj_#x*5Ar_IcHs7hif%42StWY2_%f~ertipB5FbTzGkcS8$PJnGBNDU)0vnWo18pl zGV+Qgzm#<&hf7Ikfs;5i2MqWVlA!YAVAlJeuIk@`?tcR5VZ))*jgA`=H4fA+Pdy}g zVJkcwWOSJ+u{3XRzP0*|Q{T{cn9Us~M)#{*k^PbKt-ixUZy|yod{3z;5`@4%dp`ea zv8Xuqc$!47T~^Wg>2z(kk-)NLl}VAY5)GR6EpF|6A%Q8fln*$|TjEe%eI~v_$m5Z$)?fo zTYpRuWomd(wBQ33Je~IhT=FEQC+FEIb|&cGQ^7rQx6bz#Q@oWsj{8j5k@{-& zmwD=Cu2=?|U;|aSy_%_>hhBpt_1nP^FYK#>!!*(nu-0W4#%~S46|QTPM4a^e;&}7N zZ_!a5TlhYo5QBZCsT56=By%2L+S_ejob9bybhJS? zi;h1ksKYMZMmX^5-#Cs!Tr~7yJ_LH{qNqH z?IhoMH$X7@KQ)tXRtXoG;e2cA$6*Z3t+vgL!}px$WzyS>ChdE%QZfuBQBDlozZxu} zMmJI!yei|_Y?uB23Zhwn=aS7(O4ScCY9*_igD|7#vqbielOk1ZS6f)DQ|`l`lOK%p z`2XMigZ0@rOY_p&Dy!*dPXc~z!otA;N>mxdQXl&ZA!0Wvt|D<)2}Zk( z%67lrJPgkb6@2!F3U9-dJ+s?*7&`Q5@}V@qPoR)Ro(jliN1KUs-X?)YTNXX#3<}6y z*~FZED6AKm|K2KOM=vfZ8E~_*=`QO$BtblzK^R$&f&3(zsqcR>v+v9be7l-~JRc#H zmOqHf*9e)RI11o&I2E6w{;;-tX*97PG@ND?AQA9U=cO#o?O#?MIqz-&6KP2N=jT1q zv(z@EKPo7-e*o+%h^x6$n$Rzoo=|6Q;aZEx?~WtPvo&q?zUx8@;f;Dm{Mmg4Xm{mq zR;hz>6mJ0${#V^dTeHNKQjvbXVqq(_GU~=%SKk17hq{b4L~*^f4Trcb@f_c{kcI%U zJYd&h-vv}@_B?IcK~hc**T%=3{??ZEdk{2%ij95a0?<#l%^&^ev#14681+Qx!55SV znXo(<>vr&yFNolWv6FgU-27_8+pNSM-;eok?&Icl471q{eDV~n)$CET7wq32jY)A% z=(6l%;NdF-dtx)2MZ3J}-oeKZVyy!8O`IX4WG}GR$)#fEt28NvC zkJHR*k@PzZ!xxNv1lnLbqApN<0q1@`%Horp*8IGPc2v;T)IojgOi#7+)8ZJIva6430@J7t^VhShhuWyDRzPzo{h@AXpO~J1Yf(sH1fdTal5a{ zhx>Bc&t)5L+r7v$GP&`e^v#U~K?q1VQsqg|xNSuaeI~S45ZTTlQFK_>qbksIX z-?uMbxA*q;hW0L8pYJU;dwvRce`UDn(MCM?8zAy;&u$s;Op!Irt)p@qg+e`Y3`OvR z%*kvF3ZMOWgUUZ8YQl)_{Ukb=T;sO9#OnR+D4Bxocc?Lu-C---NyR zqq!LPi!Kn?<$~iDouA*Y23{ZU2QoWcj4)Jr__d3BZJ%GGCHAu*Zx27T6l=1vxc<;E z|9L37C-S9#G3K*A<1RHYveu#PTxopM(@))MZF10B$eeF`H?-XR>W}SXl)&~;_hF4n zZF!TqL?)xxmGNc1;Rx>}UjtaROp!O(I`*N3qj6dcqAA%+D*PCCX%!(5uThT+%uB3$ zdNq1Ac@3=|-Q4_Xd|zWY^8W35jy})YY$gR0!Gu^Pxuxvy@$r?z+N4@b(BkoUZ3>bpFy#1Ai#qlC9+WjOXs$JLcR_WE3|xyj@U#ravuI%g&K z>(F?>21-sR(>?m0?>gGn${Ev_3dJ)i4Ff>Ylt5qQffayAbwA6$ zpTX5^pxpwE!U-tUqA^vsV?GsGux?B$iJ*q@+zv-qlJ)L4zI4B5Bq+vh}6)p|EPcqVG${>83YauZsExE=&8 zYPkrY7Fa*~pn9|01k*Cd#>T$U7;>ks`)Jd^X%($;10s<1v#HY;35L_n)sDT@i@MQS zd%ZpG7exCx>mK$7V73;Ee>}>HK8YT!3raxldFUEjZJ z^XSHx|C(G6maK`jVSw}{7g!;ttQsv@Eg(&=z3ZN)s_Z=>!9Va@4XQn=3xJ_I&J& zUPH#{<7w9^=4$=8(!|*$rA-xAC{>Q%$p!8kdUF_hH|_js+jyDS?0c=V!#BO!mPE0- z$e+O`-9-j3&b*;yq=>9%h^%6Skv=Pa5$*&-heLQ}{hQ58y9EY&wXu&`-X9F5X6J?apWs}{8zuX4BS%<2x$l9eF86_#a`ywy zpN@|2kIn<6rhO%!NX?UbDI?h;z|qoH(KlP5#2+fsuK?@(UGVk$ujOORl9Iv?TmY4i z9}}>~xSHvkz)B@0DRsuan19A-C9U56jSJ;9Xu3|V;TBEk^*>{TIeSHr+SSlWB`j!k zBGlPza#uyiZ6stQp9qxuisng5GBWoGDWl@7_mWTYE*fD39urdy%0O_CuBvhZEj0h7t9oKJ08eELLLSV` zW&N1#J#!_xqCA_NGT1GA1S|~z_|ct7h6d1b;HVcDJ5zkLZ)cwwX)7{CC;8gi>ZT5t z%`UC+)jf2G&Af6ElACGuk(878=SdnBin8zecbj~)SxQ_`_3{BvV?MCJmNmzA7(z$D zE{I?`0-GX9o`6CXIrAUwfROGAIzQhUS<9fFMiZJ|ZeWvFE8x%9(Db9Mqk3#M1wUM6 z<6RRY)7}M5YYpK8SZzLcp$Y8yC{;7XZNF(Gu;LFa6}-x+*Xhdr$-C+Sg;N$-d8$T( z8C|Bd5m8WtHHxSA3o3rZ|I5?`oj+&0SDLBIVVAtTq%12GA`VPo~)*;KSV!(@P{xyP)5gvz?$_JA+npxXFpkt-RdR?&Bl$VP{gZTgEeu0qG}#_LKl zby$Or+d6s;T)`%`jX(4y0n~lE=y;~S<XSB22f12$YRiiJdLBc8U7Ygi#Rn3%OWEwrv!A@UN!^!qh|XwXzym4}Lb`6J=$ zMnv||T>n#~jC7V76{Tk*?$#Ow-B)vYF3=)((H+ku?SFr4ez7zB&6c?>aDUBK?tG)$ z3i_{WgiEE?0!sO&RF}!UDRN!*5g==_fuMan-ncjCQOJg*?c4f+z4O*X~?^qE(3S9_g)t|A=)E~gk?ul-Lh z`-iu$f7MHUL!th5)t`o5Gqd0;ROe_W+e^(GhaPWoR~6Q0YlU%TwFiYbl5DNXT7wwp zS-XWJf~;dTb;w50B0qA7Q4hk34`X}~aW>+ z-HF|j@P`}Q913A0_=;cMF?5R>wCYxV?N|#)9UprEfQpiVn(=4%S%8{Yw3zMow_7#q zh4D*=kFK)A6S}Z>C|Wkyqh+Xum>2?CcWSNFf8%-PPZqT8ycq`3XoRvQ*)C zVX;8S4Z>klf?|KWvpd*Rqu5fFNm!`rd?aLyV?VdAy0SEE#4GoXKZbD^ZqaOdzGliB z%afHsj@sMj2o`;$CW-lC*ZtgdVX$>3eQZC`%6qmIlQk@6qTC(zxojEyq;d2Ht6LiTC z$uXU?4tUCB+4Cc52XfCuST}$L%Az32Eu`?fQC&~3*rP{~1frt?Da0?#KnCOes)exP z69?~v#(9Et`&omm$GSt$5AX0bF&x1J55pxN2{Apcc!;f=Qsk4SrphM-1Bvl{_wmG) zg|tXjf}1r2gI=G3@a;3`ALK`p{-xMW$qa>%u+}%mA^7|0_W7!D#d&1@k$c_!@K=iM zX7QIte4cvG(qoQlOHXePG50$7qUMo{gD!mt@WOH(M9#B){wgG*u+&&&Ove}s+ zNXQB!O!+cS_*Y@Lewo__!wNws##|=wjMGbuysDPXxB9Cs#6=jzs;ign>Bj6Lnf=5? z28mdBsF0);NvTQrZdI8>G5R*EOB>QK@$}Zx>N<(SgW%N}Hd!lZ<<*BcytT5jNUpJC zZ&6ekkNPB;8)rZ)gZz)xF(LiQ|HS#D3;2f1$}Cw7c9;eh*^3lGSU>1Uts26yq7NLV z4~>MthH9ndT?*USt%9ltpK9rgPiMnp_QBC$UO+G5#U)hzYm%s zOL(}`{X!^#^FSq*CFf(8B>}0?`eI*v3gWG>%OkPP@AI?$)x>=yjEvt7ag!r)HIdm9 z9sm#zpk*5I`D-aKh!$A%Gs$f3=@*SJJ*o3e%C{?VQZp21pQCRsHxq@=W|z}Duj0(_ z?#}NnY~`*8op1W99x2@&^&K;aRi@fdGx{-Ge%R(o4f>AA0^RAU_9YjmB!x}E?NRfM zr&tQY(7!IthI}yvZw>gBd#Ice$hSZ3uHtQxR0cC5r_+B=eH>ZJF@DrQ_U&O1UfQs) zI3qC%WW<~JVO;mPPuTD5C{xTE_d~w<)3V*y&Az$;FZ1t|CVu`W{?})5ows>+@nNN3 zm>2hHW-VnYf8x!$MLML=UAh_FFb6X*Y?Vw=iQ_ZVb@??}ekQ>1)O`+Zh|+3j8*Z>G zugw|zjAW}OC>(k@Y0Eh}Teo(y8JZV(Ket`Q_@~+9HqKr%7b)xKvtwPdv8w~uMY#p1 z4}VTf#o$Q;PF}b7`9F({Jq!vCd;huRG-xQa9%Hc#)I=`0$7{6cX9)EKv_%KJ(m1qwMEjInp;}Aende?V>I09&|}QL;0W^wjP`E zKLYx$`upFkmQJZUACW*9S*{^Wmj@x7{C zI#_{8u|#i()Kxogo{vwSWh@;n_O|ZNf-sYMmP?aG-y3r@a(;o14(rnHp65*+UvzgO(CFvtv`S5#Mqb@hho3zIHdAp#U7l zz^INWaz^BdwTAm**3vv6I%OorL{JzeRBW@-wIqFA?OMrF2h@quje3T^k9ug9z`}}Z z0EMYBJ{X}P{;KtgpXWhbQ}M?*KpH*-OsrO|sH&n=2nDm|pVv6D0D?hbk)vi~JHdES zGgesu#_+HJWM8m-`6{8(L-=+}W!f-~{_(q>I))ENDSuN$&7T4fw}L6@OnFcn)75Z? zm#c?vIFVU-q-+~hB({t9QL?2Cil`?;C{+y`q0tbSdlF6%O&K3E(bt=-KkjoCG)mEX zS`y2|QI7vYAuT9GJAWdno~o31)a!8I?P1O+C42;&nf&>7*=3|r?ulJ(wZ z<@SAQnotFoZeWQ5vEYY*qr~uh9w|n4;q!8n4jAgfqx>(~U$;z)lMM=c?-NwZr-c2) zVf!HD3c*T)u5oyg6 zM0ZG&e4(!juORF4{l%*S`WiM;NcznCeLOhhHfw-deu zYD_v9>4Ps;>ujsc76O;!X7bw3CkGwa3Ukn96)FNg@yq#QXHb9lA3wTz5+j|}?E8X^ zy!T;XLd|YgpwYUzedtReSlc<~>y)p(-+Wf%^Eas*y4y}^LyB(mZT{{;#<&&@|GTT~ zJfCIEsQvXdMJ^*!BiBz=>UK9@r0smXc}SI*8M4-6s-uE3`X1COVNVSH$!!zvsz_<5BtQTzU5 z!o)>e81(wXqRDOx7Iz_j`&o^uiFy}--?G?FGlx!3IvRoE<1=e%t_6kh2OQ8==|dY- z(zdhz-JQ@TGlOY1pP6GR$$e%MH)Rs z#-OBayBLOnfnV@NCcl+4! zhku|~KVb=3HSD0`S9KYJI{`_ zem6mD?srNqn1{?&du9d57^Bt9mGwJ0K`dm53_rl}B*HKrrtEc81t^AtyS2FOJn!YW z+jiWBCb@Xi;`ctqm1eHYEo$*@SMFx*T$#uZY1V1<{5O5~UxUC+`>KTwTpiPtUZU-S zlb3X6+v##syoScz+2W-X$V7lP#8OjW;uPv$sCe-152>Rhm@0GBe6|$PL z_b4LZ<0N(a)K^M;5FRTa?DT6I0S@^lBbA%eQ9oL*0u?LK74Kf#xd?aMZmF2V&@<$$ z7JFa~7j-{=PAMGR!=6o-8$^6dOxf~VyvAX)o#;7jFxzodrs52C^Mpz$u|~&N2O(PA zrKu@E;uqsQ<5ZMv+Dc$54!v+z6>cTQ0>5=jVV_j3FuI6eyuD5KLZd#F*%;sAHZg}# zmlSf(s#CAZ#)`Y8>_xId5A5w4^QZH-d3P0E2lqFf_vYsjeTx^oou7;0xt)KWddl5@ z*BpEQmgSGdH>)*KLW&*WJfQqc?T=W$xq)ic*^6LyA`$U*Jf?Q-TKAfXh07J3e*_icfgQ~36Va42qg_7O7j;-?K zIT>&1(&3=D`)O{-wBFo;FI(}SZ=Kdp`dZu3F8d9X&6IrnME$zZ=W3sdN#cAy%)3dt zi&c?k(`)9T*9Dkd-$XLfP!iac|IiED!*Sl2pXSN52L@_4Lf3R`u$3=#At5xXAQ%l- zk`f+eXk9RvAejOzLlst`OT*n0z{_=(pY6itb!MrDE*C~K5_*A@bEsI zws#eEFkk7_fFi9l93&M$_d_kH?ke~*ZXL_w3E)D*^ou$JCKXb&MgNcjYzN_%U zYR5L>2Q!MFv37-8vN4iJU|S*Ta4Xqnultpg9k;yu9+wyJ6q~>oxOF<^X|$#2le(dx z8>#)aYpj%9;3{UcDq!`Em(wCWx$j6@Q`7y?#Y$7aHSWO?ay;e5^ZUsOnD2V}yzjJE zq`r+CbX@cad^&sxhgr=Pm)h2C=G`pCcb@Lb`5v8Yc6VdiP@~^R>s>Kz;zoZyt){l` z?s8Hvdmi5mb*JtJ?E9TF{ki{9BDY|8z0((CKU3*`Ei;cJb~T`)Od#C&X4W?*X(+(~ z3}1n2@?Z3aww$v@q9S|wp{~Qqcwg5wJ;9iCpqx-@Ukts^N5X5+o9$j&uVd=A=AX>$ znea<90E_=0b?DE!vOjZyZue{1!<)m)w)@BtvooRJdtQ~;4)(-wFl#m9m0osB4K@S6 z{Re>Zs8}@&aL8%(h8-1?Oh7-p5(qg!N2) z&Yr74$-CL>XhQHwQbTN&olU4Yw`&bjufKACWqxZ`_11swZJwbT=NMDln+}a1)2ptmMGh5lvtf~4So-3eQ8o_MsH)snlHgRAoCYra_1kavzFN6L8G9{yAMfAA-)}MB%sXd${&V2B zPAu(t>(b2@hMR}&9qm6=<3n6tZow(9^f?iR_tMHLK2~H>yu_(290u~b&Sl5R)I}#4 zH2Q8K8_vl&Fh)^jF7szG4HN~yTQZ3Or_~`!7QOm~V63OLg0M7_ATW!jo2U9DJ!`6l z4xnDv+rE(HF<`-@Xi$_zC1l6t*Y2mX`F*GTy>dl4|BJ}q!b|=_YhWh109|wmZV>gj zo{I$26M_8;UJ5I&bbG^%4KOGfNeL;5Y=HXk z@B{I6FiY+>u8tWDq3|D|{( zTmVEfpISZ0F+cJ`7PxD?KPAz^CtF6o`p)*cR){MMJgo#*m>!{x@i9v4r(@Gq<>sj1 zeZ-A}3!@tJaW>0Z@RvFg50|zI2S+ugdPbd)&CO$BB(3D|1Fh}0W1atWx79dwlD-Vk zH^|PijNeUXrz0q~13^-@7|FNLq*#0iUHHdb*0Kxs7>ir(J8p;hc+<#t3&3WPh1hMW zhe@I$k@>p+;?jjO(T}T`%p|yvE-kg){U$GyU(|t`EcMLa0wPmQ6jyTnCDKvR< znK$AZ=i$P2YI6o2;7Z!0|LXd5YjQPbBa@^(OXf+0fN@P1k;nWvgLPyMbF-ZsgI0mAQ z#JRw29i%lCXRX^j9qlcW-TjDV)gtA^8RHtgJQo8l9BiGdDvguoqzK8k|AXJ*F0~fV zqmRmm?{_)DwE%I zxk$4a}b0%e1K<>C$*qaPRnMzX*ikPR5)^)PU5`$LBi+8z~d0@kEo2)kI^=DFQ$%&4SL zC8@BqeEfs^?cCq|MG4=-quFF4?Dg&K?YvmkDzXBReQ7D0r_qbAHlH$VbAA`Pcrm?r zad}N4=Y8=9$}2R$#xVi6J*~C0!2epP4`mH%dS0vbT+z%vg$AhdwcQOZ+6|x3Q8f}6 zx^!?|NAu29wHL@94~h)?%EaMo=4vcn&l;QGPS`4k`io`?+D1dGck}19VT2>ev#!+* zWGd^)K6X9%dGi2b;w0F!I&X2O*pDNKB$b{Z7Jz)rbg?P%@2%m#w)+>&2N%2%ep1Ps zI}7Kw#>TykjyTIaI3#6jOMw>R&57SNxtlwaWH9eGSn*5Fx3v#oc%SH{5=IT_c3PR3oyK2EZ}+$BriXS87}Hl ze7n|;G^m3Z>=q8jsFk-p|74uY!{_;V6T@JzWmK0TwmLCdGHPui@EA=eEyo{T4dr3s z(Rs=uF3b?miOX@=!nZ5jL;+R~?u9V6q7e63JIyk z1Hs>ZZ|VSNl$c(I+IE_0v8_Mf%O9-wJZ=@`d8Fvh{JzC$>vdMK_pB2h@AqqeN%Kr` zfp+QnZ@kiiF3ok@Bx?8xeshen>&VQ+ku8M{Q51152 z*GU4Ry9>2Hi6Gf}UB+FZE6Ql7C9P})%AmbHt|KP?iPT)(ZPl9OAEj? z{)~D!;SmzoC))yN%FAWU%Q^8~5K%9g%sgh@cMqpo-i$5Wac{M0h}6dFkYs)UdLQk~ zjxG9}5B+^N-x%Yn09`@$gag7tyMu-%{PJwMRW1$gx19C$1{sf}?>Fb=e70Z9wfJ0P zssff7?r*#TN)TBK?YFCz3xlvfqk0l8yu@L3W;6EBHiYz&(fUey`7#Fi9G zIdwx;oLtJmvdw)6nW{35e=Lg&={{%O!&eKoavgr>$EZKZvGVAv^Dk+R+pX>0sk{b@ zH%DTzi0qcKp<0vYk7Ink=QMfnE0GedESZ4F-+4eAz8dwhJ9+0sD%QI#zi_fC81sJQ z?9^^5iZPr*$iL&WM^ar6<=o`m58wZrxtlO=J-*_+3bhn6#&+JLo$t@~>rWlT#Tm&Y zmnYfhQ*u^RWk!)fKAAm3~7G4p|Sf5AOu4UN6OY?eMdZC}=Ya zW{y@gEI82yNnF%Al$VM0#}1VAc3a@^cYC~I>$uGn&d)CEf3eivI#ac{;Vz|==zMyu z_m&?$mR^^sQoEc!V19j7WqyBU(0M!H+bOvU2-?84j@Zfz|pBkPMB$;{^G2L+N}M(cV=^?7w%-vWM(GDoyG6B(dT=E%bXpDEN z5p6-}%Qj)})g>26V;svQeYjr&!Wy2^9cm;JfiQn5Kx;dehS-QrGBs8kfbl9iYN?u3 z6aTjE$ybGWCP1bhSrZicq}89+n*RPw%oSRZ-E3o@)jwUCE9EN5D+w*a(fULm&hVMm zfu{eAa=w=p?(f2)QyU$(8tdP8Thoz+dZb0n6UD*GZS-DI6K{s3&(FXj#(veV;(65llOH~?u9CnNzKHOC~;@`_j@E7VK$Wfuq?zKcW}EczdB zHEjQ%T872G`#jhqEe%gn*nI%YEPRsm0qGpe&W&0Zt7m8O zT&Zi{C$7%#mnZ^uX98seB$EfNzw=R$lP8_aipyl5C>ukgmnZ9%90NsE>v0LE7Q?-# zOz(XJk^E~hI$RuuJi}C!;Sh^wT_WnWBHQjQN+nXJ&x=xgnyMyg2wn~sz0?qOEK9DN zq$WGKT4;qvwp2DXHvNCj^1enf2kw@eFUW~!jN0OmtgW86$|60gNR}57zeI2vpyNE@ zI%N$P39F(=waFht5KCm@IeBG@-UF@&)QPdDxNXiFh7sG|HP#EO{wDS`B;qN zd7C5p@!OL>!+xP=9n-CANWo$~)Mq(YOGkG_;mPk7WKIhWR&%IVVCz>YyzU41p3O84hRm7CtL>&&;nJ6lxdMa z9Oqje)(bf_e`X*SYyCA+?y4=xyoKQ#!ew+CKFSW>D&@X1C(%4ELLS_h-&Gt(mS^&77MVP?5zoxZzkarV7<$`M?9>&{pi8hpSD zq*0M>?gIb~qNTmzr5PV>!*^fD6)n2Yio_2Syd-Njp2P2EuPMxOG-6NF+}G>89tQXG z+RKAjl)euE@=sZa#jDrBbcPAh+_a!y`Zj4cfR!9t_zrne_Dm%%TjVu6{PT^8{_gGT zvHoM8uoq7>-=?}w0xb$XT9=BZ7O+c`d2<0*|1h(&?lpXzlbMJ(46IW)$R<+(>Oh(8 zASE@`H`$+;m-pUi%+DY~IdMR3xFEb&RW=RG8^SAP5>OpVRV1{BMPhbO4v znrdFF^Q1!TnDHMrhSHzyQBQRF+Jmaoo;FqD+wi|>=uLJ4k5v;zqIB}+@~#6gnc+TX%S9UlreYevU??+4)9{hGi8KK}jk) zWclqL>XR6cg)Duk?7~ut{5r<$$KfiII~x}la#sw2%Xv4+fv%@lajjna`g%Cu8y1WG z*A!5)xc{Kw*o;Hc+jXSdkZ^-6qRz%gC>K1aQB|H?kC>aS0D2l_sc?s$ANLjT@fOwN z0&2e{#6iLFnwoSka927Fle3n;`J+XUu>GG))dpjL=gzd1Uj?*#!tFrEx5DFKv1&upKfL z{d&%#gy>dkq(L=!2W}Cc(#Dqr`flIdYZ5%lm!sELe>-Xm|5?!aElSN)Mg~QNf_8yZ z5+EupNvEQ}U*w9FPQceEeOjfn@I7zuy6y9Be-!YACt$87hXnuIyW5o=T*?m5G&FAF z6t+dOs8J&!aG189P1`P50j#Q^qsnICssc`4$||1y1z9`xG0|Rze@%fZo&}W8M0CM9 zVHmmJ?KO2?39HDl#E9O1&|&j}I;w;n5{ z6@h+|@ix;j3{q-t86O~<~IKyL& z5*?l68i^tSwzi|Lg1E)p>j%^HDk7v;JXpd>A937&I6KYS)nC-c`-QBOl4pcpEB;@X z`=HF$TP)Ezv#jrx&}eISHg2kZlj^_vc1B(P{eN%X>gff(P!SfF1~SMq)o;v0lm}B$#|xUrym~%63)%*1ge7NiMV= z08zPmcVq1;n`nfYr>~TU;Qhvnrr{!}Hk@(U8#DXD+p z*E7;?*7SV6yETZVNLQ6$Oa))@|EGTpt;fPiL~p@lCVH)Zb^*Cy=ZYOZ)*V8kP<`%4 zD~I3C7eAdR=Ux0T=sZeYPENkP4K1sbT5zgb9Ec80IGr0$$CtgKGtI6@Xl99I)5bhgn}~k>x)=`Y zzd*g#7h;C*YXgaacznM?y;$%*HDx#HwYxkUofxm~T|znHYO4&O zTQid`|C>pMbK^H+raT%P<{(dn2Am!~pd=v)inNYRg$vhGf3D3Bi`A1IR{-OWt&}h=THV< z=!aof&$GKwqGdTBd+AKG&eLf0vB+2|7#v%JvsAevpK({m4S`px1IAckZ(*t=3Xors zWw@SwkAANAZ)c>W<`G#bHn1?}F2}ur`|8^Z`rjq^0o zxVi+5Ch=FMV?nA1W>W8gvF?QZ8CvT0wC`ie!VxZV>F?mSS%N(Y56qaNs8hCMWxp#(k@Mm(P%9HggPNDzOSk{u5=*UQc z$9fU@@$BPsdjGdgh!O@M-%!h2>niN`%ofd1@n%c}+IiY1GS<3>#lOmuHe0YzFyE>!OW&MbUSR+>>r*Opv8Ox;78j6zbx z=iC&l-`FQ#lzYuOKWz044%WS<=!d_%2iRy0z*< z^GY_R4@fM2((cw{Xi0uUg{g)a+v8;Yy5wr0+a^>(1B&_Z+9u5RFv}uh~ zc0!?JLw0`7nnldbT^^63+&7S^Ja`uCPpOj<5Q(A8%(m&KfxHck-Ma$cuDQtK@30%`ZT$@`?l1zdacgAl=nTn@u`|5 z?xud1YZHaj$Z^{G&d$k-aNgZinIn~O4J*#XMcfkFamr{YzOR$nXa*_;Iv2VhQkPVp zh1_0Ojs`jxxqB=~z*vHavBK1Z(8yj1K#KfIBGRo90raNH4>J@c14cr~l2om-8kMb) z8yIm82oD={zuAVfeh2a@c&Wl3KA`>v1O;=LBHfEpx?ktL!{<~EmJ8WnDFSp&0EM|Z z!n(j&jj3E>6xwQj6u(H`xmUvI|F&yPl$F8f&!pN>?RyJiviyHS!{>VouN1no zR#z%I+r9icqM(t+)b=1>fQ^=;(R_)f@@pTysD*QSnp+YxfkvbJWC$*mzB!P z8CyR-bfCl?H2p%;>H@n8mS6DwogF>BS&`|B6E(_HT(QMWRU8iRx3se{8)w{9`KRUj zv?^fB-3*zd{&>}=3t#U!*E@bO{mj#^5V&2l+@CCg?Y^Ur1x3Qej$2)?QO8vszFykB zx44mq>FJCkZ{d&){7F@<#`vxVdTbJ+U08v*4(;|ARZl7uHQRzFa@q41(mU=$L0l8* zoXahhMLHPvhkV9O6>yObDo7@)Wi7$r2RjIh^DEtAW8Nl3{k+*-1f?sM4soF{I9qbD@4_mVPOpC`7oCt0Yn-=kZY?9WyPr#dRZ$-4Ko^87K{Tgv0JdEg+J=Q$xR3>B+@9&LlXI$ ze6CREbtx32P&D|t0GwWOaXNa!@h>9BO;2w+PD+M%8#Ci!6>Ee01GGw-oJN>UAuRx< zx8t^=wS4@KZ3uUp7H^=UNNcG(c{RaF;2Osl@S_SU7O^7N>4)a6OFqZtq(4+{K7NUm zTYVIik!avBy7Ar;&iqXucdCgkrP$WJ4m_FZIQ-6hzcE0uw~(h%9Hkm!s~|K?Vzsc> z{rA%P?C$p3XM9#pnvwi9FiOSHei<+UZ_N>S9Mjj-dAsZEzs!(#v%=YNf4d)eoV|GS zXI=K3q4SVI&;HK&e)`@@$lQD1uRS-R7T1;eDXUmdZ+Cy6!RmdTQPX6i&X1@Ym0-+p&@?S2qlGj~g#q0wxyBkA(;t+@vKV#M97+-=Ez=Xowio7hd$+exT9l?p0Fz;pxNJf@}b|PUW9XbX-(t zSJLHr*+8%f_?f)?av5nsp1iXFRS&5*CkUEnj!bc1t(Whj+@$R7%V3|3Xo0jq}9lapfrUMBPQ_fMfzFx1y? zFj1NRZg4Tw7li1&P+t>vb;Y?;4hP3-Ta=V*4~s7dL(dMh7JfSx9z$p^v5{i{rL)A# z?O`k_ud(lLl;;V!UM%~ec34LWoO#sufKYe1u;NzTmOI!01d2JZ>TYfQIV7T+$+9AD zoL&B&f2yTIXiQ9I-jSmWKXFFMj=N#aG?A9)Z1Q#r4c+4VG8pg8ANH0}7riWIAeg8; zO*tZ#NsFej)n19s$~Ujo%mU07r3cqd69wUQwX7~bOqn;l`2C6rOF6uiIe4$fJw1G= zY6(Hh@v);A`AI3#q__IrIpV3iKn(N|7U*b(agO)J$s0~35zjMniu z%?`cjFsEUlwE@X|o@mxriAYps%fJu+Sl?>af~og-xjXm3GebxFR?c`7L`|8n+iMh2 zQI_t$_9r`FCCWphus7(*-ahPnZMk=`o51W!e05(}$o+r7qGT`%W>M*PH7Qh{c3=Y} zFSjM>YCAF~IeuATR+)$Uq%+~cpimPPQWM*JzD3Z3AQ}tW_Ytkx9ADw03@E>rDvNqx z&6i&XF9flTtfR^LP^TNGlc-G2$jz!c=k4IN4z*Qo%K8gi?~UoKgvGYl9NThj4zmu4 z+4e=q$Pb04y(ubCs397eeM6p|R$DvZCbhY_ctyCQdLB7(VBe6F8ljKZ3wyIs;3GMDY1+%#nQ?87avg=?0QW@K zJlpM~O7p(foc!dNNR8gRf18<+f+`iQxy`<>X<=cf8yWx%t(07Zo(7&Ypp^X)?-Jz9 zsg|a$^}n^##I};*7ej>oMRcmif0H~VAgt$(O?nsoOWXcpBmAr_QtmB zvPwSv&waphupPm6Hr;JwW$M~t$nKa3VUfH{nK(P7{H{d2?svS9S~kDw625U!f8T)3c0+)$4$ zwx>sbyAWPxg`+dY$fkpzJL2*vF=O(4D@giQ>&tG@{iQvu@5x^x_v8fe0v3F{QlRnP z=W6Gy)i3P4-$K@c=sQHc^x(tkgLq%O(7_{_i?HMi(y?P8iq8@%H)!IZ9DsP->F z%Nr*IyUth#N}-}$y$GKkV{Yzt4Ebvu-EPQJ=XUlZAKC- zs`uXNj468PLv3SRPS0dnY2s3bg8bpEi2Njb*~(8#?k)+%|M5by9=s3KUCHrWc79c*x zsv0Ntj!dJPD0)jUOOpbA6kulVNI{ZkpZ9=BxLUK*4fR}-iLX2T{DS)E zRD3#IiVCE$8R{>_#2`7CDw&6ZT4LWqj&h4M@| z!?%VK$_Qr^I5^*`$gALUoR(b4$fl6V@>}78qdzgVbm8sg48)UW9ploPauM`ORW@u1 zoOu-(O-MkCDw&_-zMQga6{{bZ3v}$qv`z>tlO9L^S<4#5vv~p99I-6&U{JpbS224> zxeHtn&dv_J%)WG!%MAX4Ul&}g1AxKP1PKhbvU)^bR2-`0?B#sy@#c z38R$0sP>YA`}P>h}=BgIlAm4frX*AY>$2#?L}v#?eAO$3!9S#D8>Sz zi%2s+cfY+&B(ONJ@M(Hxv#JMHDW8|%3|vDw+#cBw%c7}5c(JEI;wCEGX!>P7J4Dmh zVN{Jd6-2b2;?2p=gi7eBL@A&N9#k?c`1poy=YvbGN$qLWw=X+RZwXCz?oIKVu@qyH zH9182-%6eIh5nWMj>$$PJhDeX+-NXY_1fc4hOr%)5e|ZD9$tjnN)9_6F9OcV6SJO& z9UHV>J6xvEjcrDcz@Sw}$=`96uMI7zC#5vvegYZmxy{0K2y>3J*xldQN zwr+19*tqmsg2py}NCx}1wMuq}!cV+~&A9fqC*HBG9qbn9FGLwB4s& z9YA>VbZ7r`_){Znci&}*KAgQm%Ib7bO2&ZeZNYxY!uCdikhZe?m!EqIoe-+YZY(CI z%w6gfu)Lb7nay0oy#eL7LoLL&)OsaOg4EbAY2e-ug(==8<-ZU4y=|gBZ9tf*`&@IB z`=prYT|s--fXPEPusN0TKW9T+?%75&bw|Eo9DP9a{%nhPl0RtQ%=HYQR|^Y{ox5|3zF|$P zQ~b|ga>gzqF=ZKqdvwCfW~&MPyA(02{;vv&{j3lq*w&eI{@FnwKExU*(f zNNK$KGSlYsn<~NMOBYjCJSLSi7CfAWnt8)WdFjvxR+SR-UWvfdjUjmBKp_hXpqfFR zO2aMzQI1r=`6Vp!0jSMcY(24qtNS&#*&yj7-{0Dh^L%Qte{t? zN>H?@-)5g*6+udchc)~q8_%=mjU{yAvGwNZsizlZB7(ul@b-H?dl zao4_QB(Z@zlZa#*!I%9{Y}b_XZE9Gf1aB{QMaZC;kDl&V)&w;cpW%Fsf9`*9jxsfX zAG#*6&5_u;?G>x=r^Ci4yGCi6V^bk6A3n@tV<5p$6_?DVUOX@B!Z7G*?k-#ECXOc* z$s_51(}#HM341u28;O!1*#A8hUj{NWqyx*Y>ebg1Hym?MDrDK}H=2fBKiWoFONZW{ zXNO)b8SRZPC@dZjlbp280M3Z{`ThP+TDshO>D7)k^4cPAnH-ctn?BgKT=as z(a!+g;8jqcQZk*c&wu~nW3;vl8&HDq-X#3Q+Z;~sI{Vd#sX=+rly7g?CVc0^(xAbU_Am!TfH9HDPqVZ4pQ5*$v>PM|WwpH!Nxa!PRmO4iF5z-0@taf=3V)JFc7s ze`^oh-JP4r96>gQ9(*W8N00oTV3us_kAO`)+&}_YGHuirShVqcEhvf$+1LL?2x@vr z$tZg@JE)g8z#eyCo0ek|W4|0SzJi~*PhjId!&Un#`m}L_>e>^3@#DYL5+)3{zwh=E zQnsLj(I1<5kH7z3=%~qeTqfy=k=4}6QYaxuH`ZZNS^aa@@~XCjixYHo6^L{r0j*Y; zas6{$^|vo8>f0=({b4uAv`b9ELSkftglrhO9Qk&pP$w+a7>w(F0r zjD9elDgK|WZk;dN#Uv#D(j+y|($XFs`-#7Z+bOtM6m^Do`@&S%#rlX<&K3ZVMUtnr z0YF{L=c?r${X6|2f;vsm+2}u6%{VLKs9zHa8+ER$$MtjT4?SV__CfH2?Qz4B<%g=G z?$De2{rjrUo~Ou8h)xTM()zz16|5u_*$Xi19V9 z4x~cp7N|-ExQ2&wt4%U`R^>kSnoQT!Xge+*kYpvf)?;jNrB+*W3mvlflR+oVw@FIP90T>s{mdRxP%E9yLari7y=notbn#jOf;}#K=N>BqG^3X z#}t}SQQgs@DAI83dIbeUJ&@1`9CdHE-s?LX4-Y}1a%K$`(3@CHu0czWAH*PUK%5W_ zP)uChlidEk_8^7@?DcKjogPB_ke_`{FGn9o=i)B%S-PvUy2OlK^a`i2eELMYadVXR zLUvyLr*#=X4?-=4-Rf!W7}eC&*)0T^LIKXv$F?6WHiAdy%j-R%KApd0K#Q1r`SkCe zVd0W~4e^!gyE#2rSXf^67vA@2ctO`B;M(3B=zqFWD`K@R$I(P69dh#s8(~FboBCkE zilsXEORSAc5|3n~;1}$Eq9s7vyJiVNd;&X)s2YOOKLc-6H^@!wU}@$&_nV)VrZRs; zj3;(=aCImf8VBSu9X?y2Y@a4JJPG_EnNCmdfJaz@C1XcUkC(zrFLOa@r1=!g`d%h}2@+7x8_(U5 z6G&?;h$+MO0sB|61L$vzTW2>b&tnH0*Q$~a; z?e7YV@3n~M%Y2ps^9JJGq#s}7F44Sda;=F(_MQ13p=lkiU>6IKVlCmXGm#0tRx}G- zg5T`z0kycc3h^Cy%oUOAyFDOz0uVc$XfSYIQGlXTTvul(6P!id*$N~8H_|;ssK@al zr^*~~4Jdk=8rLO`6sSbe zFlV(lc7?y-ht!*a!*``u3UY1CqGhAyxK=&ii_^v;{OT_Z}K=PJD9=<<(CZb z;HRGDbV$N)7bJA++-K&to2hc>4`YsPNTPi_7HlHGQKU>&<$Qc#byy96R>j zw&OyZf)Qg zPDKU3=L(C$#f~o`7!}?MBpna|erABLHoZ!5ko+270r`8}!hAGI)Uv%@ z;t#72J4xtCP^r_ByWnd5v5$IQY0|6aVa-_=3U6!`4Ms`7C+_-0aXB=k-79QOxn=cv z9p6v1?jevzdwWW(t_$yd;JMe0W?_J)aNzFR&+3iqp`!m2us{bGp9@Aod%dkwqgGOR zUpnTD3JMB+#YeB;ON9~vTv*70fjg18j$HMes+!eBF|xEM^uf@90fT9Pox6TKU76l( zMB&I01=vC-SGE?cy(pHqR{O#-)@D?@>{3zoOIBGPEw=U-gBP8NMVfaYAgo+<|CyDb z5&CbT=wX;Lu{FG;&dJ&&%WuBULeWnB{OI!X5?Io$-_3LayI#XD)0O|Bqm-UbAt%Q! z$+PMgTuTVf!p6wZMcF{r zQV|K}P{bDAGs*Ee_CV|b8qe>U0*9gc1-c|9SeKOWqjHz@E1Mlz2f)fJDxog_N?@4t z`C9q7{l(|o?V@byS4`p3e@8bHf;*FzktHva-r);kU3R$EdcEGqv3MWYQHMTRw}7=# zVUpq=SpD82J1Mnvr1iigp=n|2=a$R)`5BD<;nKPB@w8{%dqZ`!UN0zFH8omKCR!M?DbzxEtv=O5zRNfF4C8!HBLG|xjTxfpJB$KUGjtF--LtWs7}?WkbDuBEXp7u zF#Vff>7a;VLLmV#v&HY9P92; ze9Df;(Jac zICk65noVcJ2W3|Ha=Yma_3!^sLfOi=z20G_Vtl}~uT9N8CJT%!)kbI-Rx*3PFu)o1 z+@GMpC-_8Yfv@=$EB+h~d9n@aKB2@QAf^h6gU;;i&v+h>MSjv{E%*d3`NaDJoHM>) z-86F7D;*SUH@JGxXXkUaOId`B9Jo1vPDa}6FD^`!AyyhpU&_X_l>Z@e6m0nXIT?8P z-uSxeKJA<(C@kDf8yR{Y+UPdb$S0yS>Un}?@`{p}#3~cnF z2FSU`Dw}K>t!H%f<=A?5G+LA}_oCIBTK%^nv$t7s%AN13HnSRjIt#h|o29P-TRPWu zSh|s-Gfrmxz)G>~?EHs!y5@JzvO2fxRRr=C;M$52#q9QWwPx03XCjbX^uZSAgA zLt=v5-coHCY8JITo=kUgd@KalT@bX@B8%S6$yxa2$EWCg$$MFZKp>ZkkOxmEVGjd$ zMNhM+${ulXTitY)R{gu-lEfk*S1>1_;YS?wj|EdW+sa zYg`|?8+xF zuVBA_rC9PC^09n@^vhi$?q8*GJHZ1_7^0{DV%%9Sy^_|VpTBywoHO{3Y|iCl&(iJz zMN+7>@%_pqXxVDZ-Ri~Hzo9N?VlUPRl4^(gFBU z!|d4dg7}j_G{u0It>H4?M9O@4YHXEPmpDvvC2zDp;QH|V;124r_X|AGE!O!}gAN6f zyLfuIm`y$jao?>*M76b9`t&=&wZ8TE4NyK_NI$*hu2@L_#KXO66?nTJG|=Y|Gj`Ka z*zHBQa>d{)N2`&@84n|oXJh2^*bn(s#q;Uq8z zUoZ3YG>D5yVGmXuw+XKpxT=7H-yPvFm1o2ccJB1MU&p@7LqoGrl&^0o#LqYHt%C=O z6;LSfU50)$A(mUXQ$%V2Z$=Gb;LxT~QGsEl8nn%zDe6t~Fu(^-=|^RlS3Qu^U=O8P8c z>qvU!;T*|H*wd#XTH0ALkL1R9eaEo4p86G6$CU-PDzQVa+mdq$Q^r56~|Ee9|HZ&v>(uo-_s}fGiyDg<1kNZ`Hd=VU8_Ji+P zla>Q6_%$Br;5+Z_55i?lUS?t`n{cOiyy!Y^T(-c)Nk$vS7p{-39nww6i2(v@D`i=R zIFLhqrf_&hxm>GyBQLKzm5{1&IV~<82AWg35Ia~?S?_thHzC7lnF@PJK83M0h&{oY zo=v{*PO1bq2^WoxF`-IVqjWvOw-V_+z(F`EkK+LT5tZY0ptmYidw*jaG1pfqxOB=W2Z74}#g zc6WG)-j3P{D!Lw#iH{P+)&S|%4j+s@&Ks7u8`WnucqoId{jUy3BOm;%_ahwQIa!ZYpRjM&_e z#@C`)8IM0y9kQ7Y(v_00{rrlgL-6??_dgAsk)UP}oM%jh0c@%QUy|$|#7AA8ve&u2 zeV(OR^G-+5E30t+wKG(eA=r229zj14hhaXqUeCYmJ1bSLt~W+>cz{W@I@{FTAg5;C zU`F}y3@~-7h|U6$N1^b@_~SBDI2V%)u6)ax<7gf=r%SYrh&21E@Lw~(RR}u$#FP%M zP0xD)2u&m2(l_c>6;%VKAoejb1FOQRTkypD2x1vLHcYiDg%s;~z%8U#M76|#kmIeD zE~cA~OH!7WYo1+y{s6}d_EQqXi^s7_$h4xOc9=J>xJ3Sy)U{kZLrlMJRhuxMrA3nO zQSrIKPx1E4hR8DoIklR}f``hf+tzWOMHe3NxWLPO5mXlSu{YjamKIogr5FMTUeT+*$vr~}Pgx&;H2@-lgfp|onl_CnbkyE;lcMBI5hkZTCpCJvb)^YORcAp$v8+rm>^bhCd3%ZWJmD@e60FQfNzvpf=TD3)d_0^OZ9~*}9>7fMb zJfX2a1~w@QXn|i$(|t|m({^) z*f^wun?|9BTegQ^By^daZMYhe)V9|;y%znLQYeKwv}z8&A94)-J@gT@+y3+G`8iz- z8fkv3?r#3jRUqnUxig!mFx0zO!&5o5iAJe>`*kpKm(n~KB`UDq_cXMILo(M@tD7hD zqVVt9z{Ng?LDS1pq41~;Q3Y8|)sIbD@uFDL2G%U;d`(<>Zx_MZm@^eI-?`GLKuhqe zss^Pi15R@5OIRh<%LGcj;FPGlV@!_S-hi~=a zP*{5xVzvRysTq?=E<7?>Wd^meRx*)bJv(9s8))nib*N;;&wPD)vf-T5>9~t4 zxh#?Ik1V<3oF2zn9Ah~mCKVrssyj>yL=v50(EA__R|ECG&uQNWp)8i@$Q-BlpHFy?EZoLneqst=Z(r6#kBa!R(LpLf+ouO`WgXdTizc($Z68UTm$EbL+KXhC+ zJ^>qcfck&1jvN_yKxzy;4fWx$8NBW^Yxq)urZSUT!~M{2+NiIf)u0DRxoV+Ketw;B zu{~N+Lx2b=vUq%S@@fg*dNI{{0bDJ%viIyO2X4d%+6M&0rKB3*Vo|?*3bbng!V@yD z7#H+W)OUn8rF!y=i^ZT}QE_v|=63^kN~HF)*Aa{3By@j~8w`s$(qW6%%{pYv&&rvm zBg!)7*(bAHeRO7B1;L@mS;JSj+eDLBLW&4ihI1r`Mek-DDiEjI7~-MBV>bK8jjbjx z>pUp@9Mg~&?c9~={mHb=ow;l^JdMoTlykU&s{JG870dI9`HlQ2Yr;sD79hxnmN zG6jhbK{qFJXFwQ*1WQS6E$~6hGrB+Qshci+`TAUTwL@Hdf$EO3CY>1ZnQ)~|ZJOjnY*|S+5O}tAcsTjZ%H6$@s}^jH+w4f=%EcZX6)%`d z6M@Lv9f!~^MqjDS@H8x{H74q;MCWL44SyrU;MccB%OC!Qq58brcOUWh+r^v`WE5N& z`e4&%#tGzJh!(u-?oi>QuD`jymO|d9*Zk_yA)@7j)1wh;VM9JxpB;aaZTFGRJ}w=> zHOa7DYRF2cZJ@5JCi~W5I1uQ`C-`$5vW$~%ghq%)_=YSHbxzo>yYj50jER0~x8}eo z@cJEyHNBd1GHFFTl_V4@h;>aRTe>8CMJ{jono+GL-#if7na*!of_V0gly0bbP zM%QiEXH@n}qsB_CdhO_Rlcc7mCj3$++NX3I`Cu!_*PyyW-a-4!PcHq{%lFq((U^l= zb#1Do?YcLRzqP7Y(52aXs%*IKx-UC({S~%gcvEL5=d^3*XDOQ&$4wK{j2Px-5J3r( zdOjngforZv%pT^KH#r|Q$)k@yoh%_f{$pw8!vHd{v>gLId6JJDn=) z?3mO3i})#W2@_~t43wZ_jeNQ+LMuvE3M6h+`*ZpwnLh?W2vlq3Tw((k~Z{sg&Yh_D;R4+CzWnD=x+mL2AD>956n|BqMShen%~$)~HTPXKgzQ1XMoR7w$fnbtnB2yYZ8&HAfqw0){!lk}Lf##*{|$FP)owwg8MWkLhp{p{_1ZR$x?OnYuOHj$pk z=Q!^ab*IOyR);5ytdBE5D;@5u+_z|C|9obq*}letsy!ARpzWqh!liQ#!Ud0GB>hF& zm??co3}@GO`PwwSHw;d$Zqk^YVk>MV?nqPN_qL?YT&cn{iYkk*nFPz`I4ZAZyp1T- z*^^@7S80aI2M69Y?bzR^KZDirzj~Y;v@Q(O@C)-%>Ek(KKf~PSVlOZN{f7~gb012- zb@oHDE9i88t`zxV>8@n{W>($2ps+BD1_BeGsG?B;c|FC1f~&~+CTzGoN9SOftC*imoxe~JA#A+wFn#r<58xQo5Urb;n!Qrjm`&C=SuCxt zWkqg;JVUDJT`zzI&268x$%g!u!|zvv}EK3 zNl7^r@<-@m5!Sj{Wqk5QukA9|EU8|{@##4y;lduir>4kKMcgoIQ$&Aw`A^Ur>9w2* zjglj?sBcwbbSTgFfj#`dqsp99)gt7I;KO6YLv<6pmPQ-?7&|%4v^Y&$x|fqLH2wTS z0W{$iBkv^0(a22T)%K&uGIZ$Jp*UkwfvuN9r&Dn&lwM)=wsW&W;KFCu^JmFV0ip;I z;U%K?+P6PnoVk09kYm38PO6#b(}T+|yKNVQV^5hqrg}g#ZBmCkWpUI)8$^+ePvjOSpzVW42lLd4Jcs( ze0WI-iTzK-#}BPjwRge&Cfo@nCfwQ556iQ@H`f{S3(M-OJ_`lQ?oTr$J)yXKQnwqC zrKP32(A{7uCHXxQHzsdWzZV>pDkd)d zVH7WI(u_1V;{h?<;wd;8GPm@b?TJH#QJU2~9E7^R@q3`}!@)O&k$yb8XNZ19E*|+e z`pK!XH>qMtJ0}>iBTw4vfA%|QV4zcn%x$hsZU2p znWb3DS z$cBne@e2<80?56akFQ>~!hwnE!~+`I6GqBjo zF^80J-%w0l?Lvdw-LAyv+0rtECFWg!63a$_t$t5ZzeSfYC%y=H9+~_x045>X$2OVJ zf3ruaFIn4j<082hH>I1{{5(+83F2wrDJ51-fJ0;19sxDF5B2v6z1!No7=5g1YZK2^ z4yXU0|0_Z-WXmgs-b)lgE=+Qg1o^wpbK^TmXh8}{r;$zuf{!)Ox3D-(xs^Cgyqx+k zRV$AX%419vkTg9z{#?9qa7@DJ3YB$Yhp+eL>4JE&6q*XaD|?7l9>dQSF0&JDN_kb| zC8!=^{EG<0=DG2Gx|+*G`cfrrzRj$0;Qk&k!MWVJ^u|?T7pMX3Zsp71MzU4#`>ibr z_`}$1&={GHYAQHn-2=T`1%q8d)=0kO=1ax~_RX8B%rq*Ub)vC;N>`bDsOu6hK*V1; zw2Y0idfRE%m@#i;yeB;RlUH87uQf|&npDvJgM1Y3B8|KAIJXbGw_ksP-8}M2gk4`go*zzhngbG>`gS|2n5o*)sfF5+?X?5%`ym_>>gF%+ zP}h*h&6%11UH$gVgYVJ-2LJ5S7Ei;!gnq=+ob+QdcVk0rfCSy1#wE;ry=V3I6dsxW zJtyTo&|p5|8Yp!5vbUjw(;f5^D|;q0rhLLg&5MEs&n&E!Wm5G}}(&UdrNc_GUUma_M$5wj@mXP4BYe=Qy zs8FIQFMG-$W0+M9iBiyHs3BbbZ_si-Nzaf$B95(;8!65kIWfqQ5+=K z#V>}mU<$C!muaHSVcLHu$@bD)Rq_YBXg7|tm+xIv|7{`)=s&N69pJ9WZiPS%oBE1$aD-u&Tc zQDoOH$>;NhJ}`JktYrN+&mG6LQY>i1U{7?P$P4&GIiuN(h-(|M3z>8EgvQ1tlvrhf zw*uG7$dcy#5U`M2i(Zp;_r+tUc9%S#RbiDOfA?72M=$R|LvjqV?tPQ``vzNa@aOt&Nw$hveJQc zN5P+#5*D(<01OVWg)Qhf4!xc-FS*-AJPkpPPEImyuUd zUD)%O)#=rq`TzAb6|FgU;3(%>A2M=wc6EF8w_lZ-+bm00`f}t~s;9D86t6diNB(Dg zCM(kI$un=iSTCqxRlbjHJVzA0N(Q<-I)!?jkf|T3*?_0}02%^4weKtf0XrG^=Xp%@ z2=Ak@u9)vUx93ns2*RO{hg-L&8#8e)Jp$w!4}r*hA9CKGG%3N*+&xV*f3aB$!+QTXn}5exLI zjkl-~kPl5|^XS*=8bafAC@?-x=YKN@k227O28W6c07G8yX`BNU_U_~#pE0U(wbc%G zzJ#5G4@B=*9R%GnXhg=)my-xY(m0-tY~(ZBKrqUFOk+yWC21cae>LiHg1UlkV4srd zfQ0(pT_A3oA^~W5n|;|yP%Lzdr7K36GC@Zs*=RIIWiLf`1$si6{D|=1rC#>v>=6q# zWDy|Nj+mUybEj{eB8FU_0Fu%>7M;C#s8f9gew_5fxhFs;eHg+iPxOiIfGTI-zwk5V ztueNZ{f5fvII9ytxXn#^RoOw; zWn13Y2l^TmZ)(;elQkjv<}5Kz_D@ZYdl9|NF3e~Xf|ChT0(PcMD`{MJhEYzLUYp9)aNpSfti}KCnS5DY%@4)c6y?V)j4QkWV*WImK zUN8C=t}1W3v-Z)+HjdG!{;qgd5H40N{@KJalUem0R@hBk6% z9!61%#$nEVv{vOSDS2KzwlpFm98GK~@RBl>=>TAzX2FGGd&NS82vPg{{_Sq4%UM+K z!TrF~%@b-I65{{OfO`?%a|4-X`42KObwMyVOOl*SlKeSy{;GA)=5NaFlsf>7pa0|u zJ4>h?{p%!9m?(_`YG3M}w@x2^*X#I&3#UM-jQZ|s&An@`BSS4A6Fk)ds??#fN*vo~ zI-0DhVoA92Xg~73Mto;u{F;%ara95VfB1s7CebO_nCkAz?XTbFUw2r`4Hk3X`UPWW zbzx)QteV>0iuoIu(h{Z_f@+;Hn>eJ$XlAK4a*cY2n?&Gij5tntv+ZfWg4ft|MSA*n z>4Zb6(>RcB@*d0>{BWEAw9PE&Z*tv4&vv6%*;7}6rb|Atnq<+7Vm$VCZpI`IHBRpr zZA0y1ECtY;#gzxMfu4 zePX7Kdh)8z<>GP4%WT>hWL31Dfs2_f?Oflpd}dV6*hliVIfwUcgcurv_PZ@lEyZ5^ zq=XOLP8FRTL%5gVyG|kgR7o9`m5qVYZEIgms}nzD3ShlVTT}#ze)s#B7RAe8w}pvj zW9dOU*kK4}hquX+sY_wX(yQ$OL(uYf!r1MJ_e{oe3pV_3qAVS9tqmzEI6~;Xia@< zUl{>)BArW-d4`Dwb8>6}eXb<01Z$J9GxAo~eVp(yeMtFog>O-Mt`du`sh64DTrm5A zR%nbVhAMKDs4i?qUE<*3 z;mZ%qD-n6~SQ)JTR% zi-!1+S|>Z`Tvovd98$@K*3yB!!Q|KTseF%^;93Sa)8$=|9^$f=gRy!JopwX&zqaH1y$qqX|2%Y-WCuPERZFG%Ecjro0>okH(M zv!zjI$>x0$J~QfL)?m7BZg+}{J6bEQsdFQmS8pR+K%VYn{{d<=AJY^wVb|5V_Qgdu znOMGW!*RHdl`hLBKK0o>JxU3}U*}XEWhQ$Md&%T?2J#9Y!yx0wpAh#vOa50&nuEBv zp$t+4HGjVd{EK%L&UgskgWS^%AoVS^Ra*k8Mv}* zYib%YV|G}C?80$ll@o{A@c4>(OWsu~Xi?b-(IlO~de(1{+wT2ljY}b9^;ZSre*HHG zlJ*Spr=&ILD`>qCnLncXWXz;QFdXUE+lhMYqYZG`#4)FOA+Pw4t*wpCM%M9LqTX^O z3zIRJj9(LVN@g0nTN47n_y3mPmJ>Ntn%1|qLz%Q14bZ5|UyzRG$cMji_5Sj-WqZHN z6LxpLJJsC)?>>15rNS;v{S>3aRG!G0^6nYXyjH;ffec(_$`Io9RZYVD@D`VD?j?$R zc}^mb+QMsVg&fTcM(uDmdP4SRteCNU%-H4i&E=q&oXHm2m_p6Eh5TV&@A#&g3bjbw zF^*r~e_&LiF>`=qiN4AZM%p$pW)1OT@l8dA{4;m=Tzy`Qp-vig@y^6b-a>}iVbV#E zuy0Nbd;P{#H;a#X&tx)1cb+SSiYgrR4Z^Y4GU5=EAFI4hvS?(dlAq!h`yZbooa-6r zt?Kfpd}ijX@3i$=vAmb2s-Av+dkY#;{b3S1tM{L&pRrmCSA`VGa4Mtge|S;~d$g`E zV0@un1LRk)W~6-}26?dx!-Y7@TjcDu$O7D<-)UFZkp=5ge~a)3yU8hT9}^nQB&6$= z7N9lNHCp{bK0=2N3@kjnAdkh!h8ic~JZkISo3WfvB+_he{U2{HYa9FV0rh2drmjUz ziCKMCnTMaB{Wp`krK#=o(sksT5;fSfHT~~OtwA{T%*^7z?eRpN#G&r(cwOoYJ3GJe7Npy z1S0oEORv^x$6#M?a6#bj-?tAg^W2M2h$oV#@dt=RcUN~ygWzHexUr$(^(f?Vnl=jmzy5I&uSJw~oS)=Q&0!_N1@?y`YFRu|i7$)}#Q0Ge>O3mx5k zx|e=154qiV6Xc`N*r~EUc+<~<;;I8;h@cV zmG`!VEqs{-2|*1d`}$e*MRXWyu=t#gEZFl5g!&TOTnNOVGfwA6-OZJLQd_9guYIR9 z{fZfcs{%91T+c$Wl)UR_jaVxAW{~_dT9HvJbp0`o6pbBVnLpv*K?&LNMwbzC%#Td%CHPUS>{W&4+Xbfs>0-k6G6yRH%e`zK2M1R%<%v|V^CN85W$U9khP z(hpDMw> zI6ZyrVtgXqJ?wu-@$B_Y$WlQ;!E<9mHG@|GJV-VJRo9QE#{Rb>TAqQak~**GtQ{Yo zQKKDeN#!NY>8~NLn8%B$UB>p(4+N@PoS|U2%gC`t2Q$8(#MM^a&lfTx{ix?eb>9FV z02=hgLJRkA7yiO`V~d8aWFRIByE#?7L1^&R(cQsvE#<<&iG!eCRPAmiNpVe0kKbo? z_0Oc6hfd7~T>ZCO2_+EWzMHhiIn?_FyXZ{f%m`#b0k9DZlqlp-SfnZc zz47uZxEQ_W&=FUzp*!d9=tzP`q26cJSGD>ous)*!PD*;mV6%&))j#+C##K8^ZtP>` zVB~-O2;@b*23Af%{7HBj=+R%v{)*BaPlpN;@)n?@`;*w)Z(d%Kw;r7w9iL>a3|nFG zF(X2N({X86p7*UY>I#Dc9h}m{3r@988D!vKBkV4jH&WVf(_UnwkEO**Aqy1=?E7%D zewbGdu5AHOF1VPhi}JzYV{eVpxE}()vavt({OajI`l;am!&4&HA;AtSC&?%P1nQA~ zn#fLuJfs+SyibnBO<~%rU_YK_Dec~JB@5er_#5-GPrYo2R`ISw4&o9`mceLiB5K6y zbw&1mHJ1lro8&`=KU_LVZ(jTUKRe1Fw)p-IrfiV0l-bu(YGCI zt|WUCrRn3kSNF2y%BjGrrncMF=>I4>3%@4cHi~bfhN6s+RAL}7L11)9hro}J(J_!N z>28qj8X+Mal1g`X3;_WFDQS=r0ZHHI{R8;GXFR)~>ps^x-vhVJ5*QSsOBgG78qOFF z=;V`}st>Jl>ip;B=y_bkSyZEP#YE9HuPe6vTC$m(PVP)+X#{cjpn3(kLdYc3wYsyg z%au!{j1kEbDtpl@OehlneQcEdn6=S7WO_p zN~mPPk8~z0ihq0=aC{lS=Oy3o*!iJme!{0AK8ma~fC^?q)h=Ke7-)=Gu0LEO2vfi% zMCoO06oy35zxuww2#O>*%6)2tMnk$!M>-o4L8@w$KndHwpB0XNk>1fssiKPgF_g6~ z8xFpOn?$|yt({rwNH}P>>u*er%Q2^Cai#mr-k;sKJ3SrCwco!}`~5kQ1Xa^Cw`T`l zELbIn513X*v1}wA8{i7P%6NXEB_<*yL>@dt`6_p^25S)iiQ~W2bJOR@h<8@t(Bz*z z_jhU%-kU^!as7!E-f{pp8pEJ!iWo-#2jYHRTmHK6)ZEIE#)eS9HjbHwS_7jc@%i|m zVCC@w+!Ue!CF++|Y&-~dIAqar^7|tCvV$J5ez{|py8<0G=b=S}BFF#PU3w1A zrTXtwxgWUudV4$j`DxD20+h-1bvD-j>Za;NvuU0KAGPsIPS9Jba6rmE*@)2EV@b_Y z9fW>1x|te=bT5mx9h?Jm`(y}xc)nT`0X>W{6v}`e6aS-sP|LwfA!8>-69)i=0If~Rrv<3Ig% zIe%PT$tkt#SM8jIK@GEw=iK9>3r_6k{s}OZEKy$?-@!CPqnMa%&-c)(frHUmCk8x$yBWzQ-(xXIQjG)fv44mVl=qM zztZ)e%* z>+-Y1m^0n{u(>*YY-?|fQqF?-@kPeg&s%BS$_9pRh{FD#Uw)mskwu-y;rTdkrzu82 z*1d6fcuCx>(tB-*q&T+4adRSq>w3xW?(|mu9`Er#I`N}p7)SCQf|?zcJj8Q}S9Ttn z#_9>)EdcAIt%2E}w=PC$Th^_-90rSqPg*aMCYXrfn&u7gZwuVgnD7A?|9Xjzz+}Dpefv{&c~{$vpE)h%*DwG{Odc2m24=e+vyWnqk5iLh-EV5 zt9>df?^xhFe_8YCcoL-kyr-1~k6S{xy}eyTqD#ovovxh=Elf8*N1cR0jq{nS znpo+lW;yOuod4X1xb4prv%BxfzkjT*K$%(jed3ly zr#KSK2w?$B@`Wlf2;vKh(1*JGJ3`|wtS;Z|_Hcsxai5x?dYUsBvA{tV2Us&0LV7lu zUxfEu%196)@$6!yD3sTK{%T=49F^9PmTmlg>0h_M?}ORufeBc<7jSfN%F5C-V3iaR zAzw`~RCO9)QiL7+s$kDM=}b7Y;Y!!J=fUPsNUsC2yqNV17hF( zfmXwSgdudX$MJ3rM@$ES>796p=IttBY%G;DqOQoN|M#g<5yC*vhQ~ zUGxvjFiMC={=-WI&?XgQit}@dzHzkZrWUI@6)se_=-|fWgfVosmHOi=|5Kp+1Iab! z!dH$~=SrJU3%HIcv8imJZqd-q2$WE^aOs=2Sv&bbOSJ}l!epNk$JUT zwM*iH;aVF*J?bIx=PI_Xb!7fRqFrnchBy@7#xAYW>lB{aF84DlQLBzv&sOOm21SQh zwe;#MX6>84FG>9r*=fFakPX#aQ?H&ielGfzP=R#VmEJ6d?ar%}pga<3Q|$0LtILw; z|NR*3D}TCZ@5i&MReGr(c3Avy80C^Zm7$jg!OVD=a#B%qG^-bx3}Kvuy1F#8st6+d z29KeLwzI3-KLbrB*3ktFi5&}@*p8G_H$M-L07lcQ=O{qLe}x6(^(rw|(RSzB^U`+75;u3L%}xm-`)_L$|D z>-K|IpH~(8qY>usz-5i6S+8at0ZP9L*~tgJ^wC(FH|-7q9QL4Gtg3eRZ2)Y3{FaB{z}HKaKA z!pLGduRHBnH+(#YkRh%NpqS@@_p>_2foIImt4l>^%T$BLN%4d~M}7u9u`;WAJorjX%%BQ zxoQSCoLPh%T47PCDE+Kq^-vP^&;*(Umj_wK)q}15K?%m@nYw?N7ppr}rp(3CAak0%)*7Y2Qbw-5N zQp&yhB)nvulkr^d^%Us#{%(fK{caRA=JdS0cxa{_W3hC((aL#{8JRYw1x%^9I@Xsa}0alQQ9WDUZankWpKW=S1PiuM+TudaEvsqIWXEYxS+O~IPgH0}ks zdoNAXYx0xs37EtF2|AnOyjKZ)B4Elq{YT$>K2|@((rJV|(w^f`AIJjgpD~%&c6Avo&IaHI$W7xQ|pzwFn_=9R%_6 zDbw;ea`EBsAlY1*>7_e6lxNk%QR*MyUy3jw!bCqMc%p7v#URyx4+!Wp@RBl1&@a=0 z+5RKu!q)g%2^iF@p-D*3hBEL%2V5AoVR6a+nw zU5Rmuozjm`Dow1PlkYjA^3{0ps5_C0l$8W4^MQ&ih=CU(TEY8SU@))Y9Eso?WaDpq z!1_AEcOxl2zowF`d&i2>xWX!3=g}FrmlR5`!S;YvIucZXl9VM)tR#$XKE=(7_k5xA z$o}SvtIO+j(;JOJFBzgcuUY^7J&u!?Q=Sru01aAOb<<3M=E{ME!JeCGRnA077!F96 zYiXef5>%}Qc|#rz=H&9sY_x0ZJh*u$L2ITjIMEuX(5nuKP+1(74hj{)tr7HkiI*tk zObQEM331-Ct^{u`#Qdjf65x%1_kjRv7}8OSFWCF)=k2MET2;@#UHaQZ4emj6s}4VF z2-rz`t4!FqG7jm!#lrL&Qo_>*qNLQ>7;$?A2RFCdwv`;VrPb1AIK_6-i&zqhtCVWk zRiOYrZwHVd>s?sTJKFa;ZkW?QC}2Y=^{o*id6>ZP=O&uw^`u~Wf4zjt2K%K!HlUOd ziX5c+KqyH@m^ZrA^kpu!KihOXnX*!{UO>JA*d{#s(kbo`5_I265F?)&8cHae@4{iT ze9_xkeK6JRkd+F32xEepZWe(sC`Y!Nb~E4bUqm6Y{;TxQp0yO5h$l|J9`Z#?RL;3d zb5vy3UoZ}4Cp&O^>JUI=^d2up4CNO54-s7}6U-pj8j^6pUe|wIRR<{*BDvoY6jo=7@!mW1* z4#m(^9yn<)w^t2$+>pB-g*+l;-}>L${{D+l0J#z}Ydc$A1B*j$zjbu+YtPclpK)IA zkXW22a&i~WHAa`*=DCid%*17N$R){TU|@@vA%DM7;;+1gTVS-3>qp|MH9&CLiR_ip z4U&MkuJ}-fpaPi760gObIUElPI8Pbn6wISv6o0z_lXzY}mLA{LGr`94PR~(Q1%03v zOyzpW$i`f#*=9s(xyeUmN5}#4^pBCnQUJfc#qaifhO(3r$%tT=q@j*du=|l=7mRA< zu0AF(d&W>3G_6T)p=8rxgtctz`)XXZBsT*p-Hp&%>S)z{N=FB1GP%ZByiaBFi}AYL z(7H$gA3Ijn2ZRDNID7nDO(X)N{U2cX2iC%X>6#lx*t#OMwa zOQ>W{mfzL(1q*|jcdy?F9o9qg$Rng_QBa1ty$q@k?FsJrX9O=GB+nJ}#uABM$U;W$ z89@lQ3EPI&=H?$u54pxX6UuJ28s1@Hn z#DF9jq~oL`v!>CZco~UURW5*>`gyk1z^LIrI>q(qoV}H<8_$17Cx8;`2srAYd(3!y7-7O19hbH3E~PpY&uE8%ad-`v6PyX}2&&!ATl7>^`wx(Em;cxzD(mh~f|$|EV+9Y4meLE*5b6sW6NS2#AO+j zAd%LFJ-~t(rAvb|HNyg4eD^n$4Vs-4GstW2fblXVgX}aTzY~iSM!;ZfNVY<>mY{g}FoFf* zG}pWstUx)PvQrw>qfMqsks2?VSFioeGv?JvBr=bI%vov5*Uo;MYdM^mkb%vAhJJXY z_;b*1<1tTgdVQ}wBRg}48k@doY5fBvQH3_MUSXnBgM&=A_Tzeig%1fSZ1(u8X3@Z| zkje}!Ngay>P^&NtNAv=SN?<$vN;;B%5i_&wqObP&ojOk$<8y}02^Pp#&v6z~oClQ@ zoqE-ov#onKSOU!l3~JkFy3x3x;QF~?hGu@9(K6=s5%c7BHMo}8T+y4nOGRApY~4%@ z07}X6zjCv((y=j%MOSNg-TFyNAK!8R+3<1ucYjw{sHe^bc?%)C~t%lqH^<>!@ghzg%hYg{LhB{7k5Tn1UT3S^Q#XC_Qz-rauQ6P-@duJoze zSVzkOjUv@bvwMG+mUVk)TTkV7-8=U@^HKBgd)gzS?Nxzo`GurN zso_0S9*-2gv)WJZ_?e*ya=mf%=J{|F!d(E)-DEG}n7tb~QNa}yOB+39ClYv7F;>-O zxcd1ruB^#nbmE^wY7tL(kU-cchEg^~($`5vB()23Z4!-ZPqK|v4T160r_Nuz@4g71!kBpo}zvdqaNyjk@R zNbnf@6H~Du#*+T=A`Egcq9~5ytu%1GaNXi2vR`7KzACr(=}bm=5E3E`I!L)osWdjb z32)|fG{%T*E6^O{$mdlUl#i8FZ6G%xSamXjbyd90urj)p0=HO`POYfF);lBWL)@IZ z-ay86ry8QQHj<2YDfXkx!{=VUon`9E}VPsvFFRvryBP z?_Vl;D%snv&Pv&1SOtz@zLofQklP{V46e&hwirZmD@iLn^(X4!-#^L$>@R*ov`i2_ zv|F(@2r>?AM8Ot_2Mu93mT$2aJp=tz(mailMT`oOq-6CS#?@KwGtITlu9u%(5<$s9 zGTeG=62YjGbHSZeabJPu1%sx;tyxGSF5AQ3j7gxpJaqwHkI3J#JS6!IEX5eORjyiC zrXDJig9J%a0YipVCobDF@!u2Oq=z9aLiQ+M#Wfmqpmd4~aS;pMNBj&-8n6~wr3Z4kq5oiFYKHmR44 z0#;_CY@KTX_mmR%DblI^=WEnNJWBXQRA!M*GhB;&4~=;PC`l-OT{8;m4A$iYUe(;^ zN?a{WHaO>D+#OmBj{wL%TJVpIl8vV)SM967Qx{-)dtzj_?4F}Nsy|bmmK*TFi~`l{G+F4wmpA#H5=+K`&R!& zSUsdMf0{3E;NHnKmMr75Bp1#xXjAnh)PyQh!S2x4cz&b$Fv8@GlJHLbTuZ~-*u5Jg z+2{hv{&D|l8d6Us3pxQZgxNFrKz}6WR6`*eGb&;@K4L=}KTj<2b0V8p;|{h8Xh za98|DZZ=R6`84q6P>?cx2QaxX4C>Aoo|i`@jn#^X`MbNf2#JgI;xhQTxacNC*PW#! z9u2YHq}VLGtEiK^>+O^_(Z8RQM*tX%)!a@m@6NV1;P9)`z7i4I$t)SkNTt8q6|4%& zz5g@f(*cx)3k%{p#!e0L@FE@s9h7`}eV$g}U)X%bxlqEP?Jg6jrY>7Qr@y!6Pd8)^ zwY5~R+*R&Wxgxdq`XXKwYN2O8CiUw^yhKyW9S{j~Odc@~wllI-;UPksN$yguV<{95 zW^3tEm8M*TiF?#on2Hmj37(}A*MGnx;c|ub;2_4(U;j~1MRv0?;Kf+n?o9@CI^e%4 z?zWfzQM2y}m4-wi_3fbf$D(kKhv_%Ek(es{4~+e?MHm6}DxylZpG`}M@;323*8@*y z51)T4%QNX*BySz9(oFdV`BVtZ8=S*jt*lC+1<>%$tDZ}VSw}$x`R0L}6KxuAWo_9( zBUDH7{ikK)36qH!@kTJB{sqsxXqdl_D>+T`w1q$ESM#~H_qa5Cm|JvpK8#Un#x09 z@-m~no^Io(&ycSr>*qepEkn2Wv)6OVg`m<+AFr}JC(OdK&mEt#u28&QrQS1I?OfgQ zGByE2)^2sd4AG>GM5FN+lboH4w0q2-eLv3|@saE8Y*L!EMX`cfgN+?(`sPG6aD${2 zG&;4S^W5-JhSl>$=h&lP1){ViL*FNY zuBvht3fRI;K;N$??NnqdXKWiPqg@1+C#O@<^V`ilf9zY%iD2vHZpgs^>!TmSqoh6J zp}>tgA?S?|r72_~1M}HXkP1)gy3@>Z$Iv5pqAwsx#ctGED>ckD{(~755xP;>my@%% zo(~3D(bLf#z4CJcfy8@FjS_||*56u*-2JNKBJUldmzaKVdHICl*RdEW6#F8mXoP$Y z)L%^x($vC$zWNHaxYq39rAEaT<)Ca&Ixp>&UgfB2C`sI13HEVwPymJ1`r2g0+$E(!JazhH{UKqS7!uZkc*e`HIzhR%YNXjSbB_wP>K}BR- zv4E3 zcLaebdNn&Ihwj<4fIm|qF#J+PQxce2UNx$rhq0)?plYSHkVn$|aZ$A3MW(Sk0+%m| zfsmJNly9IPcrD0L8}8kKg0QXRE%w^yUdggT1O3zP&w>&QFh6^Gf-hyX(hJMw*JEPX zNjRgU75FC#?A{0g3{$OQgK;jQ$H$3uKi&R%_$+YY%E#)+1;t*~TrRO&#&v`@3})rO{$@PCL-^t(UkSE^>Q@AA)^jIXpaA3Tu$ znBYhn7MI2)nf7&YcUz`f1CM02=KU@E(Y`11dy06992r|3OM5U z>lS_`{QH~mZ&U5x4{bB)6B)<2`#&iOfjbdh%av*VOMa&dRsefxR+gClRYv>}L*kheEe>^u&dU`r|8 zrQ4WAfS&?l-rlRk(gEQk{)6+att}vyicxQtxdLr5|9dEbWqfcXlo?t& zp_?XvKDDO|veMe}f5RhGao%hmm2be=M)3wXo?1MQkGTIB`!{6A?YF&-PzBdQ7+_H3 zi()-k>JyN?CWQny4V5HyOcCzNn4M$Y3ea0ZrDvD3@7)UWcGfhy4 zt!K=mL`PY29U`ZfZ9H(d)6unmr~Fe!x;Tm4 zkw!>CX<50^F+;VfS^RU=o})CD*1|Zxi+LPGOZH_6kMLbAQEfHEnD`l4zvrt+$A7#e z+m`a-kh}ePCWh$uk6ySG&Uzh6b$F9u?^fcJi92#BPH*VEfNIitA!vhe451_V#+8f-9WLy1hL zO8ze6H&(IEWFeEPo3@JI@?W(I$)Pfvcc-MJRGHaa1=?Gh4sWk4<{Rd0WZy*lDd=$| zDh%N6P;Q)^J(S`&SQK2o8YpJ3e0jwFQl119yRV1w^6^=`>~rJcEopAgFg7&28cqjZ zOHPd%5ikJ8VcLQvA8DnlnsY6_!sdtq8gYjau}s37S3ZB8quZNm;(}wwLVySo0L8jm zt4musY&fmJli6>5yu`GMSH;hk+GlkH8lrN2D1yUW^C+q=Mn>rq$5@H|XzjQ1KLHHp z+n_`Y53TFq(<&j})o$vX+g9V6RFs8Y0XHGpXQma2?}1*&n{OwFRaPu?=2njW$QJ{jX?goyVZO za!K&6XMMr*LJ0?l=MLfMK^kDU{7ZgO!~&x|_(y!Of9}JnxirpTI&10Vg0kS7E&TU38_!>rDF$GL)woCZQ${rpvCq?%8Di?eTPkrfI zh!@i!(d1xtWj#okLIwG>rwH|X!A>0)f0;(EwkrRdOx0Tf%qT@n;_>_(4JAS}0ubH4 zTHj#rkCy(uXet6Zhy$QIydOW`Kog~0obciWDXbW1H%Z_R+H00)Z+y%;h&^Q*0|LF6 z))11AuQ&PStm4;-{33y;($uUN1)GKB`|1xk2I{MxoAd^^2@vX52Z3j5tY*b=UsQuD z({;vXGchcfMmy7Be(MGh|1S07y8-*r@nO^W|3U>glM@dmycGTS`eRTt+h z=?9V~=zFg%PGozNM8yFQvT|;D0B{a#g_LEw|5sEhD(av)pK`js z-oyR(-K~?iw@psI5`byZ9h5_U!iAq79N_{ATakMdVkP{eC8X={CK-(-Tg&|{Mg6EUyP6r-)<2~({p z11`^l)N;j%kx9sL9vU^+r$hLQGo%0Lz$kJZa)Xuss^g2;4522kKEeQ5d!`AVmwFoF zssH*dhMDjU^EKnOkx>4yPeZnfe6HW0DKDN{eAwE`h|mcBgRCy?RaUzvUq#t9^9}G@ zn*HCaJNXWfs8bj6P^pF{MhZ?hwh$aF2J9Lef>`@iynXER84{C2eKZqTHOz9@4+w}Q ze);}8pEthrH%<%V???PWe+^~(S~XuVVJbeq7{pz=8$E4pAB+7QR`r*%h^qaV)+Q*G zKVCqHW4k-bAKKS(>~9-;8el!|U#DM$ff4FSH_Q9t@ZvB^O7jKmg7s`F8ln+oRit$s z^Kk+cBufsGxEoL5p&5PvO^gpAhnv@5gyE@hdDyY!@Rqtpx~b-LLgGjAPP10&N*X+H zVi|65I6`sJOS_LG9jcm$R9{H)tD^~96-n}rkSN}C?6478mXGV)_`uQ|evHx^4D8FntaOzm!K6ELxP8ri+#8e8FVHkmr`@hL# zUCcBn>oGxTsDfjM@ro}>GhrVv(zcpz1Kw!5R9qwGId?H?c2H2821WBr36~x7cEe)& ze}4gE7-w_=vjqV?_!HX$cq$3c5Hi)bl*%=XMz`H#2BcTJ7_iHprC$f z5lbCz(qXhJEDT;RvB4Aoh26?58zp)*+GD<#$I+irMf^p~A@rDn^3PNz)_3NnV9;9g zF&-!}m^_wUpYzV8#dN!tV+YwOB8sC)|LXQFk2d6MJ)lDVf8++Q0gEY?VwqTb`nWH5 zupD;Kp8xGhqOkoaWp^!`*&h`$=vQ0U%Of=Cc00>4qIz{q6{+iLT>|?gF&?(>Vy5+qS_;{qI68%DkFXg(Q93+0#---VH zXDjBk%wrH&F%%_|C2hSlr`M!k12idAm8Xqatnx*9YqrKERR*a8zB14XFp2LChK?h` zxk0sa)=$_}0xvcsXyR<`HRs)tMN`(V=;p(|jMc@cm{A22eUXe_@s+n|cZ>{~*0vcn z)2VWg{!})KL9JfuvlnZ|GWM6nnOM@35}QO5fhA-~&Bblv*0tp+#xLb*_VBU5E*uXwJE_tEm!E5P$12y)R z4@K{-{n46GI8%vX0cmH4|E*wwA7*Ux5{VhC&*xhG%wCIEi^NO3z-cQN7ZSN&n8}SD zyW30weZ?1iI4)Q?a^Si+IIp5G6CIl3`zM-goqFu{wRiR_}?2rxnk$ge6OR^87k2y~_Cmd!3WROG?Mt()kc4>0V{|P3Cc> z6jwQ|gj4}!Q3h4&sM{0i*r?NIqzUe5rk~b)nX08NKR+n{D8pYpsM9GutMG0Df^(t( z<_$&y2(m(>zoS$^pdgT`XHS{VJDDOIauJgU&y zv9h8Z+j0@fSpi0*+gm^9hHTXfUKC^C5=UCSA<)sZIsd%7+Ii7Y%tcgi{?mLCe@e1h ztne2ntc63XtHUe0<3klLP8MJUCLkaf%$S)0CbERb@u0UYh9%^$&%Hzj_q>RPHki4+ zq;X~5LaPwcrj|}L*twX-`PUJmpwG5*tA2NzvlVsp_a_m6!|ZI}x>Vwh8vcx)p1AMi zaK@_eRC5?>$xESEla*cra4XX4GnGs9Wf2qh=~T!l5W;>{r!b2rB4UB2jyLD(E3rSN z4Dh!_5kcw)H`DdZ3g}0tAv10~t%1i!3l%{8dVeK{Oyy*R^^*OP#>HiMxLJO6%(fv~ z3kd#Z0TS>=Ow7Z$Bd1qv+%91RYO+6D)s@WJkJB2pAad4G{g zf8|K)K_YTcMCUIIh@P9CYoX_(twpjP`LiklJvI_oyAE4#ch|3CW_C(T0Ret0q^+%V zXCn9Cg0YZJC`?;tXF+6$N<&yjOKUFZa49$_%=-kuTONF?{D}2n87$jc@v^egPAG@H z|NQOT`jr6w`c|D-lwznNd$E?eQPsT4JTard;ny2F6nq*%n73&AAe@Q`VUhE&hc#)u zYrK(fo{9Z?+NJ_6b?Hk^nT!p4w)2;o)BNyjox|&zWo{B#tSAwqc^9+UpXD}BPA)FW z7(8C4x7yD}g?mI-F3?VXKIr8?^2zu1tIDA1G|pzi;--pya_>5JQ=?mN2_T$>^_?_W zmB;hh`Qrb~QEEQx5(YYmP88x{HzSUZPoJPaj8*MTY|O1iWIN#AHpZO_vgOa|AN$9u zGa_&cx#bww&Ryuj-)J%or&Pew#sKxhLinRQnxHp8VMF~{c(t3Q2z3?3nX^_uw{=*1 z{_pD%^Xbd`s#4!J=?QesErHx{_ShVh<3WQ!H5)r~j!8A!rlE{2mL%vWPpt&ia>6qXK)9)0Ub3J}QVMBVOC=G!7$)pe(1 z+X|443tHCpTQXFVcMot8Iu zvg`Ke0a43-tAj`m1f)O}H#mm@IeCB4<;(=kgJC1P*%3BXF}380RE6DD&SO=tcdK4= z&hQF3oQcb+3tiqF=e`PT#M(#w|4V280SNeT+`N3;x7IP4>hF*mczU&=j&8EA(;Wwr zr*w35fP3cG5e3WHm$*3;^nmtW3KthkKz{Fbz@A@?(Y1?RdeDaYQRsfuTOpT zm6B2F5;5jJTj^0W7jMe|C^PRrjFq!kl#2QeE><6tsOQ6{A(+&nDtG_YuF1?*s4S$; z*@1`dQAlTZ9k&<6?{-TEv}?Ft2@pG#_SDf~P|-T)*weqee>b~{mc0VJ8G9vet8O?> z7AQ++PWy##0Ei_>K`YgN9$5;L)|v&9zQ8j96wmp6>Haqs2vnarL{dj}UIjX3spQyy zJ-ImIf|eqDgJ@tvl8I5(Kwi z4E``w$P?(JoHzSu0O9!0=DU#BZ>8Q2F zajb+X%<0<|k|Rq^ zb|XxN54w(TFw<@#=PSm6QA^$qN{V)=fq);!68o*5%8Uh%Gkt7aY#0;%>#r_(ScAav z`G*;gmyI7iQN^0;@19UEI5i1#YG+VAT8+6)g=Gyl9LVqF7 z@&0vJKyPRbaq#M^BthI71&}F9L645#nOip`$XivB6aL#^mQFcyq8Y7vX@ZbrFrK)$M8=t(V zKQ9qlkK*!Z^}|HT*w*in6h|!AWK8XQdku4$8cJNr;&J@-YoC~1k8mgUj327L#!TPV z+xqWnNT{2F4`OND)1u8)$DJR3Uyb}gWfqoi?+dqxePoiMJXQ--RRk$4HLBEI^fC0# z?C}jy`9Z~v`9_}cH{{>i4>{_60T>-kO%6O-+jBE42BK_Uhtoe^xm}U?7ut^M{B&Q& z*hOs3v(Mc+BxaB#;avyla^Cb(WWE)dVuX+~1o6J13d?i)3GzU-x*i67Aa#PK&JeVv zC~D2m?qZjLM)}6@5fBtvqHZE!OFRx=6o@=|M?u)dMA?VG~o zzEZ{PN}niw8XqJHj{UrQV_oHe1^gNF?&{<*11>FwmRU;%3CH};3}dJIxXo2Nkc0YJ z!GXf^Muvt|W_03y!{dNsO&Jjf0O~0a#W25B&-pwc*O-L!gycz>%yae-V=nM0)>| zWaA>?+wZ-Vik1F(5vpl(mI}Y z9&Ir+`MEaf+?_vC3380<1Is~!$Z0AX*hn0fstX;7)~_wI8inxnR&avCt}lZ)}wE0w)VhZ zj{;6grd&!OF1Nx$3^9;@`c}GOYj`=DMvu$dK+8UNN^t*ZJ}9&c0!f-=YpQj1l(=S7 zWPUCw^|tT{30$#S(G=P(T~se^ro0}V=Zx&KopXEX4)2XtKvN4eln@vy-SnU_KHTEjnFlGM3wn+Atm zF^TiOmD8Rw4u-L|oe;cMPLSkYtTqUg%^;7&FE!(RwhE}BA7{%N zt_QQ_)$Df4M2wblPl{pAuV}U`#t~Z{Rz&&7t>t-Ctp!d)uK_MF{bQNM53`8kSEVEH z7*Spg3gUxNG5-smgaB7U_YT$C{y)}yFUELS38+z1jrMcDCM=v+pgg-0lwXAhH$U1A zdJpa<)l%5Sk497D6}Xlhm@0=T0rFT{C3{?h{R{~h@iwU+DZi<}T!z%L5H3I1a`C=h zd+ZbNcQ=G9;B?E!zxZ1-$C%x}`KKDI4W|Q!&zar|1gC^1$BezKv8*V2_Q*11;rrQ--WLJ&mGA#GrH;qczN05khmr&?VY3cX?beV&`>2XsWH2g z#r)|dzW3BkyOC^$fcN{+X*Rar?8I-hP@ErLRkts`+%(-iGh$CViM!sD-(e5IY0zfq z?WO)aKpSf}e9^rsrYF7VQGO~!+AI|F=J*t#zQl7f@tuYbM#blm1+Xi;E$lwuX! z61%zR#|4+psqg}YNix){;|$w|1|_4RD=r~|gP;D+iMFTyY8QS6x{60_dMfD#9Td>j z{r$nR?02|~fh%UnwgymL=i9fQ+X~R>%sl`l0A^Wx7+8S}{wYq^SSeALJD(8*vQH%c z3r3Nm7?R7?!Ju)GQtkz8C!4DWA#OQ6YFiJ7`vu>q^;bx85Pu$nmc6B0!3MQ#XMS_wg;Zo8VDhQ)XfB&=qU`L`l=%`^$>G9o8d`W?s zmR<87_jrID#84&uHYgL-E<~+h8B0Tum zNs|WsEz}ZKU0d7OIGSM0f)y^e{{Hv?$i)uSE^XHVvcqEq|_psVMgNxYhm)kCRwQXftxM5I0&n0?(V&^QjVTAW% z0bBd!eAS{IZ*45e*cSmD$^BMsC1k04ou+L{0MAe*33*|{)DHjjrM-NZb(O{+S!u7T z^r+}Jw1r8FvxZaVfq`6ubR=^XTRlAiP5S{Cb#=40Pt5q_tv0^jI&e7p(t%8WzLP5@ zw`cPjZwC93^jfk4WeLwEv++J9y+NRqG8`_Mn||;12T4Mci}#F{P>wNcUF#F^q1kZO zVKB!aCbHp6Bb#5O0!=EmoB_m;9GNH(HeBP)5Yzs|=F;PzJ~?^n>AR>VVFrdRH0^p@ z7U$0;rhU<68=+Bc3W(&}wrBR|Rk(Gv!WJ*}nTu|{tRU2+G*)r0j(W#eqg~o5>kU~e z26*xgAojq+piG?2tV_ynDw(Ft0`J*P>Y+HU-t#)f-fn|gWt37%S^MM-x%xplM`Z&% zn}9uvMBpN8o;hfOXrtr|B3QpW?j7(*$fb|iFQz@Sy-l{G@vjQP;&;NOc(HXXe{^J` zu=lYHmCJn7ac1>lJ&%Q+LE&%niJMLZmJ+X*k&Ho%zt;*;+mG_U^e2Yekev$n%*?+} z%v|xFyzdz0shKTg1Jw|$9Y4@r?RWJ)JWV&?noLerc<{vaXUSoQM4bWW@9}QTa-+t+_Kc)1JzbK{wQE4_TL-M1sP-x%;`{Ap+2iWvaZ;u{Y%}Ps; zp-$Vp{&4Z)=dWbF{aVX1S@q+#9%6l3RM8{nX!Lv$dFnKvG20uFqUT+*P`?+5UNH&r zycprhOa-ph$2T)G>3Y*!b(3_y$5GrdCecpXPJHr|VK_k; zQ$33G^lXCj4@weQD)a$PucLk)3bk%6SjVyaaAKBE4SB%Hxdi0fE9V~tjed~&=;@Oi zS;i4lUQQ=gIXP)3*UXz0J?ztg*SO_TiAN+@%ZH6T;HxLhxVFNP5l2hAu4RF zH?|7T?%Tk?0ANut=dsCT8G3hoQ*qwvgqIAJmwL<1R`3;+$jgFnER=PtMDkdsOG5?N z({|l?eB(Pf_YuodIr9@#b6uSp>>Ibu|FtD)+xK#@(&~9_z7Ng|O_3o@se$g#Jz^v< zMT$!ZBba3PjTyy{7aH9M#fTmJ?sLqw{5Q%kwD_>YN=DQjcOuil1G5(E0Hl1{pgz{6=6~&|Jk7kix|G&*<%UwaZPn|g{T~1yLEyfy#MhE7 zVW1?yo3SHpXk;Sbj0@3+6l0$&5LCuwmA*F;xZL2}4jtYYe#=|q&NV&nyN|=WuF)2z zj?5{yEfG;`l?Qsvl2T+2MQO+5QC(M;mzP919#0PT4~wG80_^LidG_L&AV`b|sFXpX zTz1f{(ZEJgj5+5^ay`Agbr@iQv^|`%-^-z zv8B?E`z9_f*WIdP?PV)OVls3vafI8;El%FbbNe#v^y(g3yBI5_IGv_ zs_CQzf@ROAXRn&3RZ1CSb74BaD)RU(rHyb5Ay}&s^_@Epl%mCAIiJsC2#Clj0-#nZ zcdcYIQNwF1X+R0lFP8J%yfVg+LRZ+ua$Z%HwRX8&Ip@Zc(R#H8fc0v*S}rm!zbwn# zQ&oh0*9s?VbV{igj=`rWPriA4@6Mf_oq`ky!Z1Jx-dJ50Gz?jk2U3u(8T!_{qGC=F zLmukn(Pl~}rMOx_)2z#~I5?<@;Mp_x{Q2`?7_6OYtwcB_cFxUa)2adh@E%5^T12X< zy1Kgh_SGf1{1I}ZfUIqrT%=u|JCtXHZ_wMGlH z0wIY82$IGbV1Xe>&Tu%i<(RE4clX!W{90R^U;ATi*Vfi(Ha5Gq91fQ=W&jNU2@D|` zXowbQQH4^is$SL8@1@R=SGhR*!y_UiGvnsVn-$qr)r2GQIx8~5uU`+pe*B#Co$nI@ zjDgL~ohw&X0|kX%?e(&$=G3r1U~~>NBWNq~6w?vtJYQXErpY!i=scHFG#hoRO%SNn z)m3Kav0ze)X$fE%;~@h&#wq%lkiaMQkeJ9=G}Z~n3<61j5I_Qm*rM}NrQ^(=7l>x- z-1q>@okT4NXf0G7gk)wS31h?) zaTWC#Mj)E+(Uz4%AQ8Kc+z-g{yFl8O6`cpJnNwXPchOkO`6Wm z|I`dSU?F{&*Bg%mVIq>@giG9uNRXG4!Wq7Pe-iY+3z~&{!o1(7E+_-fmqBM>fca-Q zuf;+{);iAw=dD1IjEo)=IW-#b>gvk+`f4qL(Zvg+Q4)qxyGgzVT5CY6U&1SCo{dJM zJkQwy3E`dTajDe=Qi#k%0w#g%nPByJY_jAF9t#&87XIJ~qKL3Jb<5*D(kHkVqgPf&?K)xiS89;4A>hphkiWh@e(8x^PrDYYWFk zrYSc>xV862Ee<=KHW8*-(rh-Kc;dPM*xc=BS?-Sudwcs^TRVhel<>p2DM>JB2GeTR zR#%te7}$w4&+D}?R8k441S~bL)WT*~=@T-@L9d)#cTRwoi+5CTA!;XWo6~krQpHCp)oNLWmzVr3`0Q(LcpaLmT z`v(JB2J$=iI7lYICrwGPW9JyG0|`I^kS2*taLmRzaDM-qIvg~{gCGGCIzS*`cU<&z z8X=zr0DG-EDFhMe!ZLHC(Wo~Y##(KxiUi<<<_`%R3rV(8S>RY!alVf+_XB>D8Pgn& z9UPqf^Xx7*skWcjQHcR#=MF-32eDruBFB@kEif{BJXTzwRXgs*t2f;El+vyI|V zXDJain)M48R##Wsp#lJiV;GHGueU!Kh|wrbMya(f*S5X9l4-4t)t)=A(B8iuV>LX3 ztB;bP7tZ4&h;09hZokFu_Ei_Jl<%74)VNX3!a6>o44={#GF@PEu zHaKkx14uxVuTum{0f4hk5J@T7*`g?%)67gFPytPL2ZsPcNo~#kU}UY$vNXvJh_F_x zZES1|2E!ytg^*Dg$Bi}s4bwbJEdu97nx?}r5S>m-D$4V0{lZ$S)!y6PH^zP7sq0Y) z7cRDhf_1a9yFc98+8PW7TIbGL?_Nu(4j-7u%gmUD zAV7pXgQ2$f9zNXO-bvHcIoD`3qbMp04P)K_81tI4Ge!#`y4}56tu`Evk|gm-b*+st z-v0UHBOjoA*)w4|tx#+c4hJBq@co$VwUwcG92U;B;_A`By~ZIMwzjqg zgJHATynOj`x7&OD^*cx|ipB*?Q4}pNFAE_?qfxzH_hdTFW;02Wt*tHRT&L5~xsGe$ z@=9xIxk(6t0$`KpDIo#MPG`Nhdq2xf7)oshk&3lW!!S@vcDws|F6#BVC*%TqW~6n21RL5CbuwC!8KvmUuQSf0mupL1fKV_P!0 z5~Bx|2&8dpRa}C&;6e!8tpLkj<1UP4KbPT0NcRwOWk`(=;iHTuC9M@Q5vTY^@7|;PT}wk3F`e zq_1-a2I!C6-Mjbp_xBM=O6BYrlzy!A$|13_g>x=Ya;e>1UTU|RjVL5!AOv>6)&@#Q z0%jOy_B(IhP70Ifg-4zFRtrUtjNZ z;v}(QD43z!9e4oL=H^zb*&Yst-o5kXo*s|TZnq~ImU1dE0?yhZU0Ydhx7(g8KnTIW zTI(c9j4?%CXsxXs)AS$(S?+4}mM_zkQW&G1vvDmdirklPhGEd@v>VMvnkLhi*(r$Q*e2k4D1pF&ClEjh8~}?j z4ARm5QUkUheE;cd&8Esm`ww)cUw!4a)iMZz2M-_Y@9!@yEqM+BUz0lB%O+nO8><-{ zAqG-LVJJufpmnURGmg_j*IVs}n_D2{E3d!)^>4ixx0Y)4=Dl0DmYR)!@(=%EB#EpM zz{HjiND@gxDL{;w>(N?YYvQZ9coOP!j)QR}v?ih;2z@GjsomDriXbSQvjmSl{ede_ zJ(XzQ8yFF^gJ=mcwhpXy1WpL#!$7C$^X1pTp~++hCTAdy>&`i?3q&whGrL+X*1Awi zGP^?Oh+eVSq-iRGAkPZ`h{8AsLU#V}#|Y%pbH3PfidPm0d7g)1pp7Re2(v5+0+nT% zkksq#H=7Ma9F2zUcFS0uWl5u1H`)}1uGj1Jdc!|ZNs{;si1)GT_1e{IS1(^)eef{3 zbN7K~@AKeuDdjv6;$h$UwCyCWjJX?J83?Ov|E)+ae_$?-5Ry1I|FYJxPs;ieo3Fyk z^V}nEXQ9O&Z~{bQ^c@0`*J-f6SjD5b1xe364uC?)d62D>X3L+&CRWx>nmvq8KltV3 z{&^O$HK%Orpp`Ktos{v%itjJ!<B5DzEK3K2p>sTOPmfmX0-!NP z5Go=v+H|`;cCH@RRc-P<0jS2f^R2C&dk?oaHoG#aM^Q8}r4Et8P#qNGk7p6590(=T z?CV&qv22~eu}nA+I6)9cfhU6SqR{PD>?{znk{~4zHkATIXf+${Rx}#H=H}+s*4Ah= zYPDJyFJ26SAWhTJXyoI})3Hf`tE(#)FJ4$(Z2*AQn4u@%~ z`-5Bsp{LunmW|QcYjL{V?lE?>E@y4pm9G*#_(JqW_Rz3#(@5BK)=v^GixVHkyB zV2sW31Tyq8K}rcJLn&pZi(2dlql?@Kp@LfE3s~o@A4KEV4-B8DHSTto0;4yu*nZ);;R|576%^!w5-~eDO z=p6+Sf`UT zq#3iT*J~_gnkCt2gb0Jt014ta5`uJ=I%nfhlA>BvXNDrz>8R&-RVgF_`c)=`ltTHi zkh4}0#-R!VRb&YX3M8dgclWwaKm9ZbSZddnmpgGB<#}GK$7z=4d0ubUeafKGXtdic zB>(`@-1@vpuh&DwPN!3^$JRg)1d;?>$JQZ$Bq5O4+PRnsMyRB1bQ)HQBgGO>h1s@x z^U4-e-{Tu@gUUWK3s6vmnoo-Sd5Om~@re#N!HhG1e$$brP zQRpnoJqyxsI2sOz)2bL_j7Q!M2csvRcxrVuTwYp#{PFc9VNXTW@Ao^MPOVn+d_&H; zG)m)49>X_pdQyE=j{Ie z9-@tFfgk{YT21(3z6%#RjYga#mnO_F2!P#gZ!}B_kFi3fjm--t5=mD0#Hy!r@;T13 zIy^=iQ$?~HLsrnkaL^bN2Fkfq1;HrU$K{$7fkD%3Ha9lX*R;y(!3&JALd)@sPKJe6FZ)cffx%|NI2?3`km23$pB#L!~;O1)?mkoWUOU`D6G|LbwX)OCS^pV0Epcf&NgNI z!3pGW$`aty#z%sU{$J|~Yn*j?y8QgB$obg>6~+H3|XnhaaVAoB$0whI6%``T7LTJ#~B{avb52N zo#P}Owpz_F0Dw9Gv^drpf&c(OPgv}|>lKFr09;rLR--r`XF|=Gc?zd&Q~qX4RbS52 z)=e%^?HX0(&n95#q<#_>!+&D+*$5zA^n{BKz0ONH(PXdc#i|m6XdHh zCc?-EjC9_#OcLPKAMD?|cYkYZ+XtY6AS4tX!ad`j9*kK^WsK9>0z(wWM6|uVySKNe zi`*GQ$c=h!d8t#2Vj;uz^-H_Myf;jS!=c}!qbTy;)lAs%&^?yc+s%CaGhQqsp_0N{ z%MOgTMXrmYU^l+;EX~KnPh$v@e);8>S5{WN+M>6WxqZ!rE9$6@`QVjxTn*S(2o_qNd*;^m@H4HxY(D{^_0m37pu> z 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 mosn.proto.runtime.v1.InitRequest.MetadataEntry - 53, // 1: mosn.proto.runtime.v1.PutBucketTaggingInput.tags:type_name -> mosn.proto.runtime.v1.PutBucketTaggingInput.TagsEntry - 54, // 2: mosn.proto.runtime.v1.GetObjectTaggingOutput.tags:type_name -> mosn.proto.runtime.v1.GetObjectTaggingOutput.TagsEntry - 16, // 3: mosn.proto.runtime.v1.Delete.objects:type_name -> mosn.proto.runtime.v1.ObjectIdentifier - 15, // 4: mosn.proto.runtime.v1.DeleteObjectsInput.Delete:type_name -> mosn.proto.runtime.v1.Delete - 22, // 5: mosn.proto.runtime.v1.ListObjectsOutput.contents:type_name -> mosn.proto.runtime.v1.Object - 56, // 6: mosn.proto.runtime.v1.Object.last_modified:type_name -> google.protobuf.Timestamp - 21, // 7: mosn.proto.runtime.v1.Object.owner:type_name -> mosn.proto.runtime.v1.Owner - 23, // 8: mosn.proto.runtime.v1.Grant.grantee:type_name -> mosn.proto.runtime.v1.Grantee - 24, // 9: mosn.proto.runtime.v1.GetObjectAclOutput.grants:type_name -> mosn.proto.runtime.v1.Grant - 21, // 10: mosn.proto.runtime.v1.GetObjectAclOutput.owner:type_name -> mosn.proto.runtime.v1.Owner - 56, // 11: mosn.proto.runtime.v1.CreateMultipartUploadInput.expires:type_name -> google.protobuf.Timestamp - 55, // 12: mosn.proto.runtime.v1.CreateMultipartUploadInput.meta_data:type_name -> mosn.proto.runtime.v1.CreateMultipartUploadInput.MetaDataEntry - 56, // 13: mosn.proto.runtime.v1.CreateMultipartUploadInput.object_lock_retain_until_date:type_name -> google.protobuf.Timestamp - 56, // 14: mosn.proto.runtime.v1.CreateMultipartUploadOutput.abort_date:type_name -> google.protobuf.Timestamp - 56, // 15: mosn.proto.runtime.v1.CopyPartResult.last_modified:type_name -> google.protobuf.Timestamp - 36, // 16: mosn.proto.runtime.v1.UploadPartCopyOutput.copy_part_result:type_name -> mosn.proto.runtime.v1.CopyPartResult - 38, // 17: mosn.proto.runtime.v1.CompletedMultipartUpload.parts:type_name -> mosn.proto.runtime.v1.CompletedPart - 39, // 18: mosn.proto.runtime.v1.CompleteMultipartUploadInput.multipart_upload:type_name -> mosn.proto.runtime.v1.CompletedMultipartUpload - 56, // 19: mosn.proto.runtime.v1.MultipartUpload.Initiated:type_name -> google.protobuf.Timestamp - 45, // 20: mosn.proto.runtime.v1.MultipartUpload.initiator:type_name -> mosn.proto.runtime.v1.Initiator - 21, // 21: mosn.proto.runtime.v1.MultipartUpload.owner:type_name -> mosn.proto.runtime.v1.Owner - 46, // 22: mosn.proto.runtime.v1.ListMultipartUploadsOutput.uploads:type_name -> mosn.proto.runtime.v1.MultipartUpload - 56, // 23: mosn.proto.runtime.v1.DeleteMarkerEntry.last_modified:type_name -> google.protobuf.Timestamp - 21, // 24: mosn.proto.runtime.v1.DeleteMarkerEntry.owner:type_name -> mosn.proto.runtime.v1.Owner - 56, // 25: mosn.proto.runtime.v1.ObjectVersion.last_modified:type_name -> google.protobuf.Timestamp - 21, // 26: mosn.proto.runtime.v1.ObjectVersion.owner:type_name -> mosn.proto.runtime.v1.Owner - 49, // 27: mosn.proto.runtime.v1.ListObjectVersionsOutput.delete_markers:type_name -> mosn.proto.runtime.v1.DeleteMarkerEntry - 50, // 28: mosn.proto.runtime.v1.ListObjectVersionsOutput.versions:type_name -> mosn.proto.runtime.v1.ObjectVersion - 0, // 29: mosn.proto.runtime.v1.S3.InitClient:input_type -> mosn.proto.runtime.v1.InitRequest - 3, // 30: mosn.proto.runtime.v1.S3.PutObject:input_type -> mosn.proto.runtime.v1.PutObjectInput - 1, // 31: mosn.proto.runtime.v1.S3.GetObject:input_type -> mosn.proto.runtime.v1.GetObjectInput - 5, // 32: mosn.proto.runtime.v1.S3.DeleteObject:input_type -> mosn.proto.runtime.v1.DeleteObjectInput - 7, // 33: mosn.proto.runtime.v1.S3.PutObjectTagging:input_type -> mosn.proto.runtime.v1.PutBucketTaggingInput - 9, // 34: mosn.proto.runtime.v1.S3.DeleteObjectTagging:input_type -> mosn.proto.runtime.v1.DeleteObjectTaggingInput - 11, // 35: mosn.proto.runtime.v1.S3.GetObjectTagging:input_type -> mosn.proto.runtime.v1.GetObjectTaggingInput - 13, // 36: mosn.proto.runtime.v1.S3.CopyObject:input_type -> mosn.proto.runtime.v1.CopyObjectInput - 17, // 37: mosn.proto.runtime.v1.S3.DeleteObjects:input_type -> mosn.proto.runtime.v1.DeleteObjectsInput - 19, // 38: mosn.proto.runtime.v1.S3.ListObjects:input_type -> mosn.proto.runtime.v1.ListObjectsInput - 25, // 39: mosn.proto.runtime.v1.S3.GetObjectAcl:input_type -> mosn.proto.runtime.v1.GetObjectAclInput - 27, // 40: mosn.proto.runtime.v1.S3.PutObjectAcl:input_type -> mosn.proto.runtime.v1.PutObjectAclInput - 29, // 41: mosn.proto.runtime.v1.S3.RestoreObject:input_type -> mosn.proto.runtime.v1.RestoreObjectInput - 31, // 42: mosn.proto.runtime.v1.S3.CreateMultipartUpload:input_type -> mosn.proto.runtime.v1.CreateMultipartUploadInput - 33, // 43: mosn.proto.runtime.v1.S3.UploadPart:input_type -> mosn.proto.runtime.v1.UploadPartInput - 35, // 44: mosn.proto.runtime.v1.S3.UploadPartCopy:input_type -> mosn.proto.runtime.v1.UploadPartCopyInput - 40, // 45: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:input_type -> mosn.proto.runtime.v1.CompleteMultipartUploadInput - 42, // 46: mosn.proto.runtime.v1.S3.AbortMultipartUpload:input_type -> mosn.proto.runtime.v1.AbortMultipartUploadInput - 44, // 47: mosn.proto.runtime.v1.S3.ListMultipartUploads:input_type -> mosn.proto.runtime.v1.ListMultipartUploadsInput - 48, // 48: mosn.proto.runtime.v1.S3.ListObjectVersions:input_type -> mosn.proto.runtime.v1.ListObjectVersionsInput - 57, // 49: mosn.proto.runtime.v1.S3.InitClient:output_type -> google.protobuf.Empty - 4, // 50: mosn.proto.runtime.v1.S3.PutObject:output_type -> mosn.proto.runtime.v1.PutObjectOutput - 2, // 51: mosn.proto.runtime.v1.S3.GetObject:output_type -> mosn.proto.runtime.v1.GetObjectOutput - 6, // 52: mosn.proto.runtime.v1.S3.DeleteObject:output_type -> mosn.proto.runtime.v1.DeleteObjectOutput - 8, // 53: mosn.proto.runtime.v1.S3.PutObjectTagging:output_type -> mosn.proto.runtime.v1.PutBucketTaggingOutput - 10, // 54: mosn.proto.runtime.v1.S3.DeleteObjectTagging:output_type -> mosn.proto.runtime.v1.DeleteObjectTaggingOutput - 12, // 55: mosn.proto.runtime.v1.S3.GetObjectTagging:output_type -> mosn.proto.runtime.v1.GetObjectTaggingOutput - 14, // 56: mosn.proto.runtime.v1.S3.CopyObject:output_type -> mosn.proto.runtime.v1.CopyObjectOutput - 18, // 57: mosn.proto.runtime.v1.S3.DeleteObjects:output_type -> mosn.proto.runtime.v1.DeleteObjectsOutput - 20, // 58: mosn.proto.runtime.v1.S3.ListObjects:output_type -> mosn.proto.runtime.v1.ListObjectsOutput - 26, // 59: mosn.proto.runtime.v1.S3.GetObjectAcl:output_type -> mosn.proto.runtime.v1.GetObjectAclOutput - 28, // 60: mosn.proto.runtime.v1.S3.PutObjectAcl:output_type -> mosn.proto.runtime.v1.PutObjectAclOutput - 30, // 61: mosn.proto.runtime.v1.S3.RestoreObject:output_type -> mosn.proto.runtime.v1.RestoreObjectOutput - 32, // 62: mosn.proto.runtime.v1.S3.CreateMultipartUpload:output_type -> mosn.proto.runtime.v1.CreateMultipartUploadOutput - 34, // 63: mosn.proto.runtime.v1.S3.UploadPart:output_type -> mosn.proto.runtime.v1.UploadPartOutput - 37, // 64: mosn.proto.runtime.v1.S3.UploadPartCopy:output_type -> mosn.proto.runtime.v1.UploadPartCopyOutput - 41, // 65: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:output_type -> mosn.proto.runtime.v1.CompleteMultipartUploadOutput - 43, // 66: mosn.proto.runtime.v1.S3.AbortMultipartUpload:output_type -> mosn.proto.runtime.v1.AbortMultipartUploadOutput - 47, // 67: mosn.proto.runtime.v1.S3.ListMultipartUploads:output_type -> mosn.proto.runtime.v1.ListMultipartUploadsOutput - 51, // 68: mosn.proto.runtime.v1.S3.ListObjectVersions:output_type -> mosn.proto.runtime.v1.ListObjectVersionsOutput - 49, // [49:69] is the sub-list for method output_type - 29, // [29:49] is the sub-list for method input_type - 29, // [29:29] is the sub-list for extension type_name - 29, // [29:29] is the sub-list for extension extendee - 0, // [0:29] is the sub-list for field type_name + 55, // 0: mosn.proto.runtime.v1.InitRequest.metadata:type_name -> mosn.proto.runtime.v1.InitRequest.MetadataEntry + 56, // 1: mosn.proto.runtime.v1.PutBucketTaggingInput.tags:type_name -> mosn.proto.runtime.v1.PutBucketTaggingInput.TagsEntry + 57, // 2: mosn.proto.runtime.v1.GetObjectTaggingOutput.tags:type_name -> mosn.proto.runtime.v1.GetObjectTaggingOutput.TagsEntry + 13, // 3: mosn.proto.runtime.v1.CopyObjectInput.copy_source:type_name -> mosn.proto.runtime.v1.CopySource + 15, // 4: mosn.proto.runtime.v1.CopyObjectOutput.CopyObjectResult:type_name -> mosn.proto.runtime.v1.CopyObjectResult + 18, // 5: mosn.proto.runtime.v1.Delete.objects:type_name -> mosn.proto.runtime.v1.ObjectIdentifier + 17, // 6: mosn.proto.runtime.v1.DeleteObjectsInput.Delete:type_name -> mosn.proto.runtime.v1.Delete + 20, // 7: mosn.proto.runtime.v1.DeleteObjectsOutput.deleted:type_name -> mosn.proto.runtime.v1.DeletedObject + 25, // 8: mosn.proto.runtime.v1.ListObjectsOutput.contents:type_name -> mosn.proto.runtime.v1.Object + 24, // 9: mosn.proto.runtime.v1.Object.owner:type_name -> mosn.proto.runtime.v1.Owner + 26, // 10: mosn.proto.runtime.v1.Grant.grantee:type_name -> mosn.proto.runtime.v1.Grantee + 27, // 11: mosn.proto.runtime.v1.GetObjectAclOutput.grants:type_name -> mosn.proto.runtime.v1.Grant + 24, // 12: mosn.proto.runtime.v1.GetObjectAclOutput.owner:type_name -> mosn.proto.runtime.v1.Owner + 58, // 13: mosn.proto.runtime.v1.CreateMultipartUploadInput.meta_data:type_name -> mosn.proto.runtime.v1.CreateMultipartUploadInput.MetaDataEntry + 13, // 14: mosn.proto.runtime.v1.UploadPartCopyInput.copy_source:type_name -> mosn.proto.runtime.v1.CopySource + 39, // 15: mosn.proto.runtime.v1.UploadPartCopyOutput.copy_part_result:type_name -> mosn.proto.runtime.v1.CopyPartResult + 41, // 16: mosn.proto.runtime.v1.CompletedMultipartUpload.parts:type_name -> mosn.proto.runtime.v1.CompletedPart + 42, // 17: mosn.proto.runtime.v1.CompleteMultipartUploadInput.multipart_upload:type_name -> mosn.proto.runtime.v1.CompletedMultipartUpload + 48, // 18: mosn.proto.runtime.v1.MultipartUpload.initiator:type_name -> mosn.proto.runtime.v1.Initiator + 24, // 19: mosn.proto.runtime.v1.MultipartUpload.owner:type_name -> mosn.proto.runtime.v1.Owner + 49, // 20: mosn.proto.runtime.v1.ListMultipartUploadsOutput.uploads:type_name -> mosn.proto.runtime.v1.MultipartUpload + 24, // 21: mosn.proto.runtime.v1.DeleteMarkerEntry.owner:type_name -> mosn.proto.runtime.v1.Owner + 24, // 22: mosn.proto.runtime.v1.ObjectVersion.owner:type_name -> mosn.proto.runtime.v1.Owner + 52, // 23: mosn.proto.runtime.v1.ListObjectVersionsOutput.delete_markers:type_name -> mosn.proto.runtime.v1.DeleteMarkerEntry + 53, // 24: mosn.proto.runtime.v1.ListObjectVersionsOutput.versions:type_name -> mosn.proto.runtime.v1.ObjectVersion + 0, // 25: mosn.proto.runtime.v1.S3.InitClient:input_type -> mosn.proto.runtime.v1.InitRequest + 3, // 26: mosn.proto.runtime.v1.S3.PutObject:input_type -> mosn.proto.runtime.v1.PutObjectInput + 1, // 27: mosn.proto.runtime.v1.S3.GetObject:input_type -> mosn.proto.runtime.v1.GetObjectInput + 5, // 28: mosn.proto.runtime.v1.S3.DeleteObject:input_type -> mosn.proto.runtime.v1.DeleteObjectInput + 7, // 29: mosn.proto.runtime.v1.S3.PutObjectTagging:input_type -> mosn.proto.runtime.v1.PutBucketTaggingInput + 9, // 30: mosn.proto.runtime.v1.S3.DeleteObjectTagging:input_type -> mosn.proto.runtime.v1.DeleteObjectTaggingInput + 11, // 31: mosn.proto.runtime.v1.S3.GetObjectTagging:input_type -> mosn.proto.runtime.v1.GetObjectTaggingInput + 14, // 32: mosn.proto.runtime.v1.S3.CopyObject:input_type -> mosn.proto.runtime.v1.CopyObjectInput + 19, // 33: mosn.proto.runtime.v1.S3.DeleteObjects:input_type -> mosn.proto.runtime.v1.DeleteObjectsInput + 22, // 34: mosn.proto.runtime.v1.S3.ListObjects:input_type -> mosn.proto.runtime.v1.ListObjectsInput + 28, // 35: mosn.proto.runtime.v1.S3.GetObjectAcl:input_type -> mosn.proto.runtime.v1.GetObjectAclInput + 30, // 36: mosn.proto.runtime.v1.S3.PutObjectAcl:input_type -> mosn.proto.runtime.v1.PutObjectAclInput + 32, // 37: mosn.proto.runtime.v1.S3.RestoreObject:input_type -> mosn.proto.runtime.v1.RestoreObjectInput + 34, // 38: mosn.proto.runtime.v1.S3.CreateMultipartUpload:input_type -> mosn.proto.runtime.v1.CreateMultipartUploadInput + 36, // 39: mosn.proto.runtime.v1.S3.UploadPart:input_type -> mosn.proto.runtime.v1.UploadPartInput + 38, // 40: mosn.proto.runtime.v1.S3.UploadPartCopy:input_type -> mosn.proto.runtime.v1.UploadPartCopyInput + 43, // 41: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:input_type -> mosn.proto.runtime.v1.CompleteMultipartUploadInput + 45, // 42: mosn.proto.runtime.v1.S3.AbortMultipartUpload:input_type -> mosn.proto.runtime.v1.AbortMultipartUploadInput + 47, // 43: mosn.proto.runtime.v1.S3.ListMultipartUploads:input_type -> mosn.proto.runtime.v1.ListMultipartUploadsInput + 51, // 44: mosn.proto.runtime.v1.S3.ListObjectVersions:input_type -> mosn.proto.runtime.v1.ListObjectVersionsInput + 59, // 45: mosn.proto.runtime.v1.S3.InitClient:output_type -> google.protobuf.Empty + 4, // 46: mosn.proto.runtime.v1.S3.PutObject:output_type -> mosn.proto.runtime.v1.PutObjectOutput + 2, // 47: mosn.proto.runtime.v1.S3.GetObject:output_type -> mosn.proto.runtime.v1.GetObjectOutput + 6, // 48: mosn.proto.runtime.v1.S3.DeleteObject:output_type -> mosn.proto.runtime.v1.DeleteObjectOutput + 8, // 49: mosn.proto.runtime.v1.S3.PutObjectTagging:output_type -> mosn.proto.runtime.v1.PutBucketTaggingOutput + 10, // 50: mosn.proto.runtime.v1.S3.DeleteObjectTagging:output_type -> mosn.proto.runtime.v1.DeleteObjectTaggingOutput + 12, // 51: mosn.proto.runtime.v1.S3.GetObjectTagging:output_type -> mosn.proto.runtime.v1.GetObjectTaggingOutput + 16, // 52: mosn.proto.runtime.v1.S3.CopyObject:output_type -> mosn.proto.runtime.v1.CopyObjectOutput + 21, // 53: mosn.proto.runtime.v1.S3.DeleteObjects:output_type -> mosn.proto.runtime.v1.DeleteObjectsOutput + 23, // 54: mosn.proto.runtime.v1.S3.ListObjects:output_type -> mosn.proto.runtime.v1.ListObjectsOutput + 29, // 55: mosn.proto.runtime.v1.S3.GetObjectAcl:output_type -> mosn.proto.runtime.v1.GetObjectAclOutput + 31, // 56: mosn.proto.runtime.v1.S3.PutObjectAcl:output_type -> mosn.proto.runtime.v1.PutObjectAclOutput + 33, // 57: mosn.proto.runtime.v1.S3.RestoreObject:output_type -> mosn.proto.runtime.v1.RestoreObjectOutput + 35, // 58: mosn.proto.runtime.v1.S3.CreateMultipartUpload:output_type -> mosn.proto.runtime.v1.CreateMultipartUploadOutput + 37, // 59: mosn.proto.runtime.v1.S3.UploadPart:output_type -> mosn.proto.runtime.v1.UploadPartOutput + 40, // 60: mosn.proto.runtime.v1.S3.UploadPartCopy:output_type -> mosn.proto.runtime.v1.UploadPartCopyOutput + 44, // 61: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:output_type -> mosn.proto.runtime.v1.CompleteMultipartUploadOutput + 46, // 62: mosn.proto.runtime.v1.S3.AbortMultipartUpload:output_type -> mosn.proto.runtime.v1.AbortMultipartUploadOutput + 50, // 63: mosn.proto.runtime.v1.S3.ListMultipartUploads:output_type -> mosn.proto.runtime.v1.ListMultipartUploadsOutput + 54, // 64: mosn.proto.runtime.v1.S3.ListObjectVersions:output_type -> mosn.proto.runtime.v1.ListObjectVersionsOutput + 45, // [45:65] is the sub-list for method output_type + 25, // [25:45] is the sub-list for method input_type + 25, // [25:25] is the sub-list for extension type_name + 25, // [25:25] is the sub-list for extension extendee + 0, // [0:25] is the sub-list for field type_name } func init() { file_s3_proto_init() } @@ -5509,7 +5765,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CopyObjectInput); i { + switch v := v.(*CopySource); i { case 0: return &v.state case 1: @@ -5521,7 +5777,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CopyObjectOutput); i { + switch v := v.(*CopyObjectInput); i { case 0: return &v.state case 1: @@ -5533,7 +5789,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Delete); i { + switch v := v.(*CopyObjectResult); i { case 0: return &v.state case 1: @@ -5545,7 +5801,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObjectIdentifier); i { + switch v := v.(*CopyObjectOutput); i { case 0: return &v.state case 1: @@ -5557,7 +5813,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteObjectsInput); i { + switch v := v.(*Delete); i { case 0: return &v.state case 1: @@ -5569,7 +5825,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteObjectsOutput); i { + switch v := v.(*ObjectIdentifier); i { case 0: return &v.state case 1: @@ -5581,7 +5837,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListObjectsInput); i { + switch v := v.(*DeleteObjectsInput); i { case 0: return &v.state case 1: @@ -5593,7 +5849,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListObjectsOutput); i { + switch v := v.(*DeletedObject); i { case 0: return &v.state case 1: @@ -5605,7 +5861,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Owner); i { + switch v := v.(*DeleteObjectsOutput); i { case 0: return &v.state case 1: @@ -5617,7 +5873,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Object); i { + switch v := v.(*ListObjectsInput); i { case 0: return &v.state case 1: @@ -5629,7 +5885,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Grantee); i { + switch v := v.(*ListObjectsOutput); i { case 0: return &v.state case 1: @@ -5641,7 +5897,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Grant); i { + switch v := v.(*Owner); i { case 0: return &v.state case 1: @@ -5653,7 +5909,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObjectAclInput); i { + switch v := v.(*Object); i { case 0: return &v.state case 1: @@ -5665,7 +5921,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObjectAclOutput); i { + switch v := v.(*Grantee); i { case 0: return &v.state case 1: @@ -5677,7 +5933,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutObjectAclInput); i { + switch v := v.(*Grant); i { case 0: return &v.state case 1: @@ -5689,7 +5945,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutObjectAclOutput); i { + switch v := v.(*GetObjectAclInput); i { case 0: return &v.state case 1: @@ -5701,7 +5957,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RestoreObjectInput); i { + switch v := v.(*GetObjectAclOutput); i { case 0: return &v.state case 1: @@ -5713,7 +5969,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RestoreObjectOutput); i { + switch v := v.(*PutObjectAclInput); i { case 0: return &v.state case 1: @@ -5725,7 +5981,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateMultipartUploadInput); i { + switch v := v.(*PutObjectAclOutput); i { case 0: return &v.state case 1: @@ -5737,7 +5993,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateMultipartUploadOutput); i { + switch v := v.(*RestoreObjectInput); i { case 0: return &v.state case 1: @@ -5749,7 +6005,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UploadPartInput); i { + switch v := v.(*RestoreObjectOutput); i { case 0: return &v.state case 1: @@ -5761,7 +6017,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UploadPartOutput); i { + switch v := v.(*CreateMultipartUploadInput); i { case 0: return &v.state case 1: @@ -5773,7 +6029,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UploadPartCopyInput); i { + switch v := v.(*CreateMultipartUploadOutput); i { case 0: return &v.state case 1: @@ -5785,7 +6041,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CopyPartResult); i { + switch v := v.(*UploadPartInput); i { case 0: return &v.state case 1: @@ -5797,7 +6053,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UploadPartCopyOutput); i { + switch v := v.(*UploadPartOutput); i { case 0: return &v.state case 1: @@ -5809,7 +6065,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CompletedPart); i { + switch v := v.(*UploadPartCopyInput); i { case 0: return &v.state case 1: @@ -5821,7 +6077,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CompletedMultipartUpload); i { + switch v := v.(*CopyPartResult); i { case 0: return &v.state case 1: @@ -5833,7 +6089,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CompleteMultipartUploadInput); i { + switch v := v.(*UploadPartCopyOutput); i { case 0: return &v.state case 1: @@ -5845,7 +6101,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CompleteMultipartUploadOutput); i { + switch v := v.(*CompletedPart); i { case 0: return &v.state case 1: @@ -5857,7 +6113,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AbortMultipartUploadInput); i { + switch v := v.(*CompletedMultipartUpload); i { case 0: return &v.state case 1: @@ -5869,7 +6125,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AbortMultipartUploadOutput); i { + switch v := v.(*CompleteMultipartUploadInput); i { case 0: return &v.state case 1: @@ -5881,7 +6137,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMultipartUploadsInput); i { + switch v := v.(*CompleteMultipartUploadOutput); i { case 0: return &v.state case 1: @@ -5893,7 +6149,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Initiator); i { + switch v := v.(*AbortMultipartUploadInput); i { case 0: return &v.state case 1: @@ -5905,7 +6161,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MultipartUpload); i { + switch v := v.(*AbortMultipartUploadOutput); i { case 0: return &v.state case 1: @@ -5917,7 +6173,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMultipartUploadsOutput); i { + switch v := v.(*ListMultipartUploadsInput); i { case 0: return &v.state case 1: @@ -5929,7 +6185,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListObjectVersionsInput); i { + switch v := v.(*Initiator); i { case 0: return &v.state case 1: @@ -5941,7 +6197,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMarkerEntry); i { + switch v := v.(*MultipartUpload); i { case 0: return &v.state case 1: @@ -5953,7 +6209,7 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObjectVersion); i { + switch v := v.(*ListMultipartUploadsOutput); i { case 0: return &v.state case 1: @@ -5965,6 +6221,42 @@ func file_s3_proto_init() { } } file_s3_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListObjectVersionsInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteMarkerEntry); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ObjectVersion); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListObjectVersionsOutput); i { case 0: return &v.state @@ -5983,7 +6275,7 @@ func file_s3_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_s3_proto_rawDesc, NumEnums: 0, - NumMessages: 56, + NumMessages: 59, NumExtensions: 0, NumServices: 1, }, diff --git a/spec/proto/extension/v1/s3.proto b/spec/proto/extension/v1/s3.proto index 26a4813016..045b827593 100644 --- a/spec/proto/extension/v1/s3.proto +++ b/spec/proto/extension/v1/s3.proto @@ -3,7 +3,6 @@ syntax = "proto3"; package mosn.proto.runtime.v1; import "google/protobuf/empty.proto"; -import "google/protobuf/timestamp.proto"; option go_package = "mosn.io/layotto/spec/proto/extension/v1;s3"; @@ -92,6 +91,7 @@ message PutBucketTaggingInput{ string bucket = 2; string key = 3; map tags = 4; + string version_id = 5; } message PutBucketTaggingOutput{ @@ -115,14 +115,23 @@ message GetObjectTaggingOutput{ map tags = 1; } +message CopySource{ + string copy_source_bucket = 1; + string copy_source_key = 2; + string copy_source_version_id = 3; +} message CopyObjectInput{ string store_name = 1; string bucket = 2; string key = 3; - string copy_source = 4; + CopySource copy_source = 4; +} +message CopyObjectResult{ + string etag = 1; + int64 LastModified = 2; } message CopyObjectOutput{ - + CopyObjectResult CopyObjectResult = 1; } @@ -139,8 +148,14 @@ message DeleteObjectsInput{ string bucket = 2; Delete Delete = 3; } +message DeletedObject{ + bool delete_marker = 1; + string delete_marker_version_id = 2; + string key = 3; + string version_id = 4; +} message DeleteObjectsOutput{ - + repeated DeletedObject deleted = 1; } message ListObjectsInput{ @@ -173,7 +188,7 @@ message Owner{ message Object{ string etag = 1; string key = 2; - google.protobuf.Timestamp last_modified = 3; + int64 last_modified = 3; Owner owner = 4; int64 size = 5; string storage_class = 6; @@ -233,7 +248,7 @@ message CreateMultipartUploadInput{ string content_language = 9; string content_type = 10; string expected_bucket_owner = 11; - google.protobuf.Timestamp expires = 12; + int64 expires = 12; string grant_full_control = 13; string grant_read = 14; string grant_read_acp = 15; @@ -241,7 +256,7 @@ message CreateMultipartUploadInput{ map meta_data = 17; string object_lock_legal_hold_status = 18; string object_lock_mode = 19; - google.protobuf.Timestamp object_lock_retain_until_date = 20; + int64 object_lock_retain_until_date = 20; string request_payer = 21; string sse_customer_algorithm = 22; string sse_customer_key = 23; @@ -256,7 +271,7 @@ message CreateMultipartUploadInput{ message CreateMultipartUploadOutput{ string bucket = 1; string key = 2; - google.protobuf.Timestamp abort_date = 3; + int64 abort_date = 3; string abort_rule_id = 4; bool bucket_key_enabled = 5; string request_charged = 6; @@ -297,14 +312,16 @@ message UploadPartCopyInput{ string store_name = 1; string bucket = 2; string key = 3; - string copy_source = 4; + CopySource copy_source = 4; int32 part_number = 5; string upload_id = 6; + int64 start_position = 7; + int64 part_size = 8; } message CopyPartResult{ string etag = 1; - google.protobuf.Timestamp last_modified = 2; + int64 last_modified = 2; } message UploadPartCopyOutput{ bool bucket_key_enabled = 1; @@ -374,12 +391,12 @@ message Initiator{ string id = 2; } message MultipartUpload{ - google.protobuf.Timestamp Initiated = 1; + int64 initiated = 1; Initiator initiator = 2; string key = 3; Owner owner = 4; string storage_class = 5; - string UploadId = 6; + string upload_id = 6; } message ListMultipartUploadsOutput{ string bucket = 1; @@ -410,7 +427,7 @@ message ListObjectVersionsInput{ message DeleteMarkerEntry{ bool is_latest = 1; string key = 2; - google.protobuf.Timestamp last_modified = 3; + int64 last_modified = 3; Owner owner = 4; string version_id = 5; } @@ -418,7 +435,7 @@ message ObjectVersion{ string etag = 1; bool is_latest = 2; string key = 3; - google.protobuf.Timestamp last_modified = 4; + int64 last_modified = 4; Owner owner = 5; int64 size = 6; string storage_class = 7; From 61107327ddadf9ccdb038715ae6a4e7104a1ce9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Thu, 9 Jun 2022 11:35:09 +0800 Subject: [PATCH 013/126] fix compile error --- cmd/layotto_multiple_api/main.go | 3 ++- components/file/aws/oss.go | 26 ++++++++++----------- pkg/grpc/extension/s3/param.go | 5 ++++ pkg/grpc/extension/s3/s3.go | 40 ++++++++++++++++---------------- pkg/grpc/extension/s3/s3_test.go | 16 +++++++++++++ 5 files changed, 56 insertions(+), 34 deletions(-) create mode 100644 pkg/grpc/extension/s3/param.go create mode 100644 pkg/grpc/extension/s3/s3_test.go diff --git a/cmd/layotto_multiple_api/main.go b/cmd/layotto_multiple_api/main.go index 133ccf0ae7..b73c7f3acc 100644 --- a/cmd/layotto_multiple_api/main.go +++ b/cmd/layotto_multiple_api/main.go @@ -18,6 +18,7 @@ package main import ( "encoding/json" + "mosn.io/layotto/components/file/aliyun" "os" "strconv" "time" @@ -249,7 +250,7 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp // File runtime.WithFileFactory( - file.NewFileFactory("aliOSS", aliyun.NewAliCloudFile), + file.NewFileFactory("aliyunOSS", aliyun.NewAliCloudFile), file.NewFileFactory("minioOSS", minio.NewMinioOss), file.NewFileFactory("awsOSS", aws.NewAwsFile), file.NewFileFactory("tencentCloudOSS", tencentcloud.NewTencentCloudOSS), diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index c93ee55503..f72fd3b5ab 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -34,18 +34,18 @@ func AwsDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string) ( return nil, errors.New("invalid config for aws oss") } for _, data := range m { - customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) { - if region == data.Region { - return aws.Endpoint{ - PartitionID: "aliyun", - URL: "https://" + data.EndPoint, - SigningRegion: data.Region, - HostnameImmutable: true, - }, nil - } - // returning EndpointNotFoundError will allow the service to fallback to it's default resolution - return aws.Endpoint{}, &aws.EndpointNotFoundError{} - }) + // returning EndpointNotFoundError will allow the service to fallback to it's default resolution + //customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) { + // if region == data.Region { + // return aws.Endpoint{ + // PartitionID: "aliyun", + // URL: "https://" + data.EndPoint, + // SigningRegion: data.Region, + // HostnameImmutable: true, + // }, nil + // } + // return aws.Endpoint{}, &aws.EndpointNotFoundError{} + //}) optFunc := []func(options *aws_config.LoadOptions) error{ aws_config.WithRegion(data.Region), @@ -55,7 +55,7 @@ func AwsDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string) ( Source: defaultCredentialsSource, }, }), - aws_config.WithEndpointResolverWithOptions(customResolver), + //aws_config.WithEndpointResolverWithOptions(customResolver), } cfg, err := aws_config.LoadDefaultConfig(context.TODO(), optFunc...) diff --git a/pkg/grpc/extension/s3/param.go b/pkg/grpc/extension/s3/param.go new file mode 100644 index 0000000000..c7edd20021 --- /dev/null +++ b/pkg/grpc/extension/s3/param.go @@ -0,0 +1,5 @@ +package s3 + +const ( + NotSupportStoreName = "not supported store type: %+v" +) diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go index 483418c4ab..f24f1eef3f 100644 --- a/pkg/grpc/extension/s3/s3.go +++ b/pkg/grpc/extension/s3/s3.go @@ -72,7 +72,7 @@ func (s *S3Server) Register(rawGrpcServer *rawGRPC.Server) error { func (s *S3Server) InitClient(ctx context.Context, req *s3.InitRequest) (*emptypb.Empty, error) { if s.ossInstance[req.StoreName] == nil { - return nil, status.Errorf(codes.InvalidArgument, "not supported store type: %+v", req.StoreName) + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } err := s.ossInstance[req.StoreName].InitClient(ctx, &l8s3.InitRequest{Metadata: req.Metadata}) if err != nil { @@ -92,7 +92,7 @@ func transferData(source interface{}, target interface{}) error { func (s *S3Server) GetObject(req *s3.GetObjectInput, stream s3.S3_GetObjectServer) error { if s.ossInstance[req.StoreName] == nil { - return status.Errorf(codes.InvalidArgument, "not supported store type: %+v", req.StoreName) + return status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } st := &l8s3.GetObjectInput{} err := transferData(req, st) @@ -177,7 +177,7 @@ func (s *S3Server) PutObject(stream s3.S3_PutObjectServer) error { } if s.ossInstance[req.StoreName] == nil { - return status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + return status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } fileReader := newPutObjectStreamReader(req.Body, stream) @@ -201,7 +201,7 @@ func (s *S3Server) PutObject(stream s3.S3_PutObjectServer) error { func (s *S3Server) DeleteObject(ctx context.Context, req *s3.DeleteObjectInput) (*s3.DeleteObjectOutput, error) { if s.ossInstance[req.StoreName] == nil { - return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } st := &l8s3.DeleteObjectInput{} err := transferData(req, st) @@ -221,7 +221,7 @@ func (s *S3Server) DeleteObject(ctx context.Context, req *s3.DeleteObjectInput) } func (s *S3Server) PutObjectTagging(ctx context.Context, req *s3.PutBucketTaggingInput) (*s3.PutBucketTaggingOutput, error) { if s.ossInstance[req.StoreName] == nil { - return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } st := &l8s3.PutBucketTaggingInput{} err := transferData(req, st) @@ -241,7 +241,7 @@ func (s *S3Server) PutObjectTagging(ctx context.Context, req *s3.PutBucketTaggin } func (s *S3Server) DeleteObjectTagging(ctx context.Context, req *s3.DeleteObjectTaggingInput) (*s3.DeleteObjectTaggingOutput, error) { if s.ossInstance[req.StoreName] == nil { - return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } st := &l8s3.DeleteObjectTaggingInput{} err := transferData(req, st) @@ -261,7 +261,7 @@ func (s *S3Server) DeleteObjectTagging(ctx context.Context, req *s3.DeleteObject } func (s *S3Server) GetObjectTagging(ctx context.Context, req *s3.GetObjectTaggingInput) (*s3.GetObjectTaggingOutput, error) { if s.ossInstance[req.StoreName] == nil { - return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } st := &l8s3.GetObjectTaggingInput{} err := transferData(req, st) @@ -281,7 +281,7 @@ func (s *S3Server) GetObjectTagging(ctx context.Context, req *s3.GetObjectTaggin } func (s *S3Server) CopyObject(ctx context.Context, req *s3.CopyObjectInput) (*s3.CopyObjectOutput, error) { if s.ossInstance[req.StoreName] == nil { - return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } st := &l8s3.CopyObjectInput{} err := transferData(req, st) @@ -301,7 +301,7 @@ func (s *S3Server) CopyObject(ctx context.Context, req *s3.CopyObjectInput) (*s3 } func (s *S3Server) DeleteObjects(ctx context.Context, req *s3.DeleteObjectsInput) (*s3.DeleteObjectsOutput, error) { if s.ossInstance[req.StoreName] == nil { - return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } st := &l8s3.DeleteObjectsInput{} err := transferData(req, st) @@ -321,7 +321,7 @@ func (s *S3Server) DeleteObjects(ctx context.Context, req *s3.DeleteObjectsInput } func (s *S3Server) ListObjects(ctx context.Context, req *s3.ListObjectsInput) (*s3.ListObjectsOutput, error) { if s.ossInstance[req.StoreName] == nil { - return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } st := &l8s3.ListObjectsInput{} err := transferData(req, st) @@ -341,7 +341,7 @@ func (s *S3Server) ListObjects(ctx context.Context, req *s3.ListObjectsInput) (* } func (s *S3Server) GetObjectAcl(ctx context.Context, req *s3.GetObjectAclInput) (*s3.GetObjectAclOutput, error) { if s.ossInstance[req.StoreName] == nil { - return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } st := &l8s3.GetObjectAclInput{} err := transferData(req, st) @@ -361,7 +361,7 @@ func (s *S3Server) GetObjectAcl(ctx context.Context, req *s3.GetObjectAclInput) } func (s *S3Server) PutObjectAcl(ctx context.Context, req *s3.PutObjectAclInput) (*s3.PutObjectAclOutput, error) { if s.ossInstance[req.StoreName] == nil { - return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } st := &l8s3.PutObjectAclInput{} err := transferData(req, st) @@ -381,7 +381,7 @@ func (s *S3Server) PutObjectAcl(ctx context.Context, req *s3.PutObjectAclInput) } func (s *S3Server) RestoreObject(ctx context.Context, req *s3.RestoreObjectInput) (*s3.RestoreObjectOutput, error) { if s.ossInstance[req.StoreName] == nil { - return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } st := &l8s3.RestoreObjectInput{} err := transferData(req, st) @@ -401,7 +401,7 @@ func (s *S3Server) RestoreObject(ctx context.Context, req *s3.RestoreObjectInput } func (s *S3Server) CreateMultipartUpload(ctx context.Context, req *s3.CreateMultipartUploadInput) (*s3.CreateMultipartUploadOutput, error) { if s.ossInstance[req.StoreName] == nil { - return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } st := &l8s3.CreateMultipartUploadInput{} err := transferData(req, st) @@ -463,7 +463,7 @@ func (s *S3Server) UploadPart(stream s3.S3_UploadPartServer) error { } if s.ossInstance[req.StoreName] == nil { - return status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + return status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } fileReader := newUploadPartStreamReader(req.Body, stream) @@ -486,7 +486,7 @@ func (s *S3Server) UploadPart(stream s3.S3_UploadPartServer) error { } func (s *S3Server) UploadPartCopy(ctx context.Context, req *s3.UploadPartCopyInput) (*s3.UploadPartCopyOutput, error) { if s.ossInstance[req.StoreName] == nil { - return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } st := &l8s3.UploadPartCopyInput{} err := transferData(req, st) @@ -506,7 +506,7 @@ func (s *S3Server) UploadPartCopy(ctx context.Context, req *s3.UploadPartCopyInp } func (s *S3Server) CompleteMultipartUpload(ctx context.Context, req *s3.CompleteMultipartUploadInput) (*s3.CompleteMultipartUploadOutput, error) { if s.ossInstance[req.StoreName] == nil { - return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } st := &l8s3.CompleteMultipartUploadInput{} err := transferData(req, st) @@ -526,7 +526,7 @@ func (s *S3Server) CompleteMultipartUpload(ctx context.Context, req *s3.Complete } func (s *S3Server) AbortMultipartUpload(ctx context.Context, req *s3.AbortMultipartUploadInput) (*s3.AbortMultipartUploadOutput, error) { if s.ossInstance[req.StoreName] == nil { - return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } st := &l8s3.AbortMultipartUploadInput{} err := transferData(req, st) @@ -546,7 +546,7 @@ func (s *S3Server) AbortMultipartUpload(ctx context.Context, req *s3.AbortMultip } func (s *S3Server) ListMultipartUploads(ctx context.Context, req *s3.ListMultipartUploadsInput) (*s3.ListMultipartUploadsOutput, error) { if s.ossInstance[req.StoreName] == nil { - return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } st := &l8s3.ListMultipartUploadsInput{} err := transferData(req, st) @@ -566,7 +566,7 @@ func (s *S3Server) ListMultipartUploads(ctx context.Context, req *s3.ListMultipa } func (s *S3Server) ListObjectVersions(ctx context.Context, req *s3.ListObjectVersionsInput) (*s3.ListObjectVersionsOutput, error) { if s.ossInstance[req.StoreName] == nil { - return nil, status.Errorf(codes.InvalidArgument, "not support store type: %+v", req.StoreName) + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } st := &l8s3.ListObjectVersionsInput{} err := transferData(req, st) diff --git a/pkg/grpc/extension/s3/s3_test.go b/pkg/grpc/extension/s3/s3_test.go new file mode 100644 index 0000000000..28c437ea91 --- /dev/null +++ b/pkg/grpc/extension/s3/s3_test.go @@ -0,0 +1,16 @@ +package s3 + +import ( + "fmt" + "testing" +) + +func TestDeepCopy(t *testing.T) { + var s map[string]string + if len(s) == 0 { + fmt.Println("s lenth is 0") + } + var n *string + a := *n + fmt.Println(a) +} From 66ce63ad3ffd545ed7412a629d291ddd4f3986ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Thu, 9 Jun 2022 12:24:52 +0800 Subject: [PATCH 014/126] change init request name --- pkg/grpc/extension/s3/s3.go | 2 +- spec/proto/extension/v1/s3.pb.go | 1800 +++++++++++++++--------------- spec/proto/extension/v1/s3.proto | 4 +- 3 files changed, 903 insertions(+), 903 deletions(-) diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go index f24f1eef3f..f0c66eb5ae 100644 --- a/pkg/grpc/extension/s3/s3.go +++ b/pkg/grpc/extension/s3/s3.go @@ -70,7 +70,7 @@ func (s *S3Server) Register(rawGrpcServer *rawGRPC.Server) error { return nil } -func (s *S3Server) InitClient(ctx context.Context, req *s3.InitRequest) (*emptypb.Empty, error) { +func (s *S3Server) InitClient(ctx context.Context, req *s3.InitInput) (*emptypb.Empty, error) { if s.ossInstance[req.StoreName] == nil { return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } diff --git a/spec/proto/extension/v1/s3.pb.go b/spec/proto/extension/v1/s3.pb.go index fdf2c8f698..4d0307e9dc 100644 --- a/spec/proto/extension/v1/s3.pb.go +++ b/spec/proto/extension/v1/s3.pb.go @@ -30,7 +30,7 @@ const ( // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 -type InitRequest struct { +type InitInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -39,8 +39,8 @@ type InitRequest struct { Metadata map[string]string `protobuf:"bytes,2,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (x *InitRequest) Reset() { - *x = InitRequest{} +func (x *InitInput) Reset() { + *x = InitInput{} if protoimpl.UnsafeEnabled { mi := &file_s3_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -48,13 +48,13 @@ func (x *InitRequest) Reset() { } } -func (x *InitRequest) String() string { +func (x *InitInput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*InitRequest) ProtoMessage() {} +func (*InitInput) ProtoMessage() {} -func (x *InitRequest) ProtoReflect() protoreflect.Message { +func (x *InitInput) ProtoReflect() protoreflect.Message { mi := &file_s3_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -66,19 +66,19 @@ func (x *InitRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use InitRequest.ProtoReflect.Descriptor instead. -func (*InitRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use InitInput.ProtoReflect.Descriptor instead. +func (*InitInput) Descriptor() ([]byte, []int) { return file_s3_proto_rawDescGZIP(), []int{0} } -func (x *InitRequest) GetStoreName() string { +func (x *InitInput) GetStoreName() string { if x != nil { return x.StoreName } return "" } -func (x *InitRequest) GetMetadata() map[string]string { +func (x *InitInput) GetMetadata() map[string]string { if x != nil { return x.Metadata } @@ -4540,918 +4540,918 @@ var file_s3_proto_rawDesc = []byte{ 0x0a, 0x08, 0x73, 0x33, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xb7, - 0x01, 0x0a, 0x0b, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x4c, 0x0a, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 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, 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, 0x83, 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, 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, 0x03, 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, 0x04, 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, 0x05, 0x20, 0x01, 0x28, 0x09, 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, 0x06, - 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, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, - 0x69, 0x66, 0x55, 0x6e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x53, 0x69, 0x6e, 0x63, - 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 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, 0x79, 0x65, 0x72, 0x12, - 0x34, 0x0a, 0x16, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, - 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x14, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x40, 0x0a, 0x1c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, - 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x69, 0x6e, 0x67, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, - 0x32, 0x0a, 0x15, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, - 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 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, 0x12, 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, 0x13, 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, 0x14, 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, 0x15, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x25, - 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0xd2, 0x01, 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, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, - 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x16, 0x0a, - 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x05, 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, 0x06, 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, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, - 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x22, 0x53, 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, 0x22, - 0x5c, 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, 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, 0x84, 0x02, 0x0a, 0x15, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 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, 0x4a, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x75, - 0x63, 0x6b, 0x65, 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, 0x18, 0x0a, 0x16, 0x50, 0x75, 0x74, 0x42, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x22, 0x63, 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, 0x22, 0x3a, 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, 0x22, 0x60, 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, + 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb3, + 0x01, 0x0a, 0x09, 0x49, 0x6e, 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, 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, 0x22, 0x9e, 0x01, 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, 0x4b, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, - 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 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, 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, 0x9e, 0x01, 0x0a, 0x0f, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, + 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4a, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, + 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x69, 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, 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, 0x83, 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, 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, 0x03, 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, 0x04, + 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, 0x05, 0x20, 0x01, 0x28, 0x09, 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, 0x06, 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, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x69, 0x66, 0x55, 0x6e, + 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x72, 0x61, 0x6e, 0x67, 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, 0x79, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x12, 0x40, 0x0a, 0x1c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, + 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x69, + 0x72, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 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, 0x12, 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, 0x13, 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, 0x14, 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, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x25, 0x0a, 0x0f, 0x47, 0x65, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, + 0x79, 0x22, 0xd2, 0x01, 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, 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, 0x42, 0x0a, - 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x22, 0x4a, 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, 0x22, 0x0a, 0x0c, 0x4c, 0x61, 0x73, - 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x22, 0x67, 0x0a, - 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x12, 0x53, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x6f, - 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x52, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x61, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x12, 0x41, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x82, - 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, 0x35, 0x0a, 0x06, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, - 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x06, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 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, 0x55, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x3e, 0x0a, 0x07, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, - 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 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, + 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x61, 0x63, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x05, 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, 0x06, 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, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, 0x63, 0x68, 0x65, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x22, 0x53, 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, 0x22, 0x5c, 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, 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, 0xdd, 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, 0x39, 0x0a, 0x08, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, + 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, 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, 0x84, 0x02, + 0x0a, 0x15, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 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, 0x4a, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xc0, 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, - 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 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, 0x18, 0x0a, 0x16, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x63, + 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, 0x22, 0x3a, 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, 0x22, + 0x60, 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, 0x22, 0x9e, 0x01, 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, 0x4b, 0x0a, 0x04, + 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 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, 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, 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, 0x9e, 0x01, 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, 0x42, 0x0a, 0x0b, 0x63, 0x6f, 0x70, + 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x87, 0x01, 0x0a, - 0x07, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 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, 0x23, 0x0a, 0x0d, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x22, 0x61, 0x0a, 0x05, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, - 0x38, 0x0a, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, - 0x52, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5c, 0x0a, 0x11, 0x47, 0x65, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x22, 0xa7, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x34, - 0x0a, 0x06, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x4a, 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, 0x22, 0x0a, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, + 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, + 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x22, 0x67, 0x0a, 0x10, 0x43, 0x6f, 0x70, + 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x53, 0x0a, + 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x52, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x22, 0x61, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x41, 0x0a, 0x07, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x82, 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, 0x35, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, 0x55, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x3e, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 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, 0xdd, 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, 0x39, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 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, 0xc0, 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, 0x32, 0x0a, 0x05, 0x6f, + 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 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, 0x87, 0x01, 0x0a, 0x07, 0x47, 0x72, 0x61, + 0x6e, 0x74, 0x65, 0x65, 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, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, + 0x72, 0x69, 0x22, 0x61, 0x0a, 0x05, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x67, + 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, + 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x52, 0x07, 0x67, 0x72, + 0x61, 0x6e, 0x74, 0x65, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5c, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 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, 0x22, 0xa7, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x34, 0x0a, 0x06, 0x67, 0x72, + 0x61, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x06, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, + 0x12, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x6e, 0x0a, + 0x11, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x22, 0x3d, 0x0a, + 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x5d, 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, 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, 0xef, 0x0a, 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, 0x5c, 0x0a, 0x09, 0x6d, + 0x65, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x06, 0x67, 0x72, - 0x61, 0x6e, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x18, 0x0a, 0x07, 0x74, 0x61, + 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 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, 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, 0x22, 0x6e, 0x0a, 0x11, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x22, 0x3d, 0x0a, 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x5d, 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, 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, - 0xef, 0x0a, 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, + 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, - 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, - 0x5c, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x11, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, + 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, 0x16, 0x20, 0x01, 0x28, 0x09, + 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, 0x17, 0x20, 0x01, 0x28, 0x09, + 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, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, + 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, 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, 0x18, - 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 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, 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, + 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, 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, 0xa4, 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, 0x42, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 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, 0xb5, 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, 0x4f, 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, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x56, 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, 0x3a, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x24, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x22, 0xb9, 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, 0x5a, 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, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 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, 0xa4, 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, 0x42, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, + 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, 0xb5, 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, 0x4f, 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, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x56, 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, 0x3a, 0x0a, 0x05, + 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x6f, + 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, + 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x22, 0xb9, 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, 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, + 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, 0x5a, 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, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 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, 0xf7, 0x01, 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, 0x3e, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, - 0x69, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x6f, - 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 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, 0x32, 0x0a, 0x05, 0x6f, 0x77, - 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 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, 0xe2, 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, 0x40, 0x0a, 0x07, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x0c, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xba, 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, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x83, 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, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xab, 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, 0x4f, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, - 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 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, 0x40, 0x0a, 0x08, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, - 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x32, 0x93, - 0x11, 0x0a, 0x02, 0x53, 0x33, 0x12, 0x4a, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x69, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x5e, 0x0a, 0x09, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, - 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, - 0x01, 0x12, 0x5e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, - 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x65, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, - 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x10, 0x50, 0x75, 0x74, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x2e, 0x6d, - 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, - 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x6d, 0x6f, 0x73, + 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, 0xf7, 0x01, 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, 0x3e, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xe2, 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, + 0x40, 0x0a, 0x07, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xba, 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, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x83, 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, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xab, 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, 0x4f, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, - 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x13, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, - 0x6e, 0x67, 0x12, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x71, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x2e, 0x6d, 0x6f, - 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, - 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 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, 0x5f, 0x0a, 0x0a, 0x43, 0x6f, - 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x76, 0x31, 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, 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, 0x40, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x32, 0x91, 0x11, 0x0a, 0x02, 0x53, + 0x33, 0x12, 0x48, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, + 0x20, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 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, 0x5e, 0x0a, 0x09, 0x50, + 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, + 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x09, 0x47, + 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x1a, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0d, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x6d, + 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, + 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x0c, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x28, 0x2e, 0x6d, 0x6f, + 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x12, 0x71, 0x0a, 0x10, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, + 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, + 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x28, 0x2e, + 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x47, 0x65, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x71, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, + 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, - 0x12, 0x65, 0x0a, 0x0c, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, - 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, 0x73, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x22, 0x00, 0x12, 0x5f, 0x0a, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, - 0x00, 0x12, 0x80, 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, 0x31, 0x2e, 0x6d, 0x6f, - 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 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, 0x32, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, + 0x62, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x61, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, - 0x72, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x50, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6b, 0x0a, 0x0e, 0x55, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2b, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x22, 0x00, 0x12, 0x86, 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, 0x33, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x34, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x7d, 0x0a, - 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x7d, 0x0a, 0x14, - 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, - 0x6f, 0x61, 0x64, 0x73, 0x12, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x77, 0x0a, 0x12, 0x4c, - 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x2e, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, - 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x41, 0x63, 0x6c, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, + 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, + 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x50, 0x75, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, + 0x00, 0x12, 0x68, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x12, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, + 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x80, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x32, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 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, 0x61, + 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x12, 0x26, 0x2e, 0x6d, + 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, + 0x01, 0x12, 0x6b, 0x0a, 0x0e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, + 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, + 0x2b, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, + 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x86, + 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, 0x33, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 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, + 0x34, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x7d, 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x7d, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x30, + 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x77, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x2e, 0x6d, 0x6f, + 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 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, 0x2f, 0x2e, 0x6d, 0x6f, + 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 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, 0x42, 0x2c, + 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5468,7 +5468,7 @@ func file_s3_proto_rawDescGZIP() []byte { var file_s3_proto_msgTypes = make([]protoimpl.MessageInfo, 59) var file_s3_proto_goTypes = []interface{}{ - (*InitRequest)(nil), // 0: mosn.proto.runtime.v1.InitRequest + (*InitInput)(nil), // 0: mosn.proto.runtime.v1.InitInput (*GetObjectInput)(nil), // 1: mosn.proto.runtime.v1.GetObjectInput (*GetObjectOutput)(nil), // 2: mosn.proto.runtime.v1.GetObjectOutput (*PutObjectInput)(nil), // 3: mosn.proto.runtime.v1.PutObjectInput @@ -5523,14 +5523,14 @@ var file_s3_proto_goTypes = []interface{}{ (*DeleteMarkerEntry)(nil), // 52: mosn.proto.runtime.v1.DeleteMarkerEntry (*ObjectVersion)(nil), // 53: mosn.proto.runtime.v1.ObjectVersion (*ListObjectVersionsOutput)(nil), // 54: mosn.proto.runtime.v1.ListObjectVersionsOutput - nil, // 55: mosn.proto.runtime.v1.InitRequest.MetadataEntry + nil, // 55: mosn.proto.runtime.v1.InitInput.MetadataEntry nil, // 56: mosn.proto.runtime.v1.PutBucketTaggingInput.TagsEntry nil, // 57: mosn.proto.runtime.v1.GetObjectTaggingOutput.TagsEntry nil, // 58: mosn.proto.runtime.v1.CreateMultipartUploadInput.MetaDataEntry (*emptypb.Empty)(nil), // 59: google.protobuf.Empty } var file_s3_proto_depIdxs = []int32{ - 55, // 0: mosn.proto.runtime.v1.InitRequest.metadata:type_name -> mosn.proto.runtime.v1.InitRequest.MetadataEntry + 55, // 0: mosn.proto.runtime.v1.InitInput.metadata:type_name -> mosn.proto.runtime.v1.InitInput.MetadataEntry 56, // 1: mosn.proto.runtime.v1.PutBucketTaggingInput.tags:type_name -> mosn.proto.runtime.v1.PutBucketTaggingInput.TagsEntry 57, // 2: mosn.proto.runtime.v1.GetObjectTaggingOutput.tags:type_name -> mosn.proto.runtime.v1.GetObjectTaggingOutput.TagsEntry 13, // 3: mosn.proto.runtime.v1.CopyObjectInput.copy_source:type_name -> mosn.proto.runtime.v1.CopySource @@ -5555,7 +5555,7 @@ var file_s3_proto_depIdxs = []int32{ 24, // 22: mosn.proto.runtime.v1.ObjectVersion.owner:type_name -> mosn.proto.runtime.v1.Owner 52, // 23: mosn.proto.runtime.v1.ListObjectVersionsOutput.delete_markers:type_name -> mosn.proto.runtime.v1.DeleteMarkerEntry 53, // 24: mosn.proto.runtime.v1.ListObjectVersionsOutput.versions:type_name -> mosn.proto.runtime.v1.ObjectVersion - 0, // 25: mosn.proto.runtime.v1.S3.InitClient:input_type -> mosn.proto.runtime.v1.InitRequest + 0, // 25: mosn.proto.runtime.v1.S3.InitClient:input_type -> mosn.proto.runtime.v1.InitInput 3, // 26: mosn.proto.runtime.v1.S3.PutObject:input_type -> mosn.proto.runtime.v1.PutObjectInput 1, // 27: mosn.proto.runtime.v1.S3.GetObject:input_type -> mosn.proto.runtime.v1.GetObjectInput 5, // 28: mosn.proto.runtime.v1.S3.DeleteObject:input_type -> mosn.proto.runtime.v1.DeleteObjectInput @@ -5609,7 +5609,7 @@ func file_s3_proto_init() { } if !protoimpl.UnsafeEnabled { file_s3_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InitRequest); i { + switch v := v.(*InitInput); i { case 0: return &v.state case 1: @@ -6301,7 +6301,7 @@ const _ = grpc.SupportPackageIsVersion6 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type S3Client interface { - InitClient(ctx context.Context, in *InitRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + InitClient(ctx context.Context, in *InitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) PutObject(ctx context.Context, opts ...grpc.CallOption) (S3_PutObjectClient, error) GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (S3_GetObjectClient, error) DeleteObject(ctx context.Context, in *DeleteObjectInput, opts ...grpc.CallOption) (*DeleteObjectOutput, error) @@ -6331,7 +6331,7 @@ func NewS3Client(cc grpc.ClientConnInterface) S3Client { return &s3Client{cc} } -func (c *s3Client) InitClient(ctx context.Context, in *InitRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { +func (c *s3Client) InitClient(ctx context.Context, in *InitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/InitClient", in, out, opts...) if err != nil { @@ -6586,7 +6586,7 @@ func (c *s3Client) ListObjectVersions(ctx context.Context, in *ListObjectVersion // S3Server is the server API for S3 service. type S3Server interface { - InitClient(context.Context, *InitRequest) (*emptypb.Empty, error) + InitClient(context.Context, *InitInput) (*emptypb.Empty, error) PutObject(S3_PutObjectServer) error GetObject(*GetObjectInput, S3_GetObjectServer) error DeleteObject(context.Context, *DeleteObjectInput) (*DeleteObjectOutput, error) @@ -6612,7 +6612,7 @@ type S3Server interface { type UnimplementedS3Server struct { } -func (*UnimplementedS3Server) InitClient(context.Context, *InitRequest) (*emptypb.Empty, error) { +func (*UnimplementedS3Server) InitClient(context.Context, *InitInput) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method InitClient not implemented") } func (*UnimplementedS3Server) PutObject(S3_PutObjectServer) error { @@ -6678,7 +6678,7 @@ func RegisterS3Server(s *grpc.Server, srv S3Server) { } func _S3_InitClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(InitRequest) + in := new(InitInput) if err := dec(in); err != nil { return nil, err } @@ -6690,7 +6690,7 @@ func _S3_InitClient_Handler(srv interface{}, ctx context.Context, dec func(inter FullMethod: "/mosn.proto.runtime.v1.S3/InitClient", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).InitClient(ctx, req.(*InitRequest)) + return srv.(S3Server).InitClient(ctx, req.(*InitInput)) } return interceptor(ctx, in, info, handler) } diff --git a/spec/proto/extension/v1/s3.proto b/spec/proto/extension/v1/s3.proto index 045b827593..51ecd1e757 100644 --- a/spec/proto/extension/v1/s3.proto +++ b/spec/proto/extension/v1/s3.proto @@ -7,7 +7,7 @@ import "google/protobuf/empty.proto"; option go_package = "mosn.io/layotto/spec/proto/extension/v1;s3"; service S3 { - rpc InitClient(InitRequest) returns (google.protobuf.Empty){} + rpc InitClient(InitInput) returns (google.protobuf.Empty){} rpc PutObject(stream PutObjectInput) returns(PutObjectOutput){} rpc GetObject(GetObjectInput) returns (stream GetObjectOutput){} rpc DeleteObject(DeleteObjectInput) returns (DeleteObjectOutput){} @@ -29,7 +29,7 @@ service S3 { rpc ListObjectVersions(ListObjectVersionsInput) returns(ListObjectVersionsOutput){} } -message InitRequest { +message InitInput { string store_name = 1; map metadata = 2; } From 06a3a511b257ca9ce1d6c8fe8a175060f67ec4e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Thu, 9 Jun 2022 16:28:25 +0800 Subject: [PATCH 015/126] split oss and file configure --- configs/config_file.json | 14 ++++++++++++++ pkg/runtime/config.go | 1 + pkg/runtime/runtime.go | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/configs/config_file.json b/configs/config_file.json index a249163fc8..5fd286d94f 100644 --- a/configs/config_file.json +++ b/configs/config_file.json @@ -22,6 +22,20 @@ "hello": "greeting" } }, + "oss": { + "oss_demo": { + "type": "aliyunOSS", + "metadata": [ + { + "endpoint": "127.0.0.1:9000", + "accessKeyID": "layotto", + "accessKeySecret": "layotto_secret", + "SSL":false, + "region":"us-east-1" + } + ] + } + }, "file": { "file_demo": { "type": "minioOSS", diff --git a/pkg/runtime/config.go b/pkg/runtime/config.go index 499233a74e..b71eda7f64 100644 --- a/pkg/runtime/config.go +++ b/pkg/runtime/config.go @@ -49,6 +49,7 @@ type MosnRuntimeConfig struct { PubSubManagement map[string]pubsub.Config `json:"pub_subs"` StateManagement map[string]state.Config `json:"state"` Files map[string]file.FileConfig `json:"file"` + Oss map[string]file.FileConfig `json:"oss"` LockManagement map[string]lock.Config `json:"lock"` SequencerManagement map[string]sequencer.Config `json:"sequencer"` Bindings map[string]bindings.Metadata `json:"bindings"` diff --git a/pkg/runtime/runtime.go b/pkg/runtime/runtime.go index be96d0259f..f22a106945 100644 --- a/pkg/runtime/runtime.go +++ b/pkg/runtime/runtime.go @@ -395,7 +395,7 @@ func (m *MosnRuntime) initOss(oss ...*file.OssFactory) error { // register all oss store services implementation m.ossRegistry.Register(oss...) - for name, config := range m.runtimeConfig.Files { + for name, config := range m.runtimeConfig.Oss { c, err := m.ossRegistry.Create(config.Type) if err != nil { m.errInt(err, "create oss component %s failed", config.Type) From 9bbc0409890d332ca584a06b2fcf0ba0c17bdd97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Thu, 9 Jun 2022 16:53:34 +0800 Subject: [PATCH 016/126] format code --- components/file/aliyun/file.go | 3 ++- components/file/aliyun/oss.go | 3 ++- components/file/aws/file.go | 5 +++-- components/file/aws/oss.go | 19 +++---------------- demo/file/s3/client.go | 4 ++-- demo/file/s3/haizei.jpg | Bin 267024 -> 0 bytes pkg/grpc/extension/s3/s3.go | 8 +++++--- 7 files changed, 17 insertions(+), 25 deletions(-) delete mode 100644 demo/file/s3/haizei.jpg diff --git a/components/file/aliyun/file.go b/components/file/aliyun/file.go index 8ffe9565c2..24f1b9d479 100644 --- a/components/file/aliyun/file.go +++ b/components/file/aliyun/file.go @@ -21,9 +21,10 @@ import ( "encoding/json" "fmt" "io" - "mosn.io/layotto/components/file/util" "strconv" + "mosn.io/layotto/components/file/util" + "github.com/aliyun/aliyun-oss-go-sdk/oss" "mosn.io/layotto/components/file" diff --git a/components/file/aliyun/oss.go b/components/file/aliyun/oss.go index 0638a24811..cfa64593be 100644 --- a/components/file/aliyun/oss.go +++ b/components/file/aliyun/oss.go @@ -3,8 +3,9 @@ package aliyun import ( "context" "encoding/json" - "github.com/aliyun/aliyun-oss-go-sdk/oss" "io" + + "github.com/aliyun/aliyun-oss-go-sdk/oss" "mosn.io/layotto/components/file" "mosn.io/layotto/components/file/factory" ) diff --git a/components/file/aws/file.go b/components/file/aws/file.go index 01bc03eb15..4bb196d07b 100644 --- a/components/file/aws/file.go +++ b/components/file/aws/file.go @@ -21,15 +21,16 @@ import ( "encoding/json" "errors" "fmt" + "io" + "strings" + "github.com/aws/aws-sdk-go-v2/aws" 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" - "io" "mosn.io/layotto/components/file" "mosn.io/layotto/components/file/util" - "strings" ) const ( diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index f72fd3b5ab..1ce299e7b6 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -4,6 +4,9 @@ import ( "context" "encoding/json" "errors" + "io" + "time" + "github.com/aws/aws-sdk-go-v2/aws" aws_config "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/credentials" @@ -11,11 +14,9 @@ import ( "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/jinzhu/copier" - "io" "mosn.io/layotto/components/file" "mosn.io/layotto/components/file/factory" "mosn.io/pkg/log" - "time" ) const ( @@ -34,19 +35,6 @@ func AwsDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string) ( return nil, errors.New("invalid config for aws oss") } for _, data := range m { - // returning EndpointNotFoundError will allow the service to fallback to it's default resolution - //customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) { - // if region == data.Region { - // return aws.Endpoint{ - // PartitionID: "aliyun", - // URL: "https://" + data.EndPoint, - // SigningRegion: data.Region, - // HostnameImmutable: true, - // }, nil - // } - // return aws.Endpoint{}, &aws.EndpointNotFoundError{} - //}) - optFunc := []func(options *aws_config.LoadOptions) error{ aws_config.WithRegion(data.Region), aws_config.WithCredentialsProvider(credentials.StaticCredentialsProvider{ @@ -55,7 +43,6 @@ func AwsDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string) ( Source: defaultCredentialsSource, }, }), - //aws_config.WithEndpointResolverWithOptions(customResolver), } cfg, err := aws_config.LoadDefaultConfig(context.TODO(), optFunc...) diff --git a/demo/file/s3/client.go b/demo/file/s3/client.go index 5473fc40b1..e3dc45cda3 100644 --- a/demo/file/s3/client.go +++ b/demo/file/s3/client.go @@ -11,7 +11,7 @@ import ( ) const ( - storeName = "file_demo" + storeName = "oss_demo" storageType = "Standard" ) @@ -357,7 +357,7 @@ func main() { return } c := s3.NewS3Client(conn) - req := &s3.InitRequest{StoreName: storeName} + req := &s3.InitInput{StoreName: storeName} _, err = c.InitClient(context.Background(), req) if err != nil { fmt.Printf("Init client fail,err:%+v", err) diff --git a/demo/file/s3/haizei.jpg b/demo/file/s3/haizei.jpg deleted file mode 100644 index b821ce3b04c71e7e6aefde0443e13480d93fc77c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267024 zcmV)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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

{1 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 z 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 Date: Mon, 13 Jun 2022 20:17:12 +0800 Subject: [PATCH 017/126] add implement for fileexist and headobject --- components/file/aliyun/option.go | 414 ++++++++- components/file/aliyun/oss.go | 75 +- components/file/aws/oss.go | 8 + components/file/errors.go | 2 +- components/file/s3def.go | 84 +- pkg/grpc/extension/s3/s3.go | 39 + spec/proto/extension/v1/s3.pb.go | 1434 +++++++++++++++++++++--------- spec/proto/extension/v1/s3.proto | 72 +- 8 files changed, 1673 insertions(+), 455 deletions(-) diff --git a/components/file/aliyun/option.go b/components/file/aliyun/option.go index 05617db064..2586360e83 100644 --- a/components/file/aliyun/option.go +++ b/components/file/aliyun/option.go @@ -1,6 +1,10 @@ package aliyun -import "github.com/aliyun/aliyun-oss-go-sdk/oss" +import ( + "time" + + "github.com/aliyun/aliyun-oss-go-sdk/oss" +) // Prefix is an option to set prefix parameter func Prefix(value string) oss.Option { @@ -10,6 +14,7 @@ func Prefix(value string) oss.Option { return oss.Prefix(value) } +// KeyMarker is an option to set key-marker parameter func KeyMarker(value string) oss.Option { if value == "" { return nil @@ -17,6 +22,7 @@ func KeyMarker(value string) oss.Option { return oss.KeyMarker(value) } +// MaxUploads is an option to set max-uploads parameter func MaxUploads(value int) oss.Option { if value <= 0 { return nil @@ -24,6 +30,7 @@ func MaxUploads(value int) oss.Option { return oss.MaxUploads(value) } +// Delimiter is an option to set delimiler parameter func Delimiter(value string) oss.Option { if value == "" { return nil @@ -31,6 +38,8 @@ func Delimiter(value string) oss.Option { return oss.Delimiter(value) } + +// UploadIDMarker is an option to set upload-id-marker parameter func UploadIDMarker(value string) oss.Option { if value == "" { return nil @@ -38,9 +47,412 @@ func UploadIDMarker(value string) oss.Option { return oss.UploadIDMarker(value) } +// VersionId is an option to set versionId parameter func VersionId(value string) oss.Option { if value == "" { return nil } return oss.VersionId(value) } + +// ObjectACL is an option to set X-Oss-Object-Acl header +func ObjectACL(value string) oss.Option { + if value == "" { + return nil + } + return oss.ObjectACL(oss.ACLType(value)) +} + +// CacheControl is an option to set Cache-Control header +func CacheControl(value string) oss.Option { + if value == "" { + return nil + } + return oss.CacheControl(value) +} + +// ContentEncoding is an option to set Content-Encoding header +func ContentEncoding(value string) oss.Option { + if value == "" { + return nil + } + return oss.ContentEncoding(value) +} + +// ACL is an option to set X-Oss-Acl header +func ACL(acl string) oss.Option { + if acl == "" { + return nil + } + return oss.ACL(oss.ACLType(acl)) +} + +// ContentType is an option to set Content-Type header +func ContentType(value string) oss.Option { + if value == "" { + return nil + } + return oss.ContentType(value) +} + +// ContentLength is an option to set Content-Length header +func ContentLength(length int64) oss.Option { + if length == 0 { + return nil + } + return oss.ContentLength(length) +} + +// ContentDisposition is an option to set Content-Disposition header +func ContentDisposition(value string) oss.Option { + if value == "" { + return nil + } + return oss.ContentDisposition(value) +} + +// ContentLanguage is an option to set Content-Language header +func ContentLanguage(value string) oss.Option { + if value == "" { + return nil + } + return oss.ContentLanguage(value) +} + +// ContentMD5 is an option to set Content-MD5 header +func ContentMD5(value string) oss.Option { + if value == "" { + return nil + } + return oss.ContentMD5(value) +} + +// Expires is an option to set Expires header +func Expires(t int64) oss.Option { + if t == 0 { + return nil + } + ti := time.Unix(0, t) + return oss.Expires(ti) +} + +// AcceptEncoding is an option to set Accept-Encoding header +func AcceptEncoding(value string) oss.Option { + if value == "" { + return nil + } + return oss.AcceptEncoding(value) +} + +// IfModifiedSince is an option to set If-Modified-Since header +func IfModifiedSince(t int64) oss.Option { + if t == 0 { + return nil + } + ti := time.Unix(0, t) + return oss.IfModifiedSince(ti) +} + +// IfUnmodifiedSince is an option to set If-Unmodified-Since header +func IfUnmodifiedSince(t int64) oss.Option { + if t == 0 { + return nil + } + ti := time.Unix(0, t) + return oss.IfUnmodifiedSince(ti) +} + +// IfMatch is an option to set If-Match header +func IfMatch(value string) oss.Option { + if value == "" { + return nil + } + return oss.IfNoneMatch(value) +} + +// IfNoneMatch is an option to set IfNoneMatch header +func IfNoneMatch(value string) oss.Option { + if value == "" { + return nil + } + return oss.IfNoneMatch(value) +} + +// CopySourceIfMatch is an option to set X-Oss-Copy-Source-If-Match header +func CopySourceIfMatch(value string) oss.Option { + if value == "" { + return nil + } + return oss.CopySourceIfMatch(value) +} + +// CopySourceIfNoneMatch is an option to set X-Oss-Copy-Source-If-None-Match header +func CopySourceIfNoneMatch(value string) oss.Option { + if value == "" { + return nil + } + return oss.CopySourceIfNoneMatch(value) +} + +// CopySourceIfModifiedSince is an option to set X-Oss-CopySource-If-Modified-Since header +func CopySourceIfModifiedSince(t int64) oss.Option { + if t == 0 { + return nil + } + tm := time.Unix(0, t) + return oss.CopySourceIfModifiedSince(tm) +} + +// CopySourceIfUnmodifiedSince is an option to set X-Oss-Copy-Source-If-Unmodified-Since header +func CopySourceIfUnmodifiedSince(t int64) oss.Option { + if t == 0 { + return nil + } + tm := time.Unix(0, t) + return oss.CopySourceIfUnmodifiedSince(tm) +} + +// MetadataDirective is an option to set X-Oss-Metadata-Directive header +func MetadataDirective(value string) oss.Option { + if value == "" { + return nil + } + return oss.MetadataDirective(oss.MetadataDirectiveType(value)) +} + +// ServerSideEncryption is an option to set X-Oss-Server-Side-Encryption header +func ServerSideEncryption(value string) oss.Option { + if value == "" { + return nil + } + return oss.ServerSideEncryption(value) +} + +// ServerSideEncryptionKeyID is an option to set X-Oss-Server-Side-Encryption-Key-Id header +func ServerSideEncryptionKeyID(value string) oss.Option { + if value == "" { + return nil + } + return oss.ServerSideEncryptionKeyID(value) +} + +// ServerSideDataEncryption is an option to set X-Oss-Server-Side-Data-Encryption header +func ServerSideDataEncryption(value string) oss.Option { + if value == "" { + return nil + } + return oss.ServerSideDataEncryption(value) +} + +// SSECAlgorithm is an option to set X-Oss-Server-Side-Encryption-Customer-Algorithm header +func SSECAlgorithm(value string) oss.Option { + if value == "" { + return nil + } + return oss.SSECAlgorithm(value) +} + +// SSECKey is an option to set X-Oss-Server-Side-Encryption-Customer-Key header +func SSECKey(value string) oss.Option { + if value == "" { + return nil + } + return oss.SSECKey(value) +} + +// SSECKeyMd5 is an option to set X-Oss-Server-Side-Encryption-Customer-Key-Md5 header +func SSECKeyMd5(value string) oss.Option { + if value == "" { + return nil + } + return oss.SSECKeyMd5(value) +} + +// Origin is an option to set Origin header +func Origin(value string) oss.Option { + if value == "" { + return nil + } + return oss.Origin(value) +} + +// RangeBehavior is an option to set Range value, such as "standard" +func RangeBehavior(value string) oss.Option { + if value == "" { + return nil + } + return oss.RangeBehavior(value) +} + +func PartHashCtxHeader(value string) oss.Option { + if value == "" { + return nil + } + return oss.PartHashCtxHeader(value) +} + +func PartMd5CtxHeader(value string) oss.Option { + if value == "" { + return nil + } + return oss.PartMd5CtxHeader(value) +} + +func PartHashCtxParam(value string) oss.Option { + if value == "" { + return nil + } + return oss.PartHashCtxParam(value) +} + +func PartMd5CtxParam(value string) oss.Option { + if value == "" { + return nil + } + return oss.PartMd5CtxParam(value) +} + +// Marker is an option to set marker parameter +func Marker(value string) oss.Option { + if value == "" { + return nil + } + return oss.Marker(value) +} + +// MaxKeys is an option to set maxkeys parameter +func MaxKeys(value int) oss.Option { + if value == 0 { + return nil + } + return oss.MaxKeys(value) +} + +// EncodingType is an option to set encoding-type parameter +func EncodingType(value string) oss.Option { + if value == "" { + return nil + } + return oss.EncodingType(value) +} + +// VersionIdMarker is an option to set version-id-marker parameter +func VersionIdMarker(value string) oss.Option { + if value == "" { + return nil + } + return oss.VersionIdMarker(value) +} + +// MaxParts is an option to set max-parts parameter +func MaxParts(value int) oss.Option { + if value == 0 { + return nil + } + return oss.MaxParts(value) +} + +// PartNumberMarker is an option to set part-number-marker parameter +func PartNumberMarker(value int) oss.Option { + if value == 0 { + return nil + } + return oss.PartNumberMarker(value) +} + +// StorageClass bucket storage class +func StorageClass(value string) oss.Option { + if value == "" { + return nil + } + return oss.StorageClass(oss.StorageClassType(value)) +} + +// Checkpoint configuration +type cpConfig struct { + IsEnable bool + FilePath string + DirPath string +} + +// ResponseContentType is an option to set response-content-type param +func ResponseContentType(value string) oss.Option { + if value == "" { + return nil + } + return oss.ResponseContentType(value) +} + +// ResponseContentLanguage is an option to set response-content-language param +func ResponseContentLanguage(value string) oss.Option { + if value == "" { + return nil + } + return oss.ResponseContentLanguage(value) +} + +// ResponseExpires is an option to set response-expires param +func ResponseExpires(value string) oss.Option { + if value == "" { + return nil + } + return oss.ResponseExpires(value) +} + +// ResponseCacheControl is an option to set response-cache-control param +func ResponseCacheControl(value string) oss.Option { + if value == "" { + return nil + } + return oss.ResponseCacheControl(value) +} + +// ResponseContentDisposition is an option to set response-content-disposition param +func ResponseContentDisposition(value string) oss.Option { + if value == "" { + return nil + } + return oss.ResponseContentDisposition(value) +} + +// ResponseContentEncoding is an option to set response-content-encoding param +func ResponseContentEncoding(value string) oss.Option { + if value == "" { + return nil + } + return oss.ResponseContentEncoding(value) +} + +// Process is an option to set x-oss-process param +func Process(value string) oss.Option { + if value == "" { + return nil + } + return oss.Process(value) +} + +// TrafficLimitParam is a option to set x-oss-traffic-limit +func TrafficLimitParam(value int64) oss.Option { + if value == 0 { + return nil + } + return oss.TrafficLimitParam(value) +} + +// SetHeader Allow users to set personalized http headers +func SetHeader(key string, value interface{}) oss.Option { + return oss.SetHeader(key, value) +} + +// AddParam Allow users to set personalized http params +func AddParam(key string, value interface{}) oss.Option { + return oss.AddParam(key, value) +} + +// RequestPayer is an option to set payer who pay for the request +func RequestPayer(value string) oss.Option { + if value == "" { + return nil + } + return oss.RequestPayer(oss.PayerType(value)) +} diff --git a/components/file/aliyun/oss.go b/components/file/aliyun/oss.go index cfa64593be..026535bc61 100644 --- a/components/file/aliyun/oss.go +++ b/components/file/aliyun/oss.go @@ -73,7 +73,14 @@ func (a *AliyunOSS) GetObject(ctx context.Context, req *file.GetObjectInput) (io if err != nil { return nil, err } - body, err := bucket.GetObject(req.Key) + body, err := bucket.GetObject(req.Key, + IfUnmodifiedSince(req.IfUnmodifiedSince), + IfModifiedSince(req.IfModifiedSince), + IfMatch(req.IfMatch), + IfNoneMatch(req.IfNoneMatch), + oss.Range(req.Start, req.End), + AcceptEncoding(req.AcceptEncoding), + ) return body, err } @@ -86,7 +93,22 @@ func (a *AliyunOSS) PutObject(ctx context.Context, req *file.PutObjectInput) (*f if err != nil { return nil, err } - err = bucket.PutObject(req.Key, req.DataStream) + metaOption := []oss.Option{ + CacheControl(req.CacheControl), + ContentDisposition(req.ContentDisposition), + ContentEncoding(req.ContentEncoding), + Expires(req.Expires), + ServerSideEncryption(req.ServerSideEncryption), + ObjectACL(req.ACL), + } + for k, v := range req.Meta { + o := oss.Meta(k, v) + metaOption = append(metaOption, o) + } + + err = bucket.PutObject(req.Key, req.DataStream, + metaOption..., + ) return &file.PutObjectOutput{}, err } @@ -99,7 +121,7 @@ func (a *AliyunOSS) DeleteObject(ctx context.Context, req *file.DeleteObjectInpu if err != nil { return nil, err } - err = bucket.DeleteObject(req.Key) + err = bucket.DeleteObject(req.Key, RequestPayer(req.RequestPayer)) return &file.DeleteObjectOutput{}, err } func (a *AliyunOSS) DeleteObjects(ctx context.Context, req *file.DeleteObjectsInput) (*file.DeleteObjectsOutput, error) { @@ -115,7 +137,7 @@ func (a *AliyunOSS) DeleteObjects(ctx context.Context, req *file.DeleteObjectsIn for _, v := range req.Delete.Objects { objects = append(objects, v.Key) } - resp, err := bucket.DeleteObjects(objects) + resp, err := bucket.DeleteObjects(objects, oss.DeleteObjectsQuiet(req.Delete.Quiet)) if err != nil { return nil, err } @@ -127,7 +149,6 @@ func (a *AliyunOSS) DeleteObjects(ctx context.Context, req *file.DeleteObjectsIn return out, err } -//object标签 func (a *AliyunOSS) PutObjectTagging(ctx context.Context, req *file.PutBucketTaggingInput) (*file.PutBucketTaggingOutput, error) { cli, err := a.selectClient(map[string]string{}, endpointKey) if err != nil { @@ -142,7 +163,7 @@ func (a *AliyunOSS) PutObjectTagging(ctx context.Context, req *file.PutBucketTag tag := oss.Tag{Key: k, Value: v} tagging.Tags = append(tagging.Tags, tag) } - err = bucket.PutObjectTagging(req.Key, tagging) + err = bucket.PutObjectTagging(req.Key, tagging, VersionId(req.VersionId)) return nil, err } @@ -382,7 +403,6 @@ func (a *AliyunOSS) ListMultipartUploads(ctx context.Context, req *file.ListMult return output, err } -//未测试 func (a *AliyunOSS) RestoreObject(ctx context.Context, req *file.RestoreObjectInput) (*file.RestoreObjectOutput, error) { cli, err := a.selectClient(map[string]string{}, endpointKey) if err != nil { @@ -397,7 +417,6 @@ func (a *AliyunOSS) RestoreObject(ctx context.Context, req *file.RestoreObjectIn return output, err } -//当前不允许该操作 func (a *AliyunOSS) ListObjectVersions(ctx context.Context, req *file.ListObjectVersionsInput) (*file.ListObjectVersionsOutput, error) { cli, err := a.selectClient(map[string]string{}, endpointKey) if err != nil { @@ -453,3 +472,43 @@ func (a *AliyunOSS) ListObjectVersions(ctx context.Context, req *file.ListObject return output, err } + +func (a *AliyunOSS) HeadObject(ctx context.Context, req *file.HeadObjectInput) (*file.HeadObjectOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + resp, err := bucket.GetObjectMeta(req.Key) + if err != nil { + return nil, err + } + output := &file.HeadObjectOutput{ResultMetadata: map[string]string{}} + for k, v := range resp { + for _, t := range v { + //if key exist,concatenated with commas + if _, ok := output.ResultMetadata[k]; ok { + output.ResultMetadata[k] = output.ResultMetadata[k] + "," + t + } else { + output.ResultMetadata[k] = t + } + } + } + return output, err +} + +func (a *AliyunOSS) IsObjectExist(ctx context.Context, req *file.IsObjectExistInput) (*file.IsObjectExistOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + resp, err := bucket.IsObjectExist(req.Key) + return &file.IsObjectExistOutput{FileExist: resp}, err +} diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index 1ce299e7b6..adeb3966d8 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -598,3 +598,11 @@ func (a *AwsOss) ListObjectVersions(ctx context.Context, req *file.ListObjectVer } return output, err } + +func (a *AwsOss) HeadObject(ctx context.Context, req *file.HeadObjectInput) (*file.HeadObjectOutput, error) { + return nil, nil +} + +func (a *AwsOss) IsObjectExist(context.Context, *file.IsObjectExistInput) (*file.IsObjectExistOutput, error) { + return nil, nil +} diff --git a/components/file/errors.go b/components/file/errors.go index db949b33b0..4a6a18f3f2 100644 --- a/components/file/errors.go +++ b/components/file/errors.go @@ -25,5 +25,5 @@ var ( ErrPermission = errors.New("permission denied") ErrExist = errors.New("file already exists") ErrNotExist = errors.New("file does not exist") - ErrExpired = errors.New("file does not exist") + ErrExpired = errors.New("file expired") ) diff --git a/components/file/s3def.go b/components/file/s3def.go index 6449298454..fee303644a 100644 --- a/components/file/s3def.go +++ b/components/file/s3def.go @@ -48,6 +48,8 @@ type Oss interface { AbortMultipartUpload(context.Context, *AbortMultipartUploadInput) (*AbortMultipartUploadOutput, error) ListMultipartUploads(context.Context, *ListMultipartUploadsInput) (*ListMultipartUploadsOutput, error) ListObjectVersions(context.Context, *ListObjectVersionsInput) (*ListObjectVersionsOutput, error) + HeadObject(context.Context, *HeadObjectInput) (*HeadObjectOutput, error) + IsObjectExist(context.Context, *IsObjectExistInput) (*IsObjectExistOutput, error) } type BaseConfig struct { @@ -61,32 +63,40 @@ type GetObjectInput struct { Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` ExpectedBucketOwner string `protobuf:"bytes,3,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` IfMatch string `protobuf:"bytes,4,opt,name=if_match,json=ifMatch,proto3" json:"if_match,omitempty"` - IfModifiedSince string `protobuf:"bytes,5,opt,name=if_modified_since,json=ifModifiedSince,proto3" json:"if_modified_since,omitempty"` + IfModifiedSince int64 `protobuf:"varint,5,opt,name=if_modified_since,json=ifModifiedSince,proto3" json:"if_modified_since,omitempty"` IfNoneMatch string `protobuf:"bytes,6,opt,name=if_none_match,json=ifNoneMatch,proto3" json:"if_none_match,omitempty"` - IfUnmodifiedSince string `protobuf:"bytes,7,opt,name=if_unmodified_since,json=ifUnmodifiedSince,proto3" json:"if_unmodified_since,omitempty"` + IfUnmodifiedSince int64 `protobuf:"varint,7,opt,name=if_unmodified_since,json=ifUnmodifiedSince,proto3" json:"if_unmodified_since,omitempty"` Key string `protobuf:"bytes,8,opt,name=key,proto3" json:"key,omitempty"` PartNumber int64 `protobuf:"varint,9,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` - Range string `protobuf:"bytes,10,opt,name=range,proto3" json:"range,omitempty"` - RequestPayer string `protobuf:"bytes,11,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - ResponseCacheControl string `protobuf:"bytes,12,opt,name=response_cache_control,json=responseCacheControl,proto3" json:"response_cache_control,omitempty"` - ResponseContentDisposition string `protobuf:"bytes,13,opt,name=response_content_disposition,json=responseContentDisposition,proto3" json:"response_content_disposition,omitempty"` - ResponseContentEncoding string `protobuf:"bytes,14,opt,name=response_content_encoding,json=responseContentEncoding,proto3" json:"response_content_encoding,omitempty"` - ResponseContentLanguage string `protobuf:"bytes,15,opt,name=response_content_language,json=responseContentLanguage,proto3" json:"response_content_language,omitempty"` - ResponseContentType string `protobuf:"bytes,16,opt,name=response_content_type,json=responseContentType,proto3" json:"response_content_type,omitempty"` - ResponseExpires string `protobuf:"bytes,17,opt,name=response_expires,json=responseExpires,proto3" json:"response_expires,omitempty"` - SseCustomerAlgorithm string `protobuf:"bytes,18,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - SseCustomerKey string `protobuf:"bytes,19,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` - SseCustomerKeyMd5 string `protobuf:"bytes,20,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - VersionId string `protobuf:"bytes,21,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + Start int64 `protobuf:"varint,10,opt,name=start,proto3" json:"start,omitempty"` + End int64 `protobuf:"varint,11,opt,name=end,proto3" json:"end,omitempty"` + RequestPayer string `protobuf:"bytes,12,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + ResponseCacheControl string `protobuf:"bytes,13,opt,name=response_cache_control,json=responseCacheControl,proto3" json:"response_cache_control,omitempty"` + ResponseContentDisposition string `protobuf:"bytes,14,opt,name=response_content_disposition,json=responseContentDisposition,proto3" json:"response_content_disposition,omitempty"` + ResponseContentEncoding string `protobuf:"bytes,15,opt,name=response_content_encoding,json=responseContentEncoding,proto3" json:"response_content_encoding,omitempty"` + ResponseContentLanguage string `protobuf:"bytes,16,opt,name=response_content_language,json=responseContentLanguage,proto3" json:"response_content_language,omitempty"` + ResponseContentType string `protobuf:"bytes,17,opt,name=response_content_type,json=responseContentType,proto3" json:"response_content_type,omitempty"` + ResponseExpires string `protobuf:"bytes,18,opt,name=response_expires,json=responseExpires,proto3" json:"response_expires,omitempty"` + SseCustomerAlgorithm string `protobuf:"bytes,19,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SseCustomerKey string `protobuf:"bytes,20,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` + SseCustomerKeyMd5 string `protobuf:"bytes,21,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + VersionId string `protobuf:"bytes,22,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + AcceptEncoding string `protobuf:"bytes,23,opt,name=accept_encoding,json=acceptEncoding,proto3" json:"accept_encoding,omitempty"` } type PutObjectInput struct { - DataStream io.Reader - ACL string `protobuf:"bytes,2,opt,name=acl,proto3" json:"acl,omitempty"` - Bucket string `protobuf:"bytes,4,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,5,opt,name=key,proto3" json:"key,omitempty"` - BucketKeyEnabled bool `protobuf:"varint,6,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - CacheControl string `protobuf:"bytes,7,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` + DataStream io.Reader + ACL string `protobuf:"bytes,2,opt,name=acl,proto3" json:"acl,omitempty"` + Body []byte `protobuf:"bytes,3,opt,name=body,proto3" json:"body,omitempty"` + Bucket string `protobuf:"bytes,4,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,5,opt,name=key,proto3" json:"key,omitempty"` + BucketKeyEnabled bool `protobuf:"varint,6,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + CacheControl string `protobuf:"bytes,7,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` + ContentDisposition string `protobuf:"bytes,8,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` + ContentEncoding string `protobuf:"bytes,9,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` + Expires int64 `protobuf:"varint,10,opt,name=expires,proto3" json:"expires,omitempty"` + ServerSideEncryption string `protobuf:"bytes,11,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` + Meta map[string]string `protobuf:"bytes,12,rep,name=meta,proto3" json:"meta,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } type PutObjectOutput struct { @@ -95,8 +105,9 @@ type PutObjectOutput struct { } type DeleteObjectInput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + RequestPayer string `protobuf:"bytes,4,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` } type DeleteObjectOutput struct { DeleteMarker bool `protobuf:"varint,1,opt,name=delete_marker,json=deleteMarker,proto3" json:"delete_marker,omitempty"` @@ -461,3 +472,32 @@ type ObjectVersion struct { StorageClass string `protobuf:"bytes,7,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` VersionId string `protobuf:"bytes,8,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } + +type HeadObjectInput struct { + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + ChecksumMode string `protobuf:"bytes,4,opt,name=checksum_mode,json=checksumMode,proto3" json:"checksum_mode,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + IfMatch string `protobuf:"bytes,6,opt,name=if_match,json=ifMatch,proto3" json:"if_match,omitempty"` + IfModifiedSince int64 `protobuf:"varint,7,opt,name=if_modified_since,json=ifModifiedSince,proto3" json:"if_modified_since,omitempty"` + IfNoneMatch string `protobuf:"bytes,8,opt,name=if_none_match,json=ifNoneMatch,proto3" json:"if_none_match,omitempty"` + IfUnmodifiedSince int64 `protobuf:"varint,9,opt,name=if_unmodified_since,json=ifUnmodifiedSince,proto3" json:"if_unmodified_since,omitempty"` + PartNumber int32 `protobuf:"varint,10,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + RequestPayer string `protobuf:"bytes,11,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + SseCustomerAlgorithm string `protobuf:"bytes,12,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SseCustomerKey string `protobuf:"bytes,13,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` + SseCustomerKeyMd5 string `protobuf:"bytes,14,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + VersionId string `protobuf:"bytes,15,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` +} +type HeadObjectOutput struct { + // Metadata pertaining to the operation's result. + ResultMetadata map[string]string `protobuf:"bytes,1,rep,name=ResultMetadata,proto3" json:"ResultMetadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +type IsObjectExistInput struct { + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` +} +type IsObjectExistOutput struct { + FileExist bool `protobuf:"varint,1,opt,name=file_exist,json=fileExist,proto3" json:"file_exist,omitempty"` +} diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go index 95bf903d9a..b49526ceaf 100644 --- a/pkg/grpc/extension/s3/s3.go +++ b/pkg/grpc/extension/s3/s3.go @@ -586,3 +586,42 @@ func (s *S3Server) ListObjectVersions(ctx context.Context, req *s3.ListObjectVer return output, nil } } + +func (s *S3Server) HeadObject(ctx context.Context, req *s3.HeadObjectInput) (*s3.HeadObjectOutput, error) { + if s.ossInstance[req.StoreName] == nil { + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) + } + st := &l8s3.HeadObjectInput{} + err := transferData(req, st) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for ListObjectVersions,err: %+v", err) + } + if resp, err := s.ossInstance[req.StoreName].HeadObject(ctx, st); err != nil { + return nil, status.Errorf(codes.Internal, err.Error()) + } else { + output := &s3.HeadObjectOutput{} + err := transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for ListObjectVersions,err: %+v", err) + } + return output, nil + } +} + +func (s *S3Server) IsObjectExist(ctx context.Context, req *s3.IsObjectExistInput) (*s3.IsObjectExistOutput, error) { + if s.ossInstance[req.StoreName] == nil { + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) + } + st := &l8s3.IsObjectExistInput{} + err := transferData(req, st) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for IsObjectExist,err: %+v", err) + } + if resp, err := s.ossInstance[req.StoreName].IsObjectExist(ctx, st); err != nil { + return nil, status.Errorf(codes.Internal, err.Error()) + } else { + output := &s3.IsObjectExistOutput{} + output.FileExist = resp.FileExist + return output, nil + } +} diff --git a/spec/proto/extension/v1/s3.pb.go b/spec/proto/extension/v1/s3.pb.go index 4d0307e9dc..fcd1edf6a3 100644 --- a/spec/proto/extension/v1/s3.pb.go +++ b/spec/proto/extension/v1/s3.pb.go @@ -94,23 +94,25 @@ type GetObjectInput struct { Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` ExpectedBucketOwner string `protobuf:"bytes,3,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` IfMatch string `protobuf:"bytes,4,opt,name=if_match,json=ifMatch,proto3" json:"if_match,omitempty"` - IfModifiedSince string `protobuf:"bytes,5,opt,name=if_modified_since,json=ifModifiedSince,proto3" json:"if_modified_since,omitempty"` + IfModifiedSince int64 `protobuf:"varint,5,opt,name=if_modified_since,json=ifModifiedSince,proto3" json:"if_modified_since,omitempty"` IfNoneMatch string `protobuf:"bytes,6,opt,name=if_none_match,json=ifNoneMatch,proto3" json:"if_none_match,omitempty"` - IfUnmodifiedSince string `protobuf:"bytes,7,opt,name=if_unmodified_since,json=ifUnmodifiedSince,proto3" json:"if_unmodified_since,omitempty"` + IfUnmodifiedSince int64 `protobuf:"varint,7,opt,name=if_unmodified_since,json=ifUnmodifiedSince,proto3" json:"if_unmodified_since,omitempty"` Key string `protobuf:"bytes,8,opt,name=key,proto3" json:"key,omitempty"` PartNumber int64 `protobuf:"varint,9,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` - Range string `protobuf:"bytes,10,opt,name=range,proto3" json:"range,omitempty"` - RequestPayer string `protobuf:"bytes,11,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - ResponseCacheControl string `protobuf:"bytes,12,opt,name=response_cache_control,json=responseCacheControl,proto3" json:"response_cache_control,omitempty"` - ResponseContentDisposition string `protobuf:"bytes,13,opt,name=response_content_disposition,json=responseContentDisposition,proto3" json:"response_content_disposition,omitempty"` - ResponseContentEncoding string `protobuf:"bytes,14,opt,name=response_content_encoding,json=responseContentEncoding,proto3" json:"response_content_encoding,omitempty"` - ResponseContentLanguage string `protobuf:"bytes,15,opt,name=response_content_language,json=responseContentLanguage,proto3" json:"response_content_language,omitempty"` - ResponseContentType string `protobuf:"bytes,16,opt,name=response_content_type,json=responseContentType,proto3" json:"response_content_type,omitempty"` - ResponseExpires string `protobuf:"bytes,17,opt,name=response_expires,json=responseExpires,proto3" json:"response_expires,omitempty"` - SseCustomerAlgorithm string `protobuf:"bytes,18,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - SseCustomerKey string `protobuf:"bytes,19,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` - SseCustomerKeyMd5 string `protobuf:"bytes,20,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - VersionId string `protobuf:"bytes,21,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + Start int64 `protobuf:"varint,10,opt,name=start,proto3" json:"start,omitempty"` + End int64 `protobuf:"varint,11,opt,name=end,proto3" json:"end,omitempty"` + RequestPayer string `protobuf:"bytes,12,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + ResponseCacheControl string `protobuf:"bytes,13,opt,name=response_cache_control,json=responseCacheControl,proto3" json:"response_cache_control,omitempty"` + ResponseContentDisposition string `protobuf:"bytes,14,opt,name=response_content_disposition,json=responseContentDisposition,proto3" json:"response_content_disposition,omitempty"` + ResponseContentEncoding string `protobuf:"bytes,15,opt,name=response_content_encoding,json=responseContentEncoding,proto3" json:"response_content_encoding,omitempty"` + ResponseContentLanguage string `protobuf:"bytes,16,opt,name=response_content_language,json=responseContentLanguage,proto3" json:"response_content_language,omitempty"` + ResponseContentType string `protobuf:"bytes,17,opt,name=response_content_type,json=responseContentType,proto3" json:"response_content_type,omitempty"` + ResponseExpires string `protobuf:"bytes,18,opt,name=response_expires,json=responseExpires,proto3" json:"response_expires,omitempty"` + SseCustomerAlgorithm string `protobuf:"bytes,19,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SseCustomerKey string `protobuf:"bytes,20,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` + SseCustomerKeyMd5 string `protobuf:"bytes,21,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + VersionId string `protobuf:"bytes,22,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + AcceptEncoding string `protobuf:"bytes,23,opt,name=accept_encoding,json=acceptEncoding,proto3" json:"accept_encoding,omitempty"` } func (x *GetObjectInput) Reset() { @@ -173,11 +175,11 @@ func (x *GetObjectInput) GetIfMatch() string { return "" } -func (x *GetObjectInput) GetIfModifiedSince() string { +func (x *GetObjectInput) GetIfModifiedSince() int64 { if x != nil { return x.IfModifiedSince } - return "" + return 0 } func (x *GetObjectInput) GetIfNoneMatch() string { @@ -187,11 +189,11 @@ func (x *GetObjectInput) GetIfNoneMatch() string { return "" } -func (x *GetObjectInput) GetIfUnmodifiedSince() string { +func (x *GetObjectInput) GetIfUnmodifiedSince() int64 { if x != nil { return x.IfUnmodifiedSince } - return "" + return 0 } func (x *GetObjectInput) GetKey() string { @@ -208,11 +210,18 @@ func (x *GetObjectInput) GetPartNumber() int64 { return 0 } -func (x *GetObjectInput) GetRange() string { +func (x *GetObjectInput) GetStart() int64 { if x != nil { - return x.Range + return x.Start } - return "" + return 0 +} + +func (x *GetObjectInput) GetEnd() int64 { + if x != nil { + return x.End + } + return 0 } func (x *GetObjectInput) GetRequestPayer() string { @@ -292,6 +301,13 @@ func (x *GetObjectInput) GetVersionId() string { return "" } +func (x *GetObjectInput) GetAcceptEncoding() string { + if x != nil { + return x.AcceptEncoding + } + return "" +} + type GetObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -344,13 +360,18 @@ type PutObjectInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Acl string `protobuf:"bytes,2,opt,name=acl,proto3" json:"acl,omitempty"` - Body []byte `protobuf:"bytes,3,opt,name=body,proto3" json:"body,omitempty"` - Bucket string `protobuf:"bytes,4,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,5,opt,name=key,proto3" json:"key,omitempty"` - BucketKeyEnabled bool `protobuf:"varint,6,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - CacheControl string `protobuf:"bytes,7,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Acl string `protobuf:"bytes,2,opt,name=acl,proto3" json:"acl,omitempty"` + Body []byte `protobuf:"bytes,3,opt,name=body,proto3" json:"body,omitempty"` + Bucket string `protobuf:"bytes,4,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,5,opt,name=key,proto3" json:"key,omitempty"` + BucketKeyEnabled bool `protobuf:"varint,6,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + CacheControl string `protobuf:"bytes,7,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` + ContentDisposition string `protobuf:"bytes,8,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` + ContentEncoding string `protobuf:"bytes,9,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` + Expires int64 `protobuf:"varint,10,opt,name=expires,proto3" json:"expires,omitempty"` + ServerSideEncryption string `protobuf:"bytes,11,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` + Meta map[string]string `protobuf:"bytes,12,rep,name=meta,proto3" json:"meta,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *PutObjectInput) Reset() { @@ -434,6 +455,41 @@ func (x *PutObjectInput) GetCacheControl() string { return "" } +func (x *PutObjectInput) GetContentDisposition() string { + if x != nil { + return x.ContentDisposition + } + return "" +} + +func (x *PutObjectInput) GetContentEncoding() string { + if x != nil { + return x.ContentEncoding + } + return "" +} + +func (x *PutObjectInput) GetExpires() int64 { + if x != nil { + return x.Expires + } + return 0 +} + +func (x *PutObjectInput) GetServerSideEncryption() string { + if x != nil { + return x.ServerSideEncryption + } + return "" +} + +func (x *PutObjectInput) GetMeta() map[string]string { + if x != nil { + return x.Meta + } + return nil +} + type PutObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -494,9 +550,10 @@ type DeleteObjectInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + RequestPayer string `protobuf:"bytes,4,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` } func (x *DeleteObjectInput) Reset() { @@ -552,6 +609,13 @@ func (x *DeleteObjectInput) GetKey() string { return "" } +func (x *DeleteObjectInput) GetRequestPayer() string { + if x != nil { + return x.RequestPayer + } + return "" +} + type DeleteObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1303,9 +1367,10 @@ type DeleteObjectsInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Delete *Delete `protobuf:"bytes,3,opt,name=Delete,proto3" json:"Delete,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Delete *Delete `protobuf:"bytes,3,opt,name=delete,proto3" json:"delete,omitempty"` + RequestPayer string `protobuf:"bytes,4,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` } func (x *DeleteObjectsInput) Reset() { @@ -1361,6 +1426,13 @@ func (x *DeleteObjectsInput) GetDelete() *Delete { return nil } +func (x *DeleteObjectsInput) GetRequestPayer() string { + if x != nil { + return x.RequestPayer + } + return "" +} + type DeletedObject struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4534,6 +4606,323 @@ func (x *ListObjectVersionsOutput) GetVersions() []*ObjectVersion { return nil } +type HeadObjectInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + ChecksumMode string `protobuf:"bytes,4,opt,name=checksum_mode,json=checksumMode,proto3" json:"checksum_mode,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + IfMatch string `protobuf:"bytes,6,opt,name=if_match,json=ifMatch,proto3" json:"if_match,omitempty"` + IfModifiedSince int64 `protobuf:"varint,7,opt,name=if_modified_since,json=ifModifiedSince,proto3" json:"if_modified_since,omitempty"` + IfNoneMatch string `protobuf:"bytes,8,opt,name=if_none_match,json=ifNoneMatch,proto3" json:"if_none_match,omitempty"` + IfUnmodifiedSince int64 `protobuf:"varint,9,opt,name=if_unmodified_since,json=ifUnmodifiedSince,proto3" json:"if_unmodified_since,omitempty"` + PartNumber int32 `protobuf:"varint,10,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + RequestPayer string `protobuf:"bytes,11,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + SseCustomerAlgorithm string `protobuf:"bytes,12,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SseCustomerKey string `protobuf:"bytes,13,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` + SseCustomerKeyMd5 string `protobuf:"bytes,14,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + VersionId string `protobuf:"bytes,15,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` +} + +func (x *HeadObjectInput) Reset() { + *x = HeadObjectInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HeadObjectInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HeadObjectInput) ProtoMessage() {} + +func (x *HeadObjectInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[55] + 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 HeadObjectInput.ProtoReflect.Descriptor instead. +func (*HeadObjectInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{55} +} + +func (x *HeadObjectInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *HeadObjectInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *HeadObjectInput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *HeadObjectInput) GetChecksumMode() string { + if x != nil { + return x.ChecksumMode + } + 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 { + if x != nil { + return x.IfModifiedSince + } + return 0 +} + +func (x *HeadObjectInput) GetIfNoneMatch() string { + if x != nil { + return x.IfNoneMatch + } + return "" +} + +func (x *HeadObjectInput) GetIfUnmodifiedSince() int64 { + if x != nil { + return x.IfUnmodifiedSince + } + return 0 +} + +func (x *HeadObjectInput) GetPartNumber() int32 { + if x != nil { + return x.PartNumber + } + return 0 +} + +func (x *HeadObjectInput) GetRequestPayer() string { + if x != nil { + return x.RequestPayer + } + return "" +} + +func (x *HeadObjectInput) GetSseCustomerAlgorithm() string { + if x != nil { + return x.SseCustomerAlgorithm + } + return "" +} + +func (x *HeadObjectInput) GetSseCustomerKey() string { + if x != nil { + return x.SseCustomerKey + } + return "" +} + +func (x *HeadObjectInput) GetSseCustomerKeyMd5() string { + if x != nil { + return x.SseCustomerKeyMd5 + } + return "" +} + +func (x *HeadObjectInput) GetVersionId() string { + if x != nil { + return x.VersionId + } + return "" +} + +type HeadObjectOutput 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=ResultMetadata,proto3" json:"ResultMetadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *HeadObjectOutput) Reset() { + *x = HeadObjectOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[56] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HeadObjectOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HeadObjectOutput) ProtoMessage() {} + +func (x *HeadObjectOutput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[56] + 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 HeadObjectOutput.ProtoReflect.Descriptor instead. +func (*HeadObjectOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{56} +} + +func (x *HeadObjectOutput) GetResultMetadata() map[string]string { + if x != nil { + return x.ResultMetadata + } + return nil +} + +type IsObjectExistInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` +} + +func (x *IsObjectExistInput) Reset() { + *x = IsObjectExistInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IsObjectExistInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IsObjectExistInput) ProtoMessage() {} + +func (x *IsObjectExistInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[57] + 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 IsObjectExistInput.ProtoReflect.Descriptor instead. +func (*IsObjectExistInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{57} +} + +func (x *IsObjectExistInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *IsObjectExistInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *IsObjectExistInput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +type IsObjectExistOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FileExist bool `protobuf:"varint,1,opt,name=file_exist,json=fileExist,proto3" json:"file_exist,omitempty"` +} + +func (x *IsObjectExistOutput) Reset() { + *x = IsObjectExistOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IsObjectExistOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IsObjectExistOutput) ProtoMessage() {} + +func (x *IsObjectExistOutput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[58] + 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 IsObjectExistOutput.ProtoReflect.Descriptor instead. +func (*IsObjectExistOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{58} +} + +func (x *IsObjectExistOutput) GetFileExist() bool { + if x != nil { + return x.FileExist + } + return false +} + var File_s3_proto protoreflect.FileDescriptor var file_s3_proto_rawDesc = []byte{ @@ -4552,7 +4941,7 @@ var file_s3_proto_rawDesc = []byte{ 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, 0x83, 0x07, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbe, 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, @@ -4563,181 +4952,208 @@ var file_s3_proto_rawDesc = []byte{ 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x66, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 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, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x66, 0x4d, 0x6f, 0x64, 0x69, + 0x63, 0x65, 0x18, 0x05, 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, 0x06, 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, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x69, 0x66, 0x55, 0x6e, + 0x69, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x69, 0x66, 0x55, 0x6e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x72, 0x61, 0x6e, 0x67, 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, 0x79, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x12, 0x40, 0x0a, 0x1c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, - 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x69, - 0x72, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 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, 0x12, 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, 0x13, 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, 0x14, 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, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x25, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, - 0x79, 0x22, 0xd2, 0x01, 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, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x61, 0x63, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x05, 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, 0x06, 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, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, 0x63, 0x68, 0x65, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x22, 0x53, 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, 0x22, 0x5c, 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, 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, 0x84, 0x02, - 0x0a, 0x15, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 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, 0x4a, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, - 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 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, 0x18, 0x0a, 0x16, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x63, - 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, 0x22, 0x3a, 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, 0x22, - 0x60, 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, 0x22, 0x9e, 0x01, 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, 0x4b, 0x0a, 0x04, - 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 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, 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, 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, 0x9e, 0x01, 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, 0x42, 0x0a, 0x0b, 0x63, 0x6f, 0x70, - 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x4a, 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, 0x22, 0x0a, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, - 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, - 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x22, 0x67, 0x0a, 0x10, 0x43, 0x6f, 0x70, - 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x53, 0x0a, - 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x52, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x22, 0x61, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x41, 0x0a, 0x07, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x82, 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, 0x35, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x65, 0x72, 0x12, 0x34, 0x0a, + 0x16, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x12, 0x40, 0x0a, 0x1c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, + 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, + 0x67, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, + 0x15, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 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, 0x13, 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, 0x14, 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, 0x15, 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, 0x16, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, + 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, + 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x25, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0xfc, 0x03, 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, 0x10, + 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x63, 0x6c, + 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x62, 0x6f, 0x64, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x05, 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, 0x06, 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, 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, 0x43, 0x0a, + 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6d, 0x6f, + 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 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, 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, 0x22, 0x53, 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, + 0x22, 0x81, 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, 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, 0x84, 0x02, 0x0a, 0x15, 0x50, 0x75, 0x74, + 0x42, 0x75, 0x63, 0x6b, 0x65, 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, 0x4a, 0x0a, 0x04, 0x74, + 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 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, + 0x18, 0x0a, 0x16, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, + 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x63, 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, 0x22, 0x3a, + 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, 0x22, 0x60, 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, 0x22, 0x9e, 0x01, 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, 0x4b, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 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, 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, 0x9e, 0x01, 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, 0x42, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0a, 0x63, 0x6f, + 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x4a, 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, 0x22, 0x0a, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x22, 0x67, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x53, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x10, 0x43, 0x6f, 0x70, + 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x61, 0x0a, + 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x41, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, + 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, 0xa7, 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, 0x35, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, @@ -5310,148 +5726,218 @@ var file_s3_proto_rawDesc = []byte{ 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x32, 0x91, 0x11, 0x0a, 0x02, 0x53, - 0x33, 0x12, 0x48, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, - 0x20, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 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, 0x5e, 0x0a, 0x09, 0x50, - 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xc4, 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, 0x22, 0xba, 0x01, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x63, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, + 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x52, 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, 0x5d, + 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, 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, 0x32, 0xdc, 0x12, 0x0a, 0x02, 0x53, 0x33, 0x12, 0x48, 0x0a, 0x0a, 0x49, 0x6e, + 0x69, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, - 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x09, 0x47, - 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x2e, 0x49, 0x6e, 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, 0x5e, 0x0a, 0x09, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, - 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x0c, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x28, 0x2e, 0x6d, 0x6f, - 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0x00, 0x12, 0x71, 0x0a, 0x10, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, - 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, - 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x2e, 0x6d, - 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 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, 0x30, 0x2e, + 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, + 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x10, 0x50, + 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, + 0x2c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x71, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, - 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x5f, 0x0a, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, + 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7a, + 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, + 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, - 0x62, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x27, + 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, 0x71, 0x0a, 0x10, 0x47, 0x65, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x6d, + 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 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, 0x5f, 0x0a, + 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, + 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, + 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, + 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x1a, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0c, + 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x12, 0x28, 0x2e, 0x6d, + 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, + 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, - 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x50, 0x75, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, - 0x00, 0x12, 0x68, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x12, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, + 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0d, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x29, 0x2e, 0x6d, 0x6f, + 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x22, 0x00, 0x12, 0x80, 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, 0x31, + 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x32, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x61, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x61, 0x72, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x80, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x32, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 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, 0x61, - 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x12, 0x26, 0x2e, 0x6d, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6b, 0x0a, 0x0e, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, - 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, - 0x01, 0x12, 0x6b, 0x0a, 0x0e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, - 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, - 0x2b, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, - 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x86, - 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, 0x33, 0x2e, 0x6d, 0x6f, 0x73, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, + 0x6f, 0x70, 0x79, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2b, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x86, 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, 0x33, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x34, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 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, 0x7d, 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, + 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 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, - 0x34, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x7d, 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, - 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, - 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x7d, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, - 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x30, - 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x77, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x2e, 0x6d, 0x6f, - 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 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, 0x2f, 0x2e, 0x6d, 0x6f, - 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 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, 0x42, 0x2c, - 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x76, 0x31, 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, + 0x7d, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, + 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 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, 0x77, + 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x5f, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, + 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, + 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0d, 0x49, 0x73, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x12, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x73, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5466,7 +5952,7 @@ func file_s3_proto_rawDescGZIP() []byte { return file_s3_proto_rawDescData } -var file_s3_proto_msgTypes = make([]protoimpl.MessageInfo, 59) +var file_s3_proto_msgTypes = make([]protoimpl.MessageInfo, 65) var file_s3_proto_goTypes = []interface{}{ (*InitInput)(nil), // 0: mosn.proto.runtime.v1.InitInput (*GetObjectInput)(nil), // 1: mosn.proto.runtime.v1.GetObjectInput @@ -5523,83 +6009,95 @@ var file_s3_proto_goTypes = []interface{}{ (*DeleteMarkerEntry)(nil), // 52: mosn.proto.runtime.v1.DeleteMarkerEntry (*ObjectVersion)(nil), // 53: mosn.proto.runtime.v1.ObjectVersion (*ListObjectVersionsOutput)(nil), // 54: mosn.proto.runtime.v1.ListObjectVersionsOutput - nil, // 55: mosn.proto.runtime.v1.InitInput.MetadataEntry - nil, // 56: mosn.proto.runtime.v1.PutBucketTaggingInput.TagsEntry - nil, // 57: mosn.proto.runtime.v1.GetObjectTaggingOutput.TagsEntry - nil, // 58: mosn.proto.runtime.v1.CreateMultipartUploadInput.MetaDataEntry - (*emptypb.Empty)(nil), // 59: google.protobuf.Empty + (*HeadObjectInput)(nil), // 55: mosn.proto.runtime.v1.HeadObjectInput + (*HeadObjectOutput)(nil), // 56: mosn.proto.runtime.v1.HeadObjectOutput + (*IsObjectExistInput)(nil), // 57: mosn.proto.runtime.v1.IsObjectExistInput + (*IsObjectExistOutput)(nil), // 58: mosn.proto.runtime.v1.IsObjectExistOutput + nil, // 59: mosn.proto.runtime.v1.InitInput.MetadataEntry + nil, // 60: mosn.proto.runtime.v1.PutObjectInput.MetaEntry + nil, // 61: mosn.proto.runtime.v1.PutBucketTaggingInput.TagsEntry + nil, // 62: mosn.proto.runtime.v1.GetObjectTaggingOutput.TagsEntry + nil, // 63: mosn.proto.runtime.v1.CreateMultipartUploadInput.MetaDataEntry + nil, // 64: mosn.proto.runtime.v1.HeadObjectOutput.ResultMetadataEntry + (*emptypb.Empty)(nil), // 65: google.protobuf.Empty } var file_s3_proto_depIdxs = []int32{ - 55, // 0: mosn.proto.runtime.v1.InitInput.metadata:type_name -> mosn.proto.runtime.v1.InitInput.MetadataEntry - 56, // 1: mosn.proto.runtime.v1.PutBucketTaggingInput.tags:type_name -> mosn.proto.runtime.v1.PutBucketTaggingInput.TagsEntry - 57, // 2: mosn.proto.runtime.v1.GetObjectTaggingOutput.tags:type_name -> mosn.proto.runtime.v1.GetObjectTaggingOutput.TagsEntry - 13, // 3: mosn.proto.runtime.v1.CopyObjectInput.copy_source:type_name -> mosn.proto.runtime.v1.CopySource - 15, // 4: mosn.proto.runtime.v1.CopyObjectOutput.CopyObjectResult:type_name -> mosn.proto.runtime.v1.CopyObjectResult - 18, // 5: mosn.proto.runtime.v1.Delete.objects:type_name -> mosn.proto.runtime.v1.ObjectIdentifier - 17, // 6: mosn.proto.runtime.v1.DeleteObjectsInput.Delete:type_name -> mosn.proto.runtime.v1.Delete - 20, // 7: mosn.proto.runtime.v1.DeleteObjectsOutput.deleted:type_name -> mosn.proto.runtime.v1.DeletedObject - 25, // 8: mosn.proto.runtime.v1.ListObjectsOutput.contents:type_name -> mosn.proto.runtime.v1.Object - 24, // 9: mosn.proto.runtime.v1.Object.owner:type_name -> mosn.proto.runtime.v1.Owner - 26, // 10: mosn.proto.runtime.v1.Grant.grantee:type_name -> mosn.proto.runtime.v1.Grantee - 27, // 11: mosn.proto.runtime.v1.GetObjectAclOutput.grants:type_name -> mosn.proto.runtime.v1.Grant - 24, // 12: mosn.proto.runtime.v1.GetObjectAclOutput.owner:type_name -> mosn.proto.runtime.v1.Owner - 58, // 13: mosn.proto.runtime.v1.CreateMultipartUploadInput.meta_data:type_name -> mosn.proto.runtime.v1.CreateMultipartUploadInput.MetaDataEntry - 13, // 14: mosn.proto.runtime.v1.UploadPartCopyInput.copy_source:type_name -> mosn.proto.runtime.v1.CopySource - 39, // 15: mosn.proto.runtime.v1.UploadPartCopyOutput.copy_part_result:type_name -> mosn.proto.runtime.v1.CopyPartResult - 41, // 16: mosn.proto.runtime.v1.CompletedMultipartUpload.parts:type_name -> mosn.proto.runtime.v1.CompletedPart - 42, // 17: mosn.proto.runtime.v1.CompleteMultipartUploadInput.multipart_upload:type_name -> mosn.proto.runtime.v1.CompletedMultipartUpload - 48, // 18: mosn.proto.runtime.v1.MultipartUpload.initiator:type_name -> mosn.proto.runtime.v1.Initiator - 24, // 19: mosn.proto.runtime.v1.MultipartUpload.owner:type_name -> mosn.proto.runtime.v1.Owner - 49, // 20: mosn.proto.runtime.v1.ListMultipartUploadsOutput.uploads:type_name -> mosn.proto.runtime.v1.MultipartUpload - 24, // 21: mosn.proto.runtime.v1.DeleteMarkerEntry.owner:type_name -> mosn.proto.runtime.v1.Owner - 24, // 22: mosn.proto.runtime.v1.ObjectVersion.owner:type_name -> mosn.proto.runtime.v1.Owner - 52, // 23: mosn.proto.runtime.v1.ListObjectVersionsOutput.delete_markers:type_name -> mosn.proto.runtime.v1.DeleteMarkerEntry - 53, // 24: mosn.proto.runtime.v1.ListObjectVersionsOutput.versions:type_name -> mosn.proto.runtime.v1.ObjectVersion - 0, // 25: mosn.proto.runtime.v1.S3.InitClient:input_type -> mosn.proto.runtime.v1.InitInput - 3, // 26: mosn.proto.runtime.v1.S3.PutObject:input_type -> mosn.proto.runtime.v1.PutObjectInput - 1, // 27: mosn.proto.runtime.v1.S3.GetObject:input_type -> mosn.proto.runtime.v1.GetObjectInput - 5, // 28: mosn.proto.runtime.v1.S3.DeleteObject:input_type -> mosn.proto.runtime.v1.DeleteObjectInput - 7, // 29: mosn.proto.runtime.v1.S3.PutObjectTagging:input_type -> mosn.proto.runtime.v1.PutBucketTaggingInput - 9, // 30: mosn.proto.runtime.v1.S3.DeleteObjectTagging:input_type -> mosn.proto.runtime.v1.DeleteObjectTaggingInput - 11, // 31: mosn.proto.runtime.v1.S3.GetObjectTagging:input_type -> mosn.proto.runtime.v1.GetObjectTaggingInput - 14, // 32: mosn.proto.runtime.v1.S3.CopyObject:input_type -> mosn.proto.runtime.v1.CopyObjectInput - 19, // 33: mosn.proto.runtime.v1.S3.DeleteObjects:input_type -> mosn.proto.runtime.v1.DeleteObjectsInput - 22, // 34: mosn.proto.runtime.v1.S3.ListObjects:input_type -> mosn.proto.runtime.v1.ListObjectsInput - 28, // 35: mosn.proto.runtime.v1.S3.GetObjectAcl:input_type -> mosn.proto.runtime.v1.GetObjectAclInput - 30, // 36: mosn.proto.runtime.v1.S3.PutObjectAcl:input_type -> mosn.proto.runtime.v1.PutObjectAclInput - 32, // 37: mosn.proto.runtime.v1.S3.RestoreObject:input_type -> mosn.proto.runtime.v1.RestoreObjectInput - 34, // 38: mosn.proto.runtime.v1.S3.CreateMultipartUpload:input_type -> mosn.proto.runtime.v1.CreateMultipartUploadInput - 36, // 39: mosn.proto.runtime.v1.S3.UploadPart:input_type -> mosn.proto.runtime.v1.UploadPartInput - 38, // 40: mosn.proto.runtime.v1.S3.UploadPartCopy:input_type -> mosn.proto.runtime.v1.UploadPartCopyInput - 43, // 41: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:input_type -> mosn.proto.runtime.v1.CompleteMultipartUploadInput - 45, // 42: mosn.proto.runtime.v1.S3.AbortMultipartUpload:input_type -> mosn.proto.runtime.v1.AbortMultipartUploadInput - 47, // 43: mosn.proto.runtime.v1.S3.ListMultipartUploads:input_type -> mosn.proto.runtime.v1.ListMultipartUploadsInput - 51, // 44: mosn.proto.runtime.v1.S3.ListObjectVersions:input_type -> mosn.proto.runtime.v1.ListObjectVersionsInput - 59, // 45: mosn.proto.runtime.v1.S3.InitClient:output_type -> google.protobuf.Empty - 4, // 46: mosn.proto.runtime.v1.S3.PutObject:output_type -> mosn.proto.runtime.v1.PutObjectOutput - 2, // 47: mosn.proto.runtime.v1.S3.GetObject:output_type -> mosn.proto.runtime.v1.GetObjectOutput - 6, // 48: mosn.proto.runtime.v1.S3.DeleteObject:output_type -> mosn.proto.runtime.v1.DeleteObjectOutput - 8, // 49: mosn.proto.runtime.v1.S3.PutObjectTagging:output_type -> mosn.proto.runtime.v1.PutBucketTaggingOutput - 10, // 50: mosn.proto.runtime.v1.S3.DeleteObjectTagging:output_type -> mosn.proto.runtime.v1.DeleteObjectTaggingOutput - 12, // 51: mosn.proto.runtime.v1.S3.GetObjectTagging:output_type -> mosn.proto.runtime.v1.GetObjectTaggingOutput - 16, // 52: mosn.proto.runtime.v1.S3.CopyObject:output_type -> mosn.proto.runtime.v1.CopyObjectOutput - 21, // 53: mosn.proto.runtime.v1.S3.DeleteObjects:output_type -> mosn.proto.runtime.v1.DeleteObjectsOutput - 23, // 54: mosn.proto.runtime.v1.S3.ListObjects:output_type -> mosn.proto.runtime.v1.ListObjectsOutput - 29, // 55: mosn.proto.runtime.v1.S3.GetObjectAcl:output_type -> mosn.proto.runtime.v1.GetObjectAclOutput - 31, // 56: mosn.proto.runtime.v1.S3.PutObjectAcl:output_type -> mosn.proto.runtime.v1.PutObjectAclOutput - 33, // 57: mosn.proto.runtime.v1.S3.RestoreObject:output_type -> mosn.proto.runtime.v1.RestoreObjectOutput - 35, // 58: mosn.proto.runtime.v1.S3.CreateMultipartUpload:output_type -> mosn.proto.runtime.v1.CreateMultipartUploadOutput - 37, // 59: mosn.proto.runtime.v1.S3.UploadPart:output_type -> mosn.proto.runtime.v1.UploadPartOutput - 40, // 60: mosn.proto.runtime.v1.S3.UploadPartCopy:output_type -> mosn.proto.runtime.v1.UploadPartCopyOutput - 44, // 61: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:output_type -> mosn.proto.runtime.v1.CompleteMultipartUploadOutput - 46, // 62: mosn.proto.runtime.v1.S3.AbortMultipartUpload:output_type -> mosn.proto.runtime.v1.AbortMultipartUploadOutput - 50, // 63: mosn.proto.runtime.v1.S3.ListMultipartUploads:output_type -> mosn.proto.runtime.v1.ListMultipartUploadsOutput - 54, // 64: mosn.proto.runtime.v1.S3.ListObjectVersions:output_type -> mosn.proto.runtime.v1.ListObjectVersionsOutput - 45, // [45:65] is the sub-list for method output_type - 25, // [25:45] is the sub-list for method input_type - 25, // [25:25] is the sub-list for extension type_name - 25, // [25:25] is the sub-list for extension extendee - 0, // [0:25] is the sub-list for field type_name + 59, // 0: mosn.proto.runtime.v1.InitInput.metadata:type_name -> mosn.proto.runtime.v1.InitInput.MetadataEntry + 60, // 1: mosn.proto.runtime.v1.PutObjectInput.meta:type_name -> mosn.proto.runtime.v1.PutObjectInput.MetaEntry + 61, // 2: mosn.proto.runtime.v1.PutBucketTaggingInput.tags:type_name -> mosn.proto.runtime.v1.PutBucketTaggingInput.TagsEntry + 62, // 3: mosn.proto.runtime.v1.GetObjectTaggingOutput.tags:type_name -> mosn.proto.runtime.v1.GetObjectTaggingOutput.TagsEntry + 13, // 4: mosn.proto.runtime.v1.CopyObjectInput.copy_source:type_name -> mosn.proto.runtime.v1.CopySource + 15, // 5: mosn.proto.runtime.v1.CopyObjectOutput.CopyObjectResult:type_name -> mosn.proto.runtime.v1.CopyObjectResult + 18, // 6: mosn.proto.runtime.v1.Delete.objects:type_name -> mosn.proto.runtime.v1.ObjectIdentifier + 17, // 7: mosn.proto.runtime.v1.DeleteObjectsInput.delete:type_name -> mosn.proto.runtime.v1.Delete + 20, // 8: mosn.proto.runtime.v1.DeleteObjectsOutput.deleted:type_name -> mosn.proto.runtime.v1.DeletedObject + 25, // 9: mosn.proto.runtime.v1.ListObjectsOutput.contents:type_name -> mosn.proto.runtime.v1.Object + 24, // 10: mosn.proto.runtime.v1.Object.owner:type_name -> mosn.proto.runtime.v1.Owner + 26, // 11: mosn.proto.runtime.v1.Grant.grantee:type_name -> mosn.proto.runtime.v1.Grantee + 27, // 12: mosn.proto.runtime.v1.GetObjectAclOutput.grants:type_name -> mosn.proto.runtime.v1.Grant + 24, // 13: mosn.proto.runtime.v1.GetObjectAclOutput.owner:type_name -> mosn.proto.runtime.v1.Owner + 63, // 14: mosn.proto.runtime.v1.CreateMultipartUploadInput.meta_data:type_name -> mosn.proto.runtime.v1.CreateMultipartUploadInput.MetaDataEntry + 13, // 15: mosn.proto.runtime.v1.UploadPartCopyInput.copy_source:type_name -> mosn.proto.runtime.v1.CopySource + 39, // 16: mosn.proto.runtime.v1.UploadPartCopyOutput.copy_part_result:type_name -> mosn.proto.runtime.v1.CopyPartResult + 41, // 17: mosn.proto.runtime.v1.CompletedMultipartUpload.parts:type_name -> mosn.proto.runtime.v1.CompletedPart + 42, // 18: mosn.proto.runtime.v1.CompleteMultipartUploadInput.multipart_upload:type_name -> mosn.proto.runtime.v1.CompletedMultipartUpload + 48, // 19: mosn.proto.runtime.v1.MultipartUpload.initiator:type_name -> mosn.proto.runtime.v1.Initiator + 24, // 20: mosn.proto.runtime.v1.MultipartUpload.owner:type_name -> mosn.proto.runtime.v1.Owner + 49, // 21: mosn.proto.runtime.v1.ListMultipartUploadsOutput.uploads:type_name -> mosn.proto.runtime.v1.MultipartUpload + 24, // 22: mosn.proto.runtime.v1.DeleteMarkerEntry.owner:type_name -> mosn.proto.runtime.v1.Owner + 24, // 23: mosn.proto.runtime.v1.ObjectVersion.owner:type_name -> mosn.proto.runtime.v1.Owner + 52, // 24: mosn.proto.runtime.v1.ListObjectVersionsOutput.delete_markers:type_name -> mosn.proto.runtime.v1.DeleteMarkerEntry + 53, // 25: mosn.proto.runtime.v1.ListObjectVersionsOutput.versions:type_name -> mosn.proto.runtime.v1.ObjectVersion + 64, // 26: mosn.proto.runtime.v1.HeadObjectOutput.ResultMetadata:type_name -> mosn.proto.runtime.v1.HeadObjectOutput.ResultMetadataEntry + 0, // 27: mosn.proto.runtime.v1.S3.InitClient:input_type -> mosn.proto.runtime.v1.InitInput + 3, // 28: mosn.proto.runtime.v1.S3.PutObject:input_type -> mosn.proto.runtime.v1.PutObjectInput + 1, // 29: mosn.proto.runtime.v1.S3.GetObject:input_type -> mosn.proto.runtime.v1.GetObjectInput + 5, // 30: mosn.proto.runtime.v1.S3.DeleteObject:input_type -> mosn.proto.runtime.v1.DeleteObjectInput + 7, // 31: mosn.proto.runtime.v1.S3.PutObjectTagging:input_type -> mosn.proto.runtime.v1.PutBucketTaggingInput + 9, // 32: mosn.proto.runtime.v1.S3.DeleteObjectTagging:input_type -> mosn.proto.runtime.v1.DeleteObjectTaggingInput + 11, // 33: mosn.proto.runtime.v1.S3.GetObjectTagging:input_type -> mosn.proto.runtime.v1.GetObjectTaggingInput + 14, // 34: mosn.proto.runtime.v1.S3.CopyObject:input_type -> mosn.proto.runtime.v1.CopyObjectInput + 19, // 35: mosn.proto.runtime.v1.S3.DeleteObjects:input_type -> mosn.proto.runtime.v1.DeleteObjectsInput + 22, // 36: mosn.proto.runtime.v1.S3.ListObjects:input_type -> mosn.proto.runtime.v1.ListObjectsInput + 28, // 37: mosn.proto.runtime.v1.S3.GetObjectAcl:input_type -> mosn.proto.runtime.v1.GetObjectAclInput + 30, // 38: mosn.proto.runtime.v1.S3.PutObjectAcl:input_type -> mosn.proto.runtime.v1.PutObjectAclInput + 32, // 39: mosn.proto.runtime.v1.S3.RestoreObject:input_type -> mosn.proto.runtime.v1.RestoreObjectInput + 34, // 40: mosn.proto.runtime.v1.S3.CreateMultipartUpload:input_type -> mosn.proto.runtime.v1.CreateMultipartUploadInput + 36, // 41: mosn.proto.runtime.v1.S3.UploadPart:input_type -> mosn.proto.runtime.v1.UploadPartInput + 38, // 42: mosn.proto.runtime.v1.S3.UploadPartCopy:input_type -> mosn.proto.runtime.v1.UploadPartCopyInput + 43, // 43: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:input_type -> mosn.proto.runtime.v1.CompleteMultipartUploadInput + 45, // 44: mosn.proto.runtime.v1.S3.AbortMultipartUpload:input_type -> mosn.proto.runtime.v1.AbortMultipartUploadInput + 47, // 45: mosn.proto.runtime.v1.S3.ListMultipartUploads:input_type -> mosn.proto.runtime.v1.ListMultipartUploadsInput + 51, // 46: mosn.proto.runtime.v1.S3.ListObjectVersions:input_type -> mosn.proto.runtime.v1.ListObjectVersionsInput + 55, // 47: mosn.proto.runtime.v1.S3.HeadObject:input_type -> mosn.proto.runtime.v1.HeadObjectInput + 57, // 48: mosn.proto.runtime.v1.S3.IsObjectExist:input_type -> mosn.proto.runtime.v1.IsObjectExistInput + 65, // 49: mosn.proto.runtime.v1.S3.InitClient:output_type -> google.protobuf.Empty + 4, // 50: mosn.proto.runtime.v1.S3.PutObject:output_type -> mosn.proto.runtime.v1.PutObjectOutput + 2, // 51: mosn.proto.runtime.v1.S3.GetObject:output_type -> mosn.proto.runtime.v1.GetObjectOutput + 6, // 52: mosn.proto.runtime.v1.S3.DeleteObject:output_type -> mosn.proto.runtime.v1.DeleteObjectOutput + 8, // 53: mosn.proto.runtime.v1.S3.PutObjectTagging:output_type -> mosn.proto.runtime.v1.PutBucketTaggingOutput + 10, // 54: mosn.proto.runtime.v1.S3.DeleteObjectTagging:output_type -> mosn.proto.runtime.v1.DeleteObjectTaggingOutput + 12, // 55: mosn.proto.runtime.v1.S3.GetObjectTagging:output_type -> mosn.proto.runtime.v1.GetObjectTaggingOutput + 16, // 56: mosn.proto.runtime.v1.S3.CopyObject:output_type -> mosn.proto.runtime.v1.CopyObjectOutput + 21, // 57: mosn.proto.runtime.v1.S3.DeleteObjects:output_type -> mosn.proto.runtime.v1.DeleteObjectsOutput + 23, // 58: mosn.proto.runtime.v1.S3.ListObjects:output_type -> mosn.proto.runtime.v1.ListObjectsOutput + 29, // 59: mosn.proto.runtime.v1.S3.GetObjectAcl:output_type -> mosn.proto.runtime.v1.GetObjectAclOutput + 31, // 60: mosn.proto.runtime.v1.S3.PutObjectAcl:output_type -> mosn.proto.runtime.v1.PutObjectAclOutput + 33, // 61: mosn.proto.runtime.v1.S3.RestoreObject:output_type -> mosn.proto.runtime.v1.RestoreObjectOutput + 35, // 62: mosn.proto.runtime.v1.S3.CreateMultipartUpload:output_type -> mosn.proto.runtime.v1.CreateMultipartUploadOutput + 37, // 63: mosn.proto.runtime.v1.S3.UploadPart:output_type -> mosn.proto.runtime.v1.UploadPartOutput + 40, // 64: mosn.proto.runtime.v1.S3.UploadPartCopy:output_type -> mosn.proto.runtime.v1.UploadPartCopyOutput + 44, // 65: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:output_type -> mosn.proto.runtime.v1.CompleteMultipartUploadOutput + 46, // 66: mosn.proto.runtime.v1.S3.AbortMultipartUpload:output_type -> mosn.proto.runtime.v1.AbortMultipartUploadOutput + 50, // 67: mosn.proto.runtime.v1.S3.ListMultipartUploads:output_type -> mosn.proto.runtime.v1.ListMultipartUploadsOutput + 54, // 68: mosn.proto.runtime.v1.S3.ListObjectVersions:output_type -> mosn.proto.runtime.v1.ListObjectVersionsOutput + 56, // 69: mosn.proto.runtime.v1.S3.HeadObject:output_type -> mosn.proto.runtime.v1.HeadObjectOutput + 58, // 70: mosn.proto.runtime.v1.S3.IsObjectExist:output_type -> mosn.proto.runtime.v1.IsObjectExistOutput + 49, // [49:71] is the sub-list for method output_type + 27, // [27:49] is the sub-list for method input_type + 27, // [27:27] is the sub-list for extension type_name + 27, // [27:27] is the sub-list for extension extendee + 0, // [0:27] is the sub-list for field type_name } func init() { file_s3_proto_init() } @@ -6268,6 +6766,54 @@ func file_s3_proto_init() { return nil } } + file_s3_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HeadObjectInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HeadObjectOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IsObjectExistInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_s3_proto_msgTypes[58].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 + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -6275,7 +6821,7 @@ func file_s3_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_s3_proto_rawDesc, NumEnums: 0, - NumMessages: 59, + NumMessages: 65, NumExtensions: 0, NumServices: 1, }, @@ -6321,6 +6867,8 @@ type S3Client interface { AbortMultipartUpload(ctx context.Context, in *AbortMultipartUploadInput, opts ...grpc.CallOption) (*AbortMultipartUploadOutput, error) ListMultipartUploads(ctx context.Context, in *ListMultipartUploadsInput, opts ...grpc.CallOption) (*ListMultipartUploadsOutput, error) ListObjectVersions(ctx context.Context, in *ListObjectVersionsInput, opts ...grpc.CallOption) (*ListObjectVersionsOutput, error) + HeadObject(ctx context.Context, in *HeadObjectInput, opts ...grpc.CallOption) (*HeadObjectOutput, error) + IsObjectExist(ctx context.Context, in *IsObjectExistInput, opts ...grpc.CallOption) (*IsObjectExistOutput, error) } type s3Client struct { @@ -6584,6 +7132,24 @@ func (c *s3Client) ListObjectVersions(ctx context.Context, in *ListObjectVersion return out, nil } +func (c *s3Client) HeadObject(ctx context.Context, in *HeadObjectInput, opts ...grpc.CallOption) (*HeadObjectOutput, error) { + out := new(HeadObjectOutput) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/HeadObject", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *s3Client) IsObjectExist(ctx context.Context, in *IsObjectExistInput, opts ...grpc.CallOption) (*IsObjectExistOutput, error) { + out := new(IsObjectExistOutput) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/IsObjectExist", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // S3Server is the server API for S3 service. type S3Server interface { InitClient(context.Context, *InitInput) (*emptypb.Empty, error) @@ -6606,6 +7172,8 @@ type S3Server interface { AbortMultipartUpload(context.Context, *AbortMultipartUploadInput) (*AbortMultipartUploadOutput, error) ListMultipartUploads(context.Context, *ListMultipartUploadsInput) (*ListMultipartUploadsOutput, error) ListObjectVersions(context.Context, *ListObjectVersionsInput) (*ListObjectVersionsOutput, error) + HeadObject(context.Context, *HeadObjectInput) (*HeadObjectOutput, error) + IsObjectExist(context.Context, *IsObjectExistInput) (*IsObjectExistOutput, error) } // UnimplementedS3Server can be embedded to have forward compatible implementations. @@ -6672,6 +7240,12 @@ func (*UnimplementedS3Server) ListMultipartUploads(context.Context, *ListMultipa func (*UnimplementedS3Server) ListObjectVersions(context.Context, *ListObjectVersionsInput) (*ListObjectVersionsOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method ListObjectVersions not implemented") } +func (*UnimplementedS3Server) HeadObject(context.Context, *HeadObjectInput) (*HeadObjectOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method HeadObject not implemented") +} +func (*UnimplementedS3Server) IsObjectExist(context.Context, *IsObjectExistInput) (*IsObjectExistOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method IsObjectExist not implemented") +} func RegisterS3Server(s *grpc.Server, srv S3Server) { s.RegisterService(&_S3_serviceDesc, srv) @@ -7056,6 +7630,42 @@ func _S3_ListObjectVersions_Handler(srv interface{}, ctx context.Context, dec fu return interceptor(ctx, in, info, handler) } +func _S3_HeadObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(HeadObjectInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(S3Server).HeadObject(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/HeadObject", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).HeadObject(ctx, req.(*HeadObjectInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _S3_IsObjectExist_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(IsObjectExistInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(S3Server).IsObjectExist(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/IsObjectExist", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).IsObjectExist(ctx, req.(*IsObjectExistInput)) + } + return interceptor(ctx, in, info, handler) +} + var _S3_serviceDesc = grpc.ServiceDesc{ ServiceName: "mosn.proto.runtime.v1.S3", HandlerType: (*S3Server)(nil), @@ -7128,6 +7738,14 @@ var _S3_serviceDesc = grpc.ServiceDesc{ MethodName: "ListObjectVersions", Handler: _S3_ListObjectVersions_Handler, }, + { + MethodName: "HeadObject", + Handler: _S3_HeadObject_Handler, + }, + { + MethodName: "IsObjectExist", + Handler: _S3_IsObjectExist_Handler, + }, }, Streams: []grpc.StreamDesc{ { diff --git a/spec/proto/extension/v1/s3.proto b/spec/proto/extension/v1/s3.proto index 51ecd1e757..931685ae78 100644 --- a/spec/proto/extension/v1/s3.proto +++ b/spec/proto/extension/v1/s3.proto @@ -27,6 +27,8 @@ service S3 { rpc AbortMultipartUpload(AbortMultipartUploadInput) returns(AbortMultipartUploadOutput){} rpc ListMultipartUploads(ListMultipartUploadsInput) returns(ListMultipartUploadsOutput){} rpc ListObjectVersions(ListObjectVersionsInput) returns(ListObjectVersionsOutput){} + rpc HeadObject(HeadObjectInput) returns(HeadObjectOutput){} + rpc IsObjectExist(IsObjectExistInput) returns(IsObjectExistOutput){} } message InitInput { @@ -39,23 +41,25 @@ message GetObjectInput { string bucket = 2; string expected_bucket_owner = 3; string if_match = 4; - string if_modified_since = 5; + int64 if_modified_since = 5; string if_none_match = 6; - string if_unmodified_since = 7; + int64 if_unmodified_since = 7; string key = 8; int64 part_number = 9; - string range = 10; - string request_payer = 11; - string response_cache_control = 12; - string response_content_disposition = 13; - string response_content_encoding = 14; - string response_content_language = 15; - string response_content_type = 16; - string response_expires = 17; - string sse_customer_algorithm = 18; - string sse_customer_key = 19; - string sse_customer_key_md5 = 20; - string version_id = 21; + int64 start = 10; + int64 end = 11; + string request_payer = 12; + string response_cache_control = 13; + string response_content_disposition = 14; + string response_content_encoding = 15; + string response_content_language = 16; + string response_content_type = 17; + string response_expires = 18; + string sse_customer_algorithm = 19; + string sse_customer_key = 20; + string sse_customer_key_md5 = 21; + string version_id = 22; + string accept_encoding = 23; } message GetObjectOutput { bytes body = 1; @@ -69,6 +73,11 @@ message PutObjectInput{ string key = 5; bool bucket_key_enabled = 6; string cache_control = 7; + string content_disposition = 8; + string content_encoding = 9; + int64 expires = 10; + string server_side_encryption = 11; + map meta = 12; } message PutObjectOutput{ bool bucket_key_enabled = 1; @@ -79,6 +88,7 @@ message DeleteObjectInput{ string store_name = 1; string bucket = 2; string key = 3; + string request_payer = 4; } message DeleteObjectOutput{ bool delete_marker = 1; @@ -146,7 +156,8 @@ message ObjectIdentifier{ message DeleteObjectsInput{ string store_name = 1; string bucket = 2; - Delete Delete = 3; + Delete delete = 3; + string request_payer = 4; } message DeletedObject{ bool delete_marker = 1; @@ -455,4 +466,35 @@ message ListObjectVersionsOutput{ string prefix = 11; string version_id_marker = 12; repeated ObjectVersion versions = 13; +} + +message HeadObjectInput{ + string store_name = 1; + string bucket = 2; + string key = 3; + string checksum_mode = 4; + string expected_bucket_owner = 5; + string if_match = 6; + int64 if_modified_since = 7; + string if_none_match = 8; + int64 if_unmodified_since = 9; + int32 part_number = 10; + string request_payer = 11; + string sse_customer_algorithm = 12; + string sse_customer_key = 13; + string sse_customer_key_md5 = 14; + string version_id = 15; +} +message HeadObjectOutput{ + // Metadata pertaining to the operation's result. + map ResultMetadata = 1; +} + +message IsObjectExistInput{ + string store_name = 1; + string bucket = 2; + string key = 3; +} +message IsObjectExistOutput{ + bool file_exist = 1; } \ No newline at end of file From b12f817bbb7285ffa006e2c0b12a136d58f92d97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 14 Jun 2022 18:03:08 +0800 Subject: [PATCH 018/126] add SignURL UpdateDownLoadBandwidthRateLimit UpdateUpLoadBandwidthRateLimit AppendObject ListParts interface --- components/file/aliyun/option.go | 5 + components/file/aliyun/oss.go | 137 +- components/file/aws/oss.go | 19 + components/file/s3def.go | 127 +- components/go.mod | 3 +- components/go.sum | 4 +- demo/file/s3/client.go | 23 +- go.sum | 1 + pkg/grpc/extension/s3/s3.go | 110 ++ spec/proto/extension/v1/s3.pb.go | 2358 +++++++++++++++++++++++------- spec/proto/extension/v1/s3.proto | 91 +- 11 files changed, 2266 insertions(+), 612 deletions(-) diff --git a/components/file/aliyun/option.go b/components/file/aliyun/option.go index 2586360e83..08455a62f7 100644 --- a/components/file/aliyun/option.go +++ b/components/file/aliyun/option.go @@ -220,6 +220,11 @@ func MetadataDirective(value string) oss.Option { return oss.MetadataDirective(oss.MetadataDirectiveType(value)) } +// Meta is an option to set Meta header +func Meta(key, value string) oss.Option { + return oss.Meta(key, value) +} + // ServerSideEncryption is an option to set X-Oss-Server-Side-Encryption header func ServerSideEncryption(value string) oss.Option { if value == "" { diff --git a/components/file/aliyun/oss.go b/components/file/aliyun/oss.go index 026535bc61..9d3c1aa7bf 100644 --- a/components/file/aliyun/oss.go +++ b/components/file/aliyun/oss.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "io" + "net/http" "github.com/aliyun/aliyun-oss-go-sdk/oss" "mosn.io/layotto/components/file" @@ -73,6 +74,11 @@ func (a *AliyunOSS) GetObject(ctx context.Context, req *file.GetObjectInput) (io if err != nil { return nil, err } + //user can use SignedUrl to get file without ak、sk + if req.SignedUrl != "" { + body, err := bucket.GetObjectWithURL(req.SignedUrl) + return body, err + } body, err := bucket.GetObject(req.Key, IfUnmodifiedSince(req.IfUnmodifiedSince), IfModifiedSince(req.IfModifiedSince), @@ -105,10 +111,16 @@ func (a *AliyunOSS) PutObject(ctx context.Context, req *file.PutObjectInput) (*f o := oss.Meta(k, v) metaOption = append(metaOption, o) } - - err = bucket.PutObject(req.Key, req.DataStream, - metaOption..., - ) + //user can use SignedUrl to put file without ak、sk + if req.SignedUrl != "" { + err = bucket.PutObjectWithURL(req.SignedUrl, req.DataStream, + metaOption..., + ) + } else { + err = bucket.PutObject(req.Key, req.DataStream, + metaOption..., + ) + } return &file.PutObjectOutput{}, err } @@ -121,7 +133,7 @@ func (a *AliyunOSS) DeleteObject(ctx context.Context, req *file.DeleteObjectInpu if err != nil { return nil, err } - err = bucket.DeleteObject(req.Key, RequestPayer(req.RequestPayer)) + err = bucket.DeleteObject(req.Key, RequestPayer(req.RequestPayer), VersionId(req.VersionId)) return &file.DeleteObjectOutput{}, err } func (a *AliyunOSS) DeleteObjects(ctx context.Context, req *file.DeleteObjectsInput) (*file.DeleteObjectsOutput, error) { @@ -133,17 +145,18 @@ func (a *AliyunOSS) DeleteObjects(ctx context.Context, req *file.DeleteObjectsIn if err != nil { return nil, err } - var objects []string + var objects []oss.DeleteObject for _, v := range req.Delete.Objects { - objects = append(objects, v.Key) + object := oss.DeleteObject{Key: v.Key, VersionId: v.VersionId} + objects = append(objects, object) } - resp, err := bucket.DeleteObjects(objects, oss.DeleteObjectsQuiet(req.Delete.Quiet)) + resp, err := bucket.DeleteObjectVersions(objects, oss.DeleteObjectsQuiet(req.Delete.Quiet)) if err != nil { return nil, err } out := &file.DeleteObjectsOutput{} - for _, v := range resp.DeletedObjects { - object := &file.DeletedObject{Key: v} + for _, v := range resp.DeletedObjectsDetail { + object := &file.DeletedObject{Key: v.Key, VersionId: v.VersionId, DeleteMarker: v.DeleteMarker, DeleteMarkerVersionId: v.DeleteMarkerVersionId} out.Deleted = append(out.Deleted, object) } return out, err @@ -275,7 +288,14 @@ func (a *AliyunOSS) CopyObject(ctx context.Context, req *file.CopyObjectInput) ( if err != nil { return nil, err } - resp, err := bucket.CopyObject(req.CopySource.CopySourceKey, req.Key, VersionId(req.CopySource.CopySourceVersionId)) + var options []oss.Option + for k, v := range req.Metadata { + option := Meta(k, v) + options = append(options, option) + } + options = append(options, MetadataDirective(req.MetadataDirective)) + options = append(options, VersionId(req.CopySource.CopySourceVersionId)) + resp, err := bucket.CopyObject(req.CopySource.CopySourceKey, req.Key, options...) if err != nil { return nil, err } @@ -482,11 +502,16 @@ func (a *AliyunOSS) HeadObject(ctx context.Context, req *file.HeadObjectInput) ( if err != nil { return nil, err } - resp, err := bucket.GetObjectMeta(req.Key) + output := &file.HeadObjectOutput{ResultMetadata: map[string]string{}} + var resp http.Header + if req.WithDetails { + resp, err = bucket.GetObjectDetailedMeta(req.Key) + } else { + resp, err = bucket.GetObjectMeta(req.Key) + } if err != nil { return nil, err } - output := &file.HeadObjectOutput{ResultMetadata: map[string]string{}} for k, v := range resp { for _, t := range v { //if key exist,concatenated with commas @@ -512,3 +537,89 @@ func (a *AliyunOSS) IsObjectExist(ctx context.Context, req *file.IsObjectExistIn resp, err := bucket.IsObjectExist(req.Key) return &file.IsObjectExistOutput{FileExist: resp}, err } + +func (a *AliyunOSS) SignURL(ctx context.Context, req *file.SignURLInput) (*file.SignURLOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + resp, err := bucket.SignURL(req.Key, oss.HTTPMethod(req.Method), req.ExpiredInSec) + return &file.SignURLOutput{SignedUrl: resp}, err +} + +func (a *AliyunOSS) UpdateDownLoadBandwidthRateLimit(ctx context.Context, req *file.UpdateBandwidthRateLimitInput) error { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return err + } + err = cli.LimitDownloadSpeed(int(req.AverageRateLimitInBitsPerSec)) + return err +} + +func (a *AliyunOSS) UpdateUpLoadBandwidthRateLimit(ctx context.Context, req *file.UpdateBandwidthRateLimitInput) error { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return err + } + err = cli.LimitUploadSpeed(int(req.AverageRateLimitInBitsPerSec)) + return err +} + +func (a *AliyunOSS) AppendObject(ctx context.Context, req *file.AppendObjectInput) (*file.AppendObjectOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + resp, err := bucket.AppendObject(req.Key, req.DataStream, req.Position, + CacheControl(req.CacheControl), + ContentDisposition(req.ContentDisposition), + ContentEncoding(req.ContentEncoding), + Expires(req.Expires), + ServerSideEncryption(req.ServerSideEncryption), + ObjectACL(req.ACL), + ) + if err != nil { + return nil, err + } + return &file.AppendObjectOutput{AppendPosition: resp}, err +} + +func (a *AliyunOSS) ListParts(ctx context.Context, req *file.ListPartsInput) (*file.ListPartsOutput, error) { + cli, err := a.selectClient(map[string]string{}, endpointKey) + if err != nil { + return nil, err + } + bucket, err := cli.Bucket(req.Bucket) + if err != nil { + return nil, err + } + resp, err := bucket.ListUploadedParts(oss.InitiateMultipartUploadResult{Bucket: req.Bucket, Key: req.Key, UploadID: req.UploadId}, + MaxParts(int(req.MaxParts)), + PartNumberMarker(int(req.PartNumberMarker)), + RequestPayer(req.RequestPayer), + ) + if err != nil { + return nil, err + } + out := &file.ListPartsOutput{ + Bucket: resp.Bucket, + Key: resp.Key, + UploadId: resp.UploadID, + NextPartNumberMarker: resp.NextPartNumberMarker, + MaxParts: int64(resp.MaxParts), + IsTruncated: resp.IsTruncated, + } + for _, v := range resp.UploadedParts { + part := &file.Part{Etag: v.ETag, LastModified: v.LastModified.Unix(), PartNumber: int64(v.PartNumber), Size: int64(v.Size)} + out.Parts = append(out.Parts, part) + } + return out, err +} diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index adeb3966d8..bb77070c26 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -606,3 +606,22 @@ func (a *AwsOss) HeadObject(ctx context.Context, req *file.HeadObjectInput) (*fi func (a *AwsOss) IsObjectExist(context.Context, *file.IsObjectExistInput) (*file.IsObjectExistOutput, error) { return nil, nil } + +func (a *AwsOss) SignURL(ctx context.Context, req *file.SignURLInput) (*file.SignURLOutput, error) { + return nil, nil +} + +func (a *AwsOss) UpdateDownLoadBandwidthRateLimit(ctx context.Context, req *file.UpdateBandwidthRateLimitInput) error { + return nil +} + +func (a *AwsOss) UpdateUpLoadBandwidthRateLimit(ctx context.Context, req *file.UpdateBandwidthRateLimitInput) error { + return nil +} +func (a *AwsOss) AppendObject(ctx context.Context, req *file.AppendObjectInput) (*file.AppendObjectOutput, error) { + return nil, nil +} + +func (a *AwsOss) ListParts(ctx context.Context, req *file.ListPartsInput) (*file.ListPartsOutput, error) { + return nil, nil +} diff --git a/components/file/s3def.go b/components/file/s3def.go index fee303644a..4710f94a58 100644 --- a/components/file/s3def.go +++ b/components/file/s3def.go @@ -50,6 +50,11 @@ type Oss interface { ListObjectVersions(context.Context, *ListObjectVersionsInput) (*ListObjectVersionsOutput, error) HeadObject(context.Context, *HeadObjectInput) (*HeadObjectOutput, error) IsObjectExist(context.Context, *IsObjectExistInput) (*IsObjectExistOutput, error) + SignURL(context.Context, *SignURLInput) (*SignURLOutput, error) + UpdateDownLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) error + UpdateUpLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) error + AppendObject(context.Context, *AppendObjectInput) (*AppendObjectOutput, error) + ListParts(context.Context, *ListPartsInput) (*ListPartsOutput, error) } type BaseConfig struct { @@ -82,12 +87,12 @@ type GetObjectInput struct { SseCustomerKeyMd5 string `protobuf:"bytes,21,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` VersionId string `protobuf:"bytes,22,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` AcceptEncoding string `protobuf:"bytes,23,opt,name=accept_encoding,json=acceptEncoding,proto3" json:"accept_encoding,omitempty"` + SignedUrl string `protobuf:"bytes,24,opt,name=signed_url,json=signedUrl,proto3" json:"signed_url,omitempty"` } type PutObjectInput struct { DataStream io.Reader ACL string `protobuf:"bytes,2,opt,name=acl,proto3" json:"acl,omitempty"` - Body []byte `protobuf:"bytes,3,opt,name=body,proto3" json:"body,omitempty"` Bucket string `protobuf:"bytes,4,opt,name=bucket,proto3" json:"bucket,omitempty"` Key string `protobuf:"bytes,5,opt,name=key,proto3" json:"key,omitempty"` BucketKeyEnabled bool `protobuf:"varint,6,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` @@ -96,7 +101,8 @@ type PutObjectInput struct { ContentEncoding string `protobuf:"bytes,9,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` Expires int64 `protobuf:"varint,10,opt,name=expires,proto3" json:"expires,omitempty"` ServerSideEncryption string `protobuf:"bytes,11,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` - Meta map[string]string `protobuf:"bytes,12,rep,name=meta,proto3" json:"meta,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + SignedUrl string `protobuf:"bytes,12,opt,name=signed_url,json=signedUrl,proto3" json:"signed_url,omitempty"` + 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"` } type PutObjectOutput struct { @@ -105,9 +111,10 @@ type PutObjectOutput struct { } type DeleteObjectInput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - RequestPayer string `protobuf:"bytes,4,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` + RequestPayer string `json:"request_payer,omitempty"` + VersionId string `json:"version_id,omitempty"` } type DeleteObjectOutput struct { DeleteMarker bool `protobuf:"varint,1,opt,name=delete_marker,json=deleteMarker,proto3" json:"delete_marker,omitempty"` @@ -147,10 +154,15 @@ type CopySource struct { } type CopyObjectInput struct { - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` CopySource *CopySource `protobuf:"bytes,4,opt,name=copy_source,json=copySource,proto3" json:"copy_source,omitempty"` + Tagging string `json:"tagging,omitempty"` + Expires int64 `json:"expires,omitempty"` + // Specifies whether the metadata is copied from the source object or replaced with metadata provided in the request. + MetadataDirective string `json:"metadata_directive,omitempty"` + // A map of metadata to store with the object in S3. + Metadata map[string]string `json:"metadata,omitempty"` } type CopyObjectOutput struct { CopyObjectResult *CopyObjectResult `protobuf:"bytes,1,opt,name=CopyObjectResult,proto3" json:"CopyObjectResult,omitempty"` @@ -383,7 +395,7 @@ type CompleteMultipartUploadOutput struct { } type AbortMultipartUploadInput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Bucket string `json:"bucket,omitempty"` Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` ExpectedBucketOwner string `protobuf:"bytes,3,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` RequestPayer string `protobuf:"bytes,4,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` @@ -474,30 +486,95 @@ type ObjectVersion struct { } type HeadObjectInput struct { - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - ChecksumMode string `protobuf:"bytes,4,opt,name=checksum_mode,json=checksumMode,proto3" json:"checksum_mode,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - IfMatch string `protobuf:"bytes,6,opt,name=if_match,json=ifMatch,proto3" json:"if_match,omitempty"` - IfModifiedSince int64 `protobuf:"varint,7,opt,name=if_modified_since,json=ifModifiedSince,proto3" json:"if_modified_since,omitempty"` - IfNoneMatch string `protobuf:"bytes,8,opt,name=if_none_match,json=ifNoneMatch,proto3" json:"if_none_match,omitempty"` - IfUnmodifiedSince int64 `protobuf:"varint,9,opt,name=if_unmodified_since,json=ifUnmodifiedSince,proto3" json:"if_unmodified_since,omitempty"` - PartNumber int32 `protobuf:"varint,10,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` - RequestPayer string `protobuf:"bytes,11,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - SseCustomerAlgorithm string `protobuf:"bytes,12,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - SseCustomerKey string `protobuf:"bytes,13,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` - SseCustomerKeyMd5 string `protobuf:"bytes,14,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - VersionId string `protobuf:"bytes,15,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` + ChecksumMode string `json:"checksum_mode,omitempty"` + ExpectedBucketOwner string `json:"expected_bucket_owner,omitempty"` + IfMatch string `json:"if_match,omitempty"` + IfModifiedSince int64 `json:"if_modified_since,omitempty"` + IfNoneMatch string `json:"if_none_match,omitempty"` + IfUnmodifiedSince int64 `json:"if_unmodified_since,omitempty"` + PartNumber int32 `json:"part_number,omitempty"` + RequestPayer string `json:"request_payer,omitempty"` + SseCustomerAlgorithm string `json:"sse_customer_algorithm,omitempty"` + SseCustomerKey string `json:"sse_customer_key,omitempty"` + SseCustomerKeyMd5 string `json:"sse_customer_key_md5,omitempty"` + VersionId string `json:"version_id,omitempty"` + WithDetails bool `json:"with_details,omitempty"` } type HeadObjectOutput struct { // Metadata pertaining to the operation's result. - ResultMetadata map[string]string `protobuf:"bytes,1,rep,name=ResultMetadata,proto3" json:"ResultMetadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ResultMetadata map[string]string `json:"ResultMetadata,omitempty"` } type IsObjectExistInput struct { - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` } type IsObjectExistOutput struct { - FileExist bool `protobuf:"varint,1,opt,name=file_exist,json=fileExist,proto3" json:"file_exist,omitempty"` + FileExist bool `json:"file_exist,omitempty"` +} + +type SignURLInput struct { + StoreName string `json:"store_name,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` + Method string `json:"method,omitempty"` + ExpiredInSec int64 `json:"expired_in_sec,omitempty"` +} +type SignURLOutput struct { + SignedUrl string `json:"signed_url,omitempty"` +} + +type UpdateBandwidthRateLimitInput struct { + // The average upload/download bandwidth rate limit in bits per second. + AverageRateLimitInBitsPerSec int64 `json:"average_rate_limit_in_bits_per_sec,omitempty"` + //Resource name of gateway + GatewayResourceName string `json:"gateway_resource_name,omitempty"` +} + +type AppendObjectInput struct { + DataStream io.Reader + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` + Position int64 `json:"position,omitempty"` + ACL string `json:"acl,omitempty"` + CacheControl string `json:"cache_control,omitempty"` + ContentDisposition string `json:"content_disposition,omitempty"` + ContentEncoding string `json:"content_encoding,omitempty"` + ContentMd5 string `json:"content_md5,omitempty"` + Expires int64 `json:"expires,omitempty"` + StorageClass string `json:"storage_class,omitempty"` + ServerSideEncryption string `json:"server_side_encryption,omitempty"` + Meta string `json:"meta,omitempty"` + Tags map[string]string `json:"tags,omitempty"` +} +type AppendObjectOutput struct { + AppendPosition int64 `json:"append_position,omitempty"` +} + +type ListPartsInput struct { + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` + ExpectedBucketOwner string `json:"expected_bucket_owner,omitempty"` + MaxParts int64 `json:"max_parts,omitempty"` + PartNumberMarker int64 `json:"part_number_marker,omitempty"` + RequestPayer string `json:"request_payer,omitempty"` + UploadId string `json:"upload_id,omitempty"` +} +type ListPartsOutput struct { + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` + UploadId string `json:"upload_id,omitempty"` + NextPartNumberMarker string `json:"next_part_number_marker,omitempty"` + MaxParts int64 `json:"max_parts,omitempty"` + IsTruncated bool `json:"is_truncated,omitempty"` + Parts []*Part `json:"parts,omitempty"` +} + +type Part struct { + Etag string `json:"etag,omitempty"` + LastModified int64 `json:"last_modified,omitempty"` + PartNumber int64 `json:"part_number,omitempty"` + Size int64 `json:"size,omitempty"` } diff --git a/components/go.mod b/components/go.mod index 7facad7796..0856b4f65c 100644 --- a/components/go.mod +++ b/components/go.mod @@ -4,7 +4,7 @@ go 1.14 require ( github.com/alicebob/miniredis/v2 v2.16.0 - github.com/aliyun/aliyun-oss-go-sdk v2.1.8+incompatible + github.com/aliyun/aliyun-oss-go-sdk v2.2.0+incompatible github.com/apache/dubbo-go-hessian2 v1.7.0 github.com/aws/aws-sdk-go-v2 v1.16.4 github.com/aws/aws-sdk-go-v2/config v1.15.9 @@ -38,7 +38,6 @@ require ( golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5 // indirect google.golang.org/grpc v1.38.0 - google.golang.org/protobuf v1.26.0 mosn.io/api v0.0.0-20211217011300-b851d129be01 mosn.io/mosn v0.25.1-0.20211217125944-69b50c40af81 mosn.io/pkg v0.0.0-20211217101631-d914102d1baf diff --git a/components/go.sum b/components/go.sum index 34e040a5dd..a26066fe48 100644 --- a/components/go.sum +++ b/components/go.sum @@ -69,8 +69,8 @@ github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGn github.com/alicebob/miniredis/v2 v2.16.0 h1:ALkyFg7bSTEd1Mkrb4ppq4fnwjklA59dVtIehXCUZkU= github.com/alicebob/miniredis/v2 v2.16.0/go.mod h1:gquAfGbzn92jvtrSC69+6zZnwSODVXVpYDRaGhWaL6I= github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk= -github.com/aliyun/aliyun-oss-go-sdk v2.1.8+incompatible h1:hLUNPbx10wawWW7DeNExvTrlb90db3UnnNTFKHZEFhE= -github.com/aliyun/aliyun-oss-go-sdk v2.1.8+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= +github.com/aliyun/aliyun-oss-go-sdk v2.2.0+incompatible h1:ht2+VfbXtNLGhCsnTMc6/N26nSTBK6qdhktjYyjJQkk= +github.com/aliyun/aliyun-oss-go-sdk v2.2.0+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/andybalholm/brotli v1.0.2 h1:JKnhI/XQ75uFBTiuzXpzFrUriDPiZjlOSzh6wXogP0E= github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= diff --git a/demo/file/s3/client.go b/demo/file/s3/client.go index e3dc45cda3..14e2a0c38e 100644 --- a/demo/file/s3/client.go +++ b/demo/file/s3/client.go @@ -4,9 +4,10 @@ import ( "bufio" "context" "fmt" - s3 "mosn.io/layotto/spec/proto/extension/v1" "os" + s3 "mosn.io/layotto/spec/proto/extension/v1" + "google.golang.org/grpc" ) @@ -350,6 +351,23 @@ func TestRestore() { } +func TestObjectExist() { + conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) + if err != nil { + fmt.Printf("conn build failed,err:%+v", err) + return + } + c := s3.NewS3Client(conn) + req := &s3.IsObjectExistInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "client"} + resp, err := c.IsObjectExist(context.Background(), req) + if err != nil { + fmt.Printf("TestObjectExist fail, err: %+v \n", err) + return + } + fmt.Printf("TestObjectExist success, resp: %+v\n", resp.FileExist) + +} + func main() { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { @@ -404,4 +422,7 @@ func main() { if os.Args[1] == "restore" { TestRestore() } + if os.Args[1] == "exist" { + TestObjectExist() + } } diff --git a/go.sum b/go.sum index 87ca2c6a34..9b5208226f 100644 --- a/go.sum +++ b/go.sum @@ -177,6 +177,7 @@ github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDH github.com/aliyun/aliyun-oss-go-sdk v2.0.7+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/aliyun/aliyun-oss-go-sdk v2.1.8+incompatible h1:hLUNPbx10wawWW7DeNExvTrlb90db3UnnNTFKHZEFhE= github.com/aliyun/aliyun-oss-go-sdk v2.1.8+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= +github.com/aliyun/aliyun-oss-go-sdk v2.2.0+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/aliyun/aliyun-tablestore-go-sdk v1.6.0/go.mod h1:jixoiNNRR/4ziq0yub1fTlxmDcQwlpkaujpaWIATQWM= github.com/aliyunmq/mq-http-go-sdk v1.0.3/go.mod h1:JYfRMQoPexERvnNNBcal0ZQ2TVQ5ialDiW9ScjaadEM= github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go index b49526ceaf..4aee88a131 100644 --- a/pkg/grpc/extension/s3/s3.go +++ b/pkg/grpc/extension/s3/s3.go @@ -625,3 +625,113 @@ func (s *S3Server) IsObjectExist(ctx context.Context, req *s3.IsObjectExistInput return output, nil } } + +func (s *S3Server) SignURL(ctx context.Context, req *s3.SignURLInput) (*s3.SignURLOutput, error) { + if s.ossInstance[req.StoreName] == nil { + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) + } + st := &l8s3.SignURLInput{} + err := transferData(req, st) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for SignURL,err: %+v", err) + } + if resp, err := s.ossInstance[req.StoreName].SignURL(ctx, st); err != nil { + return nil, status.Errorf(codes.Internal, err.Error()) + } else { + output := &s3.SignURLOutput{} + output.SignedUrl = resp.SignedUrl + return output, nil + } +} + +func (s *S3Server) UpdateDownLoadBandwidthRateLimit(ctx context.Context, req *s3.UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { + if s.ossInstance[req.StoreName] == nil { + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) + } + st := &l8s3.UpdateBandwidthRateLimitInput{} + err := transferData(req, st) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for UpdateDownLoadBandwidthRateLimit,err: %+v", err) + } + if err := s.ossInstance[req.StoreName].UpdateDownLoadBandwidthRateLimit(ctx, st); err != nil { + return nil, status.Errorf(codes.Internal, err.Error()) + } + return &emptypb.Empty{}, nil +} + +func (s *S3Server) UpdateUpLoadBandwidthRateLimit(ctx context.Context, req *s3.UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { + if s.ossInstance[req.StoreName] == nil { + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) + } + st := &l8s3.UpdateBandwidthRateLimitInput{} + err := transferData(req, st) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for UpdateUpLoadBandwidthRateLimit,err: %+v", err) + } + if err := s.ossInstance[req.StoreName].UpdateUpLoadBandwidthRateLimit(ctx, st); err != nil { + return nil, status.Errorf(codes.Internal, err.Error()) + } + return &emptypb.Empty{}, nil +} + +type appendObjectStreamReader struct { + data []byte + server s3.S3_AppendObjectServer +} + +func newAppendObjectStreamReader(data []byte, server s3.S3_AppendObjectServer) *appendObjectStreamReader { + return &appendObjectStreamReader{data: data, server: server} +} + +func (r *appendObjectStreamReader) Read(p []byte) (int, error) { + var count int + total := len(p) + for { + if len(r.data) > 0 { + n := copy(p[count:], r.data) + r.data = r.data[n:] + count += n + if count == total { + return count, nil + } + } + req, err := r.server.Recv() + if err != nil { + if err != io.EOF { + log.DefaultLogger.Errorf("recv data from grpc stream fail, err:%+v", err) + } + return count, err + } + r.data = req.Body + } +} + +func (s *S3Server) AppendObject(stream s3.S3_AppendObjectServer) error { + req, err := stream.Recv() + if err != nil { + //if client send eof error directly, return nil + if err == io.EOF { + return nil + } + return status.Errorf(codes.Internal, "receive file data fail: err: %+v", err) + } + + if s.ossInstance[req.StoreName] == nil { + return status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) + } + fileReader := newAppendObjectStreamReader(req.Body, stream) + + st := &l8s3.AppendObjectInput{} + err = transferData(req, st) + if err != nil { + return status.Errorf(codes.InvalidArgument, "transfer request data fail for AppendObject,err: %+v", err) + } + st.DataStream = fileReader + if resp, err := s.ossInstance[req.StoreName].AppendObject(stream.Context(), st); err != nil { + return status.Errorf(codes.Internal, err.Error()) + } else { + output := &s3.AppendObjectOutput{} + output.AppendPosition = resp.AppendPosition + return stream.SendAndClose(output) + } +} diff --git a/spec/proto/extension/v1/s3.pb.go b/spec/proto/extension/v1/s3.pb.go index fcd1edf6a3..f1074545f5 100644 --- a/spec/proto/extension/v1/s3.pb.go +++ b/spec/proto/extension/v1/s3.pb.go @@ -113,6 +113,7 @@ type GetObjectInput struct { SseCustomerKeyMd5 string `protobuf:"bytes,21,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` VersionId string `protobuf:"bytes,22,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` AcceptEncoding string `protobuf:"bytes,23,opt,name=accept_encoding,json=acceptEncoding,proto3" json:"accept_encoding,omitempty"` + SignedUrl string `protobuf:"bytes,24,opt,name=signed_url,json=signedUrl,proto3" json:"signed_url,omitempty"` } func (x *GetObjectInput) Reset() { @@ -308,6 +309,13 @@ func (x *GetObjectInput) GetAcceptEncoding() string { return "" } +func (x *GetObjectInput) GetSignedUrl() string { + if x != nil { + return x.SignedUrl + } + return "" +} + type GetObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -371,7 +379,8 @@ type PutObjectInput struct { ContentEncoding string `protobuf:"bytes,9,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` Expires int64 `protobuf:"varint,10,opt,name=expires,proto3" json:"expires,omitempty"` ServerSideEncryption string `protobuf:"bytes,11,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` - Meta map[string]string `protobuf:"bytes,12,rep,name=meta,proto3" json:"meta,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + SignedUrl string `protobuf:"bytes,12,opt,name=signed_url,json=signedUrl,proto3" json:"signed_url,omitempty"` + 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"` } func (x *PutObjectInput) Reset() { @@ -483,6 +492,13 @@ func (x *PutObjectInput) GetServerSideEncryption() string { return "" } +func (x *PutObjectInput) GetSignedUrl() string { + if x != nil { + return x.SignedUrl + } + return "" +} + func (x *PutObjectInput) GetMeta() map[string]string { if x != nil { return x.Meta @@ -554,6 +570,7 @@ type DeleteObjectInput struct { Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` RequestPayer string `protobuf:"bytes,4,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + VersionId string `protobuf:"bytes,5,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } func (x *DeleteObjectInput) Reset() { @@ -616,6 +633,13 @@ func (x *DeleteObjectInput) GetRequestPayer() string { return "" } +func (x *DeleteObjectInput) GetVersionId() string { + if x != nil { + return x.VersionId + } + return "" +} + type DeleteObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1088,6 +1112,12 @@ type CopyObjectInput struct { Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` CopySource *CopySource `protobuf:"bytes,4,opt,name=copy_source,json=copySource,proto3" json:"copy_source,omitempty"` + Tagging string `protobuf:"bytes,5,opt,name=tagging,proto3" json:"tagging,omitempty"` + Expires int64 `protobuf:"varint,6,opt,name=expires,proto3" json:"expires,omitempty"` + // Specifies whether the metadata is copied from the source object or replaced with metadata provided in the request. + MetadataDirective string `protobuf:"bytes,7,opt,name=metadata_directive,json=metadataDirective,proto3" json:"metadata_directive,omitempty"` + // A map of metadata to store with the object in S3. + Metadata map[string]string `protobuf:"bytes,8,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *CopyObjectInput) Reset() { @@ -1150,13 +1180,41 @@ func (x *CopyObjectInput) GetCopySource() *CopySource { return nil } +func (x *CopyObjectInput) GetTagging() string { + if x != nil { + return x.Tagging + } + return "" +} + +func (x *CopyObjectInput) GetExpires() int64 { + if x != nil { + return x.Expires + } + return 0 +} + +func (x *CopyObjectInput) GetMetadataDirective() string { + if x != nil { + return x.MetadataDirective + } + return "" +} + +func (x *CopyObjectInput) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + type CopyObjectResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` - LastModified int64 `protobuf:"varint,2,opt,name=LastModified,proto3" json:"LastModified,omitempty"` + LastModified int64 `protobuf:"varint,2,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` } func (x *CopyObjectResult) Reset() { @@ -4626,6 +4684,8 @@ type HeadObjectInput struct { SseCustomerKey string `protobuf:"bytes,13,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` SseCustomerKeyMd5 string `protobuf:"bytes,14,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` 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 *HeadObjectInput) Reset() { @@ -4765,6 +4825,13 @@ func (x *HeadObjectInput) GetVersionId() string { return "" } +func (x *HeadObjectInput) GetWithDetails() bool { + if x != nil { + return x.WithDetails + } + return false +} + type HeadObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4923,322 +4990,1009 @@ func (x *IsObjectExistOutput) GetFileExist() bool { return false } -var File_s3_proto protoreflect.FileDescriptor +type SignURLInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -var file_s3_proto_rawDesc = []byte{ - 0x0a, 0x08, 0x73, 0x33, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x6d, 0x6f, 0x73, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 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, 0xb3, - 0x01, 0x0a, 0x09, 0x49, 0x6e, 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, 0x4a, 0x0a, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, - 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x69, 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, 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, 0xbe, 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, 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, 0x03, 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, 0x04, - 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, 0x05, 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, 0x06, 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, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x69, 0x66, 0x55, 0x6e, - 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x65, 0x72, 0x12, 0x34, 0x0a, - 0x16, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x12, 0x40, 0x0a, 0x1c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, - 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, - 0x67, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, - 0x15, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x65, 0x78, - 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 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, 0x13, 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, 0x14, 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, 0x15, 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, 0x16, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, - 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, - 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x25, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0xfc, 0x03, 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, 0x10, - 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x63, 0x6c, - 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x62, 0x6f, 0x64, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x05, 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, 0x06, 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, 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, 0x43, 0x0a, - 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6d, 0x6f, - 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 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, 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, 0x22, 0x53, 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, - 0x22, 0x81, 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, 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, 0x84, 0x02, 0x0a, 0x15, 0x50, 0x75, 0x74, - 0x42, 0x75, 0x63, 0x6b, 0x65, 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, 0x4a, 0x0a, 0x04, 0x74, - 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 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, - 0x18, 0x0a, 0x16, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, - 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x63, 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, 0x22, 0x3a, - 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, 0x22, 0x60, 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, 0x22, 0x9e, 0x01, 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, 0x4b, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 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, 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, 0x9e, 0x01, 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, 0x42, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0a, 0x63, 0x6f, - 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x4a, 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, 0x22, 0x0a, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x69, 0x65, 0x64, 0x22, 0x67, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x53, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x10, 0x43, 0x6f, 0x70, - 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x61, 0x0a, - 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x41, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 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, 0xa7, 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, 0x35, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x55, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x3e, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 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, 0xdd, 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, 0x39, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 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, 0xc0, 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, 0x32, 0x0a, 0x05, 0x6f, - 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 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, 0x87, 0x01, 0x0a, 0x07, 0x47, 0x72, 0x61, - 0x6e, 0x74, 0x65, 0x65, 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, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, - 0x72, 0x69, 0x22, 0x61, 0x0a, 0x05, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x67, - 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, - 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x52, 0x07, 0x67, 0x72, + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + Method string `protobuf:"bytes,4,opt,name=method,proto3" json:"method,omitempty"` + ExpiredInSec int64 `protobuf:"varint,5,opt,name=expired_in_sec,json=expiredInSec,proto3" json:"expired_in_sec,omitempty"` +} + +func (x *SignURLInput) Reset() { + *x = SignURLInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignURLInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignURLInput) ProtoMessage() {} + +func (x *SignURLInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[59] + 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 SignURLInput.ProtoReflect.Descriptor instead. +func (*SignURLInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{59} +} + +func (x *SignURLInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *SignURLInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *SignURLInput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *SignURLInput) GetMethod() string { + if x != nil { + return x.Method + } + return "" +} + +func (x *SignURLInput) GetExpiredInSec() int64 { + if x != nil { + return x.ExpiredInSec + } + return 0 +} + +type SignURLOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SignedUrl string `protobuf:"bytes,1,opt,name=signed_url,json=signedUrl,proto3" json:"signed_url,omitempty"` +} + +func (x *SignURLOutput) Reset() { + *x = SignURLOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignURLOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignURLOutput) ProtoMessage() {} + +func (x *SignURLOutput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[60] + 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 SignURLOutput.ProtoReflect.Descriptor instead. +func (*SignURLOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{60} +} + +func (x *SignURLOutput) GetSignedUrl() string { + if x != nil { + return x.SignedUrl + } + return "" +} + +type UpdateBandwidthRateLimitInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + 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 *UpdateBandwidthRateLimitInput) Reset() { + *x = UpdateBandwidthRateLimitInput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateBandwidthRateLimitInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateBandwidthRateLimitInput) ProtoMessage() {} + +func (x *UpdateBandwidthRateLimitInput) ProtoReflect() protoreflect.Message { + mi := &file_s3_proto_msgTypes[61] + 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 UpdateBandwidthRateLimitInput.ProtoReflect.Descriptor instead. +func (*UpdateBandwidthRateLimitInput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{61} +} + +func (x *UpdateBandwidthRateLimitInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *UpdateBandwidthRateLimitInput) GetAverageRateLimitInBitsPerSec() int64 { + if x != nil { + return x.AverageRateLimitInBitsPerSec + } + return 0 +} + +func (x *UpdateBandwidthRateLimitInput) GetGatewayResourceName() string { + if x != nil { + return x.GatewayResourceName + } + return "" +} + +type AppendObjectInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + Body []byte `protobuf:"bytes,4,opt,name=body,proto3" json:"body,omitempty"` + Position int64 `protobuf:"varint,5,opt,name=position,proto3" json:"position,omitempty"` + Acl string `protobuf:"bytes,6,opt,name=acl,proto3" json:"acl,omitempty"` + CacheControl string `protobuf:"bytes,7,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` + ContentDisposition string `protobuf:"bytes,8,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` + ContentEncoding string `protobuf:"bytes,9,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` + ContentMd5 string `protobuf:"bytes,10,opt,name=content_md5,json=contentMd5,proto3" json:"content_md5,omitempty"` + Expires int64 `protobuf:"varint,11,opt,name=expires,proto3" json:"expires,omitempty"` + StorageClass string `protobuf:"bytes,12,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` + ServerSideEncryption string `protobuf:"bytes,13,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` + Meta string `protobuf:"bytes,14,opt,name=meta,proto3" json:"meta,omitempty"` + 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_s3_proto_msgTypes[62] + 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_s3_proto_msgTypes[62] + 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_s3_proto_rawDescGZIP(), []int{62} +} + +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 +} + +type AppendObjectOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + 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_s3_proto_msgTypes[63] + 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_s3_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 mi.MessageOf(x) +} + +// Deprecated: Use AppendObjectOutput.ProtoReflect.Descriptor instead. +func (*AppendObjectOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{63} +} + +func (x *AppendObjectOutput) GetAppendPosition() int64 { + if x != nil { + return x.AppendPosition + } + return 0 +} + +type ListPartsInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,4,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + MaxParts int64 `protobuf:"varint,5,opt,name=max_parts,json=maxParts,proto3" json:"max_parts,omitempty"` + PartNumberMarker int64 `protobuf:"varint,6,opt,name=part_number_marker,json=partNumberMarker,proto3" json:"part_number_marker,omitempty"` + RequestPayer string `protobuf:"bytes,7,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + 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_s3_proto_msgTypes[64] + 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_s3_proto_msgTypes[64] + 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_s3_proto_rawDescGZIP(), []int{64} +} + +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 "" +} + +type Part struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` + LastModified int64 `protobuf:"varint,2,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` + PartNumber int64 `protobuf:"varint,3,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + Size int64 `protobuf:"varint,4,opt,name=size,proto3" json:"size,omitempty"` +} + +func (x *Part) Reset() { + *x = Part{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[65] + 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_s3_proto_msgTypes[65] + 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_s3_proto_rawDescGZIP(), []int{65} +} + +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 +} + +type ListPartsOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + UploadId string `protobuf:"bytes,3,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + NextPartNumberMarker string `protobuf:"bytes,4,opt,name=next_part_number_marker,json=nextPartNumberMarker,proto3" json:"next_part_number_marker,omitempty"` + MaxParts int64 `protobuf:"varint,5,opt,name=max_parts,json=maxParts,proto3" json:"max_parts,omitempty"` + IsTruncated bool `protobuf:"varint,6,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` + Parts []*Part `protobuf:"bytes,7,rep,name=parts,proto3" json:"parts,omitempty"` +} + +func (x *ListPartsOutput) Reset() { + *x = ListPartsOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_s3_proto_msgTypes[66] + 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_s3_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 mi.MessageOf(x) +} + +// Deprecated: Use ListPartsOutput.ProtoReflect.Descriptor instead. +func (*ListPartsOutput) Descriptor() ([]byte, []int) { + return file_s3_proto_rawDescGZIP(), []int{66} +} + +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_s3_proto protoreflect.FileDescriptor + +var file_s3_proto_rawDesc = []byte{ + 0x0a, 0x08, 0x73, 0x33, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x6d, 0x6f, 0x73, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 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, 0xb3, + 0x01, 0x0a, 0x09, 0x49, 0x6e, 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, 0x4a, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, + 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x69, 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, 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, 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, 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, 0x03, 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, 0x04, + 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, 0x05, 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, 0x06, 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, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x69, 0x66, 0x55, 0x6e, + 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x65, 0x72, 0x12, 0x34, 0x0a, + 0x16, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x12, 0x40, 0x0a, 0x1c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, + 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, + 0x67, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, + 0x15, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 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, 0x13, 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, 0x14, 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, 0x15, 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, 0x16, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, + 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, + 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, + 0x75, 0x72, 0x6c, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x55, 0x72, 0x6c, 0x22, 0x25, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x9b, 0x04, 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, 0x10, 0x0a, + 0x03, 0x61, 0x63, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x12, + 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, + 0x6f, 0x64, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x05, 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, 0x06, 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, 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, 0x43, 0x0a, 0x04, 0x6d, + 0x65, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 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, + 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, 0x22, 0x53, 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, 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, 0x84, 0x02, 0x0a, 0x15, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, + 0x6b, 0x65, 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, 0x4a, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 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, 0x18, 0x0a, 0x16, + 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x63, 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, 0x22, 0x3a, 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, 0x22, 0x60, 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, 0x22, 0x9e, 0x01, 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, 0x4b, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 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, 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, 0x03, 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, 0x42, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x70, 0x79, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 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, 0x50, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 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, 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, 0x67, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x53, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x10, 0x43, 0x6f, 0x70, + 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x61, 0x0a, + 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x41, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 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, 0xa7, 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, 0x35, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x55, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x3e, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 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, 0xdd, 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, 0x39, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 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, 0xc0, 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, 0x32, 0x0a, 0x05, 0x6f, + 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 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, 0x87, 0x01, 0x0a, 0x07, 0x47, 0x72, 0x61, + 0x6e, 0x74, 0x65, 0x65, 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, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, + 0x72, 0x69, 0x22, 0x61, 0x0a, 0x05, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x67, + 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, + 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x52, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5c, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, @@ -5726,7 +6480,7 @@ var file_s3_proto_rawDesc = []byte{ 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xc4, 0x04, 0x0a, 0x0f, 0x48, + 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, @@ -5763,181 +6517,322 @@ var file_s3_proto_rawDesc = []byte{ 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, 0x22, 0xba, 0x01, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x63, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, - 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x52, 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, 0x5d, - 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, 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, 0x32, 0xdc, 0x12, 0x0a, 0x02, 0x53, 0x33, 0x12, 0x48, 0x0a, 0x0a, 0x49, 0x6e, - 0x69, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x49, 0x6e, 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, 0x5e, 0x0a, 0x09, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, - 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x10, 0x50, - 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, - 0x2c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, + 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, 0xba, 0x01, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x63, 0x0a, 0x0e, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x3b, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, + 0x52, 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, 0x5d, 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, + 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, 0xca, 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, 0x46, 0x0a, 0x04, 0x74, 0x61, 0x67, + 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x82, 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, 0x31, + 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, - 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7a, - 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, - 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x71, 0x0a, 0x10, 0x47, 0x65, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2c, - 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x6d, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, + 0x73, 0x32, 0xe1, 0x16, 0x0a, 0x02, 0x53, 0x33, 0x12, 0x48, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, + 0x6e, 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, 0x5e, 0x0a, 0x09, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, + 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, + 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, + 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x65, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, + 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x10, 0x50, 0x75, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x2e, + 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, + 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x6d, 0x6f, + 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, + 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x13, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, + 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x71, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x5f, 0x0a, - 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, - 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, - 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, - 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, + 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x1a, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0c, - 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x12, 0x28, 0x2e, 0x6d, - 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, - 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x41, 0x63, 0x6c, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, + 0x76, 0x31, 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, 0x5f, 0x0a, 0x0a, 0x43, + 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0d, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, - 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0d, 0x52, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x29, 0x2e, 0x6d, 0x6f, - 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x22, 0x00, 0x12, 0x80, 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, 0x31, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x32, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x61, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x50, 0x61, 0x72, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, - 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6b, 0x0a, 0x0e, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x2e, 0x6d, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x47, 0x65, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, + 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, + 0x6c, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, + 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x12, 0x80, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, - 0x6f, 0x70, 0x79, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2b, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x86, 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, 0x33, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x34, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 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, 0x7d, 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, - 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x65, 0x2e, 0x76, 0x31, 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, + 0x32, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x61, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x61, 0x72, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x6f, + 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6b, 0x0a, 0x0e, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, + 0x79, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2b, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x86, 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, 0x33, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x34, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x7d, + 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, + 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 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, - 0x7d, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7d, 0x0a, + 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 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, 0x77, - 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x61, 0x64, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x77, 0x0a, 0x12, + 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x2e, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x5f, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x64, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x6f, + 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0d, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x12, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x73, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, + 0x12, 0x56, 0x0a, 0x07, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x12, 0x23, 0x2e, 0x6d, 0x6f, + 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x1a, 0x24, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x34, 0x2e, 0x6d, + 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 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, 0x70, 0x0a, 0x1e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x70, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x64, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x34, + 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x67, + 0x0a, 0x0c, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x28, + 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5c, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x50, + 0x61, 0x72, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x5f, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, - 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, - 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0d, 0x49, 0x73, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x12, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x73, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, + 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 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, + 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5952,7 +6847,7 @@ func file_s3_proto_rawDescGZIP() []byte { return file_s3_proto_rawDescData } -var file_s3_proto_msgTypes = make([]protoimpl.MessageInfo, 65) +var file_s3_proto_msgTypes = make([]protoimpl.MessageInfo, 75) var file_s3_proto_goTypes = []interface{}{ (*InitInput)(nil), // 0: mosn.proto.runtime.v1.InitInput (*GetObjectInput)(nil), // 1: mosn.proto.runtime.v1.GetObjectInput @@ -6013,91 +6908,114 @@ var file_s3_proto_goTypes = []interface{}{ (*HeadObjectOutput)(nil), // 56: mosn.proto.runtime.v1.HeadObjectOutput (*IsObjectExistInput)(nil), // 57: mosn.proto.runtime.v1.IsObjectExistInput (*IsObjectExistOutput)(nil), // 58: mosn.proto.runtime.v1.IsObjectExistOutput - nil, // 59: mosn.proto.runtime.v1.InitInput.MetadataEntry - nil, // 60: mosn.proto.runtime.v1.PutObjectInput.MetaEntry - nil, // 61: mosn.proto.runtime.v1.PutBucketTaggingInput.TagsEntry - nil, // 62: mosn.proto.runtime.v1.GetObjectTaggingOutput.TagsEntry - nil, // 63: mosn.proto.runtime.v1.CreateMultipartUploadInput.MetaDataEntry - nil, // 64: mosn.proto.runtime.v1.HeadObjectOutput.ResultMetadataEntry - (*emptypb.Empty)(nil), // 65: google.protobuf.Empty + (*SignURLInput)(nil), // 59: mosn.proto.runtime.v1.SignURLInput + (*SignURLOutput)(nil), // 60: mosn.proto.runtime.v1.SignURLOutput + (*UpdateBandwidthRateLimitInput)(nil), // 61: mosn.proto.runtime.v1.UpdateBandwidthRateLimitInput + (*AppendObjectInput)(nil), // 62: mosn.proto.runtime.v1.AppendObjectInput + (*AppendObjectOutput)(nil), // 63: mosn.proto.runtime.v1.AppendObjectOutput + (*ListPartsInput)(nil), // 64: mosn.proto.runtime.v1.ListPartsInput + (*Part)(nil), // 65: mosn.proto.runtime.v1.Part + (*ListPartsOutput)(nil), // 66: mosn.proto.runtime.v1.ListPartsOutput + nil, // 67: mosn.proto.runtime.v1.InitInput.MetadataEntry + nil, // 68: mosn.proto.runtime.v1.PutObjectInput.MetaEntry + nil, // 69: mosn.proto.runtime.v1.PutBucketTaggingInput.TagsEntry + nil, // 70: mosn.proto.runtime.v1.GetObjectTaggingOutput.TagsEntry + nil, // 71: mosn.proto.runtime.v1.CopyObjectInput.MetadataEntry + nil, // 72: mosn.proto.runtime.v1.CreateMultipartUploadInput.MetaDataEntry + nil, // 73: mosn.proto.runtime.v1.HeadObjectOutput.ResultMetadataEntry + nil, // 74: mosn.proto.runtime.v1.AppendObjectInput.TagsEntry + (*emptypb.Empty)(nil), // 75: google.protobuf.Empty } var file_s3_proto_depIdxs = []int32{ - 59, // 0: mosn.proto.runtime.v1.InitInput.metadata:type_name -> mosn.proto.runtime.v1.InitInput.MetadataEntry - 60, // 1: mosn.proto.runtime.v1.PutObjectInput.meta:type_name -> mosn.proto.runtime.v1.PutObjectInput.MetaEntry - 61, // 2: mosn.proto.runtime.v1.PutBucketTaggingInput.tags:type_name -> mosn.proto.runtime.v1.PutBucketTaggingInput.TagsEntry - 62, // 3: mosn.proto.runtime.v1.GetObjectTaggingOutput.tags:type_name -> mosn.proto.runtime.v1.GetObjectTaggingOutput.TagsEntry + 67, // 0: mosn.proto.runtime.v1.InitInput.metadata:type_name -> mosn.proto.runtime.v1.InitInput.MetadataEntry + 68, // 1: mosn.proto.runtime.v1.PutObjectInput.meta:type_name -> mosn.proto.runtime.v1.PutObjectInput.MetaEntry + 69, // 2: mosn.proto.runtime.v1.PutBucketTaggingInput.tags:type_name -> mosn.proto.runtime.v1.PutBucketTaggingInput.TagsEntry + 70, // 3: mosn.proto.runtime.v1.GetObjectTaggingOutput.tags:type_name -> mosn.proto.runtime.v1.GetObjectTaggingOutput.TagsEntry 13, // 4: mosn.proto.runtime.v1.CopyObjectInput.copy_source:type_name -> mosn.proto.runtime.v1.CopySource - 15, // 5: mosn.proto.runtime.v1.CopyObjectOutput.CopyObjectResult:type_name -> mosn.proto.runtime.v1.CopyObjectResult - 18, // 6: mosn.proto.runtime.v1.Delete.objects:type_name -> mosn.proto.runtime.v1.ObjectIdentifier - 17, // 7: mosn.proto.runtime.v1.DeleteObjectsInput.delete:type_name -> mosn.proto.runtime.v1.Delete - 20, // 8: mosn.proto.runtime.v1.DeleteObjectsOutput.deleted:type_name -> mosn.proto.runtime.v1.DeletedObject - 25, // 9: mosn.proto.runtime.v1.ListObjectsOutput.contents:type_name -> mosn.proto.runtime.v1.Object - 24, // 10: mosn.proto.runtime.v1.Object.owner:type_name -> mosn.proto.runtime.v1.Owner - 26, // 11: mosn.proto.runtime.v1.Grant.grantee:type_name -> mosn.proto.runtime.v1.Grantee - 27, // 12: mosn.proto.runtime.v1.GetObjectAclOutput.grants:type_name -> mosn.proto.runtime.v1.Grant - 24, // 13: mosn.proto.runtime.v1.GetObjectAclOutput.owner:type_name -> mosn.proto.runtime.v1.Owner - 63, // 14: mosn.proto.runtime.v1.CreateMultipartUploadInput.meta_data:type_name -> mosn.proto.runtime.v1.CreateMultipartUploadInput.MetaDataEntry - 13, // 15: mosn.proto.runtime.v1.UploadPartCopyInput.copy_source:type_name -> mosn.proto.runtime.v1.CopySource - 39, // 16: mosn.proto.runtime.v1.UploadPartCopyOutput.copy_part_result:type_name -> mosn.proto.runtime.v1.CopyPartResult - 41, // 17: mosn.proto.runtime.v1.CompletedMultipartUpload.parts:type_name -> mosn.proto.runtime.v1.CompletedPart - 42, // 18: mosn.proto.runtime.v1.CompleteMultipartUploadInput.multipart_upload:type_name -> mosn.proto.runtime.v1.CompletedMultipartUpload - 48, // 19: mosn.proto.runtime.v1.MultipartUpload.initiator:type_name -> mosn.proto.runtime.v1.Initiator - 24, // 20: mosn.proto.runtime.v1.MultipartUpload.owner:type_name -> mosn.proto.runtime.v1.Owner - 49, // 21: mosn.proto.runtime.v1.ListMultipartUploadsOutput.uploads:type_name -> mosn.proto.runtime.v1.MultipartUpload - 24, // 22: mosn.proto.runtime.v1.DeleteMarkerEntry.owner:type_name -> mosn.proto.runtime.v1.Owner - 24, // 23: mosn.proto.runtime.v1.ObjectVersion.owner:type_name -> mosn.proto.runtime.v1.Owner - 52, // 24: mosn.proto.runtime.v1.ListObjectVersionsOutput.delete_markers:type_name -> mosn.proto.runtime.v1.DeleteMarkerEntry - 53, // 25: mosn.proto.runtime.v1.ListObjectVersionsOutput.versions:type_name -> mosn.proto.runtime.v1.ObjectVersion - 64, // 26: mosn.proto.runtime.v1.HeadObjectOutput.ResultMetadata:type_name -> mosn.proto.runtime.v1.HeadObjectOutput.ResultMetadataEntry - 0, // 27: mosn.proto.runtime.v1.S3.InitClient:input_type -> mosn.proto.runtime.v1.InitInput - 3, // 28: mosn.proto.runtime.v1.S3.PutObject:input_type -> mosn.proto.runtime.v1.PutObjectInput - 1, // 29: mosn.proto.runtime.v1.S3.GetObject:input_type -> mosn.proto.runtime.v1.GetObjectInput - 5, // 30: mosn.proto.runtime.v1.S3.DeleteObject:input_type -> mosn.proto.runtime.v1.DeleteObjectInput - 7, // 31: mosn.proto.runtime.v1.S3.PutObjectTagging:input_type -> mosn.proto.runtime.v1.PutBucketTaggingInput - 9, // 32: mosn.proto.runtime.v1.S3.DeleteObjectTagging:input_type -> mosn.proto.runtime.v1.DeleteObjectTaggingInput - 11, // 33: mosn.proto.runtime.v1.S3.GetObjectTagging:input_type -> mosn.proto.runtime.v1.GetObjectTaggingInput - 14, // 34: mosn.proto.runtime.v1.S3.CopyObject:input_type -> mosn.proto.runtime.v1.CopyObjectInput - 19, // 35: mosn.proto.runtime.v1.S3.DeleteObjects:input_type -> mosn.proto.runtime.v1.DeleteObjectsInput - 22, // 36: mosn.proto.runtime.v1.S3.ListObjects:input_type -> mosn.proto.runtime.v1.ListObjectsInput - 28, // 37: mosn.proto.runtime.v1.S3.GetObjectAcl:input_type -> mosn.proto.runtime.v1.GetObjectAclInput - 30, // 38: mosn.proto.runtime.v1.S3.PutObjectAcl:input_type -> mosn.proto.runtime.v1.PutObjectAclInput - 32, // 39: mosn.proto.runtime.v1.S3.RestoreObject:input_type -> mosn.proto.runtime.v1.RestoreObjectInput - 34, // 40: mosn.proto.runtime.v1.S3.CreateMultipartUpload:input_type -> mosn.proto.runtime.v1.CreateMultipartUploadInput - 36, // 41: mosn.proto.runtime.v1.S3.UploadPart:input_type -> mosn.proto.runtime.v1.UploadPartInput - 38, // 42: mosn.proto.runtime.v1.S3.UploadPartCopy:input_type -> mosn.proto.runtime.v1.UploadPartCopyInput - 43, // 43: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:input_type -> mosn.proto.runtime.v1.CompleteMultipartUploadInput - 45, // 44: mosn.proto.runtime.v1.S3.AbortMultipartUpload:input_type -> mosn.proto.runtime.v1.AbortMultipartUploadInput - 47, // 45: mosn.proto.runtime.v1.S3.ListMultipartUploads:input_type -> mosn.proto.runtime.v1.ListMultipartUploadsInput - 51, // 46: mosn.proto.runtime.v1.S3.ListObjectVersions:input_type -> mosn.proto.runtime.v1.ListObjectVersionsInput - 55, // 47: mosn.proto.runtime.v1.S3.HeadObject:input_type -> mosn.proto.runtime.v1.HeadObjectInput - 57, // 48: mosn.proto.runtime.v1.S3.IsObjectExist:input_type -> mosn.proto.runtime.v1.IsObjectExistInput - 65, // 49: mosn.proto.runtime.v1.S3.InitClient:output_type -> google.protobuf.Empty - 4, // 50: mosn.proto.runtime.v1.S3.PutObject:output_type -> mosn.proto.runtime.v1.PutObjectOutput - 2, // 51: mosn.proto.runtime.v1.S3.GetObject:output_type -> mosn.proto.runtime.v1.GetObjectOutput - 6, // 52: mosn.proto.runtime.v1.S3.DeleteObject:output_type -> mosn.proto.runtime.v1.DeleteObjectOutput - 8, // 53: mosn.proto.runtime.v1.S3.PutObjectTagging:output_type -> mosn.proto.runtime.v1.PutBucketTaggingOutput - 10, // 54: mosn.proto.runtime.v1.S3.DeleteObjectTagging:output_type -> mosn.proto.runtime.v1.DeleteObjectTaggingOutput - 12, // 55: mosn.proto.runtime.v1.S3.GetObjectTagging:output_type -> mosn.proto.runtime.v1.GetObjectTaggingOutput - 16, // 56: mosn.proto.runtime.v1.S3.CopyObject:output_type -> mosn.proto.runtime.v1.CopyObjectOutput - 21, // 57: mosn.proto.runtime.v1.S3.DeleteObjects:output_type -> mosn.proto.runtime.v1.DeleteObjectsOutput - 23, // 58: mosn.proto.runtime.v1.S3.ListObjects:output_type -> mosn.proto.runtime.v1.ListObjectsOutput - 29, // 59: mosn.proto.runtime.v1.S3.GetObjectAcl:output_type -> mosn.proto.runtime.v1.GetObjectAclOutput - 31, // 60: mosn.proto.runtime.v1.S3.PutObjectAcl:output_type -> mosn.proto.runtime.v1.PutObjectAclOutput - 33, // 61: mosn.proto.runtime.v1.S3.RestoreObject:output_type -> mosn.proto.runtime.v1.RestoreObjectOutput - 35, // 62: mosn.proto.runtime.v1.S3.CreateMultipartUpload:output_type -> mosn.proto.runtime.v1.CreateMultipartUploadOutput - 37, // 63: mosn.proto.runtime.v1.S3.UploadPart:output_type -> mosn.proto.runtime.v1.UploadPartOutput - 40, // 64: mosn.proto.runtime.v1.S3.UploadPartCopy:output_type -> mosn.proto.runtime.v1.UploadPartCopyOutput - 44, // 65: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:output_type -> mosn.proto.runtime.v1.CompleteMultipartUploadOutput - 46, // 66: mosn.proto.runtime.v1.S3.AbortMultipartUpload:output_type -> mosn.proto.runtime.v1.AbortMultipartUploadOutput - 50, // 67: mosn.proto.runtime.v1.S3.ListMultipartUploads:output_type -> mosn.proto.runtime.v1.ListMultipartUploadsOutput - 54, // 68: mosn.proto.runtime.v1.S3.ListObjectVersions:output_type -> mosn.proto.runtime.v1.ListObjectVersionsOutput - 56, // 69: mosn.proto.runtime.v1.S3.HeadObject:output_type -> mosn.proto.runtime.v1.HeadObjectOutput - 58, // 70: mosn.proto.runtime.v1.S3.IsObjectExist:output_type -> mosn.proto.runtime.v1.IsObjectExistOutput - 49, // [49:71] is the sub-list for method output_type - 27, // [27:49] is the sub-list for method input_type - 27, // [27:27] is the sub-list for extension type_name - 27, // [27:27] is the sub-list for extension extendee - 0, // [0:27] is the sub-list for field type_name + 71, // 5: mosn.proto.runtime.v1.CopyObjectInput.metadata:type_name -> mosn.proto.runtime.v1.CopyObjectInput.MetadataEntry + 15, // 6: mosn.proto.runtime.v1.CopyObjectOutput.CopyObjectResult:type_name -> mosn.proto.runtime.v1.CopyObjectResult + 18, // 7: mosn.proto.runtime.v1.Delete.objects:type_name -> mosn.proto.runtime.v1.ObjectIdentifier + 17, // 8: mosn.proto.runtime.v1.DeleteObjectsInput.delete:type_name -> mosn.proto.runtime.v1.Delete + 20, // 9: mosn.proto.runtime.v1.DeleteObjectsOutput.deleted:type_name -> mosn.proto.runtime.v1.DeletedObject + 25, // 10: mosn.proto.runtime.v1.ListObjectsOutput.contents:type_name -> mosn.proto.runtime.v1.Object + 24, // 11: mosn.proto.runtime.v1.Object.owner:type_name -> mosn.proto.runtime.v1.Owner + 26, // 12: mosn.proto.runtime.v1.Grant.grantee:type_name -> mosn.proto.runtime.v1.Grantee + 27, // 13: mosn.proto.runtime.v1.GetObjectAclOutput.grants:type_name -> mosn.proto.runtime.v1.Grant + 24, // 14: mosn.proto.runtime.v1.GetObjectAclOutput.owner:type_name -> mosn.proto.runtime.v1.Owner + 72, // 15: mosn.proto.runtime.v1.CreateMultipartUploadInput.meta_data:type_name -> mosn.proto.runtime.v1.CreateMultipartUploadInput.MetaDataEntry + 13, // 16: mosn.proto.runtime.v1.UploadPartCopyInput.copy_source:type_name -> mosn.proto.runtime.v1.CopySource + 39, // 17: mosn.proto.runtime.v1.UploadPartCopyOutput.copy_part_result:type_name -> mosn.proto.runtime.v1.CopyPartResult + 41, // 18: mosn.proto.runtime.v1.CompletedMultipartUpload.parts:type_name -> mosn.proto.runtime.v1.CompletedPart + 42, // 19: mosn.proto.runtime.v1.CompleteMultipartUploadInput.multipart_upload:type_name -> mosn.proto.runtime.v1.CompletedMultipartUpload + 48, // 20: mosn.proto.runtime.v1.MultipartUpload.initiator:type_name -> mosn.proto.runtime.v1.Initiator + 24, // 21: mosn.proto.runtime.v1.MultipartUpload.owner:type_name -> mosn.proto.runtime.v1.Owner + 49, // 22: mosn.proto.runtime.v1.ListMultipartUploadsOutput.uploads:type_name -> mosn.proto.runtime.v1.MultipartUpload + 24, // 23: mosn.proto.runtime.v1.DeleteMarkerEntry.owner:type_name -> mosn.proto.runtime.v1.Owner + 24, // 24: mosn.proto.runtime.v1.ObjectVersion.owner:type_name -> mosn.proto.runtime.v1.Owner + 52, // 25: mosn.proto.runtime.v1.ListObjectVersionsOutput.delete_markers:type_name -> mosn.proto.runtime.v1.DeleteMarkerEntry + 53, // 26: mosn.proto.runtime.v1.ListObjectVersionsOutput.versions:type_name -> mosn.proto.runtime.v1.ObjectVersion + 73, // 27: mosn.proto.runtime.v1.HeadObjectOutput.ResultMetadata:type_name -> mosn.proto.runtime.v1.HeadObjectOutput.ResultMetadataEntry + 74, // 28: mosn.proto.runtime.v1.AppendObjectInput.tags:type_name -> mosn.proto.runtime.v1.AppendObjectInput.TagsEntry + 65, // 29: mosn.proto.runtime.v1.ListPartsOutput.parts:type_name -> mosn.proto.runtime.v1.Part + 0, // 30: mosn.proto.runtime.v1.S3.InitClient:input_type -> mosn.proto.runtime.v1.InitInput + 3, // 31: mosn.proto.runtime.v1.S3.PutObject:input_type -> mosn.proto.runtime.v1.PutObjectInput + 1, // 32: mosn.proto.runtime.v1.S3.GetObject:input_type -> mosn.proto.runtime.v1.GetObjectInput + 5, // 33: mosn.proto.runtime.v1.S3.DeleteObject:input_type -> mosn.proto.runtime.v1.DeleteObjectInput + 7, // 34: mosn.proto.runtime.v1.S3.PutObjectTagging:input_type -> mosn.proto.runtime.v1.PutBucketTaggingInput + 9, // 35: mosn.proto.runtime.v1.S3.DeleteObjectTagging:input_type -> mosn.proto.runtime.v1.DeleteObjectTaggingInput + 11, // 36: mosn.proto.runtime.v1.S3.GetObjectTagging:input_type -> mosn.proto.runtime.v1.GetObjectTaggingInput + 14, // 37: mosn.proto.runtime.v1.S3.CopyObject:input_type -> mosn.proto.runtime.v1.CopyObjectInput + 19, // 38: mosn.proto.runtime.v1.S3.DeleteObjects:input_type -> mosn.proto.runtime.v1.DeleteObjectsInput + 22, // 39: mosn.proto.runtime.v1.S3.ListObjects:input_type -> mosn.proto.runtime.v1.ListObjectsInput + 28, // 40: mosn.proto.runtime.v1.S3.GetObjectAcl:input_type -> mosn.proto.runtime.v1.GetObjectAclInput + 30, // 41: mosn.proto.runtime.v1.S3.PutObjectAcl:input_type -> mosn.proto.runtime.v1.PutObjectAclInput + 32, // 42: mosn.proto.runtime.v1.S3.RestoreObject:input_type -> mosn.proto.runtime.v1.RestoreObjectInput + 34, // 43: mosn.proto.runtime.v1.S3.CreateMultipartUpload:input_type -> mosn.proto.runtime.v1.CreateMultipartUploadInput + 36, // 44: mosn.proto.runtime.v1.S3.UploadPart:input_type -> mosn.proto.runtime.v1.UploadPartInput + 38, // 45: mosn.proto.runtime.v1.S3.UploadPartCopy:input_type -> mosn.proto.runtime.v1.UploadPartCopyInput + 43, // 46: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:input_type -> mosn.proto.runtime.v1.CompleteMultipartUploadInput + 45, // 47: mosn.proto.runtime.v1.S3.AbortMultipartUpload:input_type -> mosn.proto.runtime.v1.AbortMultipartUploadInput + 47, // 48: mosn.proto.runtime.v1.S3.ListMultipartUploads:input_type -> mosn.proto.runtime.v1.ListMultipartUploadsInput + 51, // 49: mosn.proto.runtime.v1.S3.ListObjectVersions:input_type -> mosn.proto.runtime.v1.ListObjectVersionsInput + 55, // 50: mosn.proto.runtime.v1.S3.HeadObject:input_type -> mosn.proto.runtime.v1.HeadObjectInput + 57, // 51: mosn.proto.runtime.v1.S3.IsObjectExist:input_type -> mosn.proto.runtime.v1.IsObjectExistInput + 59, // 52: mosn.proto.runtime.v1.S3.SignURL:input_type -> mosn.proto.runtime.v1.SignURLInput + 61, // 53: mosn.proto.runtime.v1.S3.UpdateDownLoadBandwidthRateLimit:input_type -> mosn.proto.runtime.v1.UpdateBandwidthRateLimitInput + 61, // 54: mosn.proto.runtime.v1.S3.UpdateUpLoadBandwidthRateLimit:input_type -> mosn.proto.runtime.v1.UpdateBandwidthRateLimitInput + 62, // 55: mosn.proto.runtime.v1.S3.AppendObject:input_type -> mosn.proto.runtime.v1.AppendObjectInput + 64, // 56: mosn.proto.runtime.v1.S3.ListParts:input_type -> mosn.proto.runtime.v1.ListPartsInput + 75, // 57: mosn.proto.runtime.v1.S3.InitClient:output_type -> google.protobuf.Empty + 4, // 58: mosn.proto.runtime.v1.S3.PutObject:output_type -> mosn.proto.runtime.v1.PutObjectOutput + 2, // 59: mosn.proto.runtime.v1.S3.GetObject:output_type -> mosn.proto.runtime.v1.GetObjectOutput + 6, // 60: mosn.proto.runtime.v1.S3.DeleteObject:output_type -> mosn.proto.runtime.v1.DeleteObjectOutput + 8, // 61: mosn.proto.runtime.v1.S3.PutObjectTagging:output_type -> mosn.proto.runtime.v1.PutBucketTaggingOutput + 10, // 62: mosn.proto.runtime.v1.S3.DeleteObjectTagging:output_type -> mosn.proto.runtime.v1.DeleteObjectTaggingOutput + 12, // 63: mosn.proto.runtime.v1.S3.GetObjectTagging:output_type -> mosn.proto.runtime.v1.GetObjectTaggingOutput + 16, // 64: mosn.proto.runtime.v1.S3.CopyObject:output_type -> mosn.proto.runtime.v1.CopyObjectOutput + 21, // 65: mosn.proto.runtime.v1.S3.DeleteObjects:output_type -> mosn.proto.runtime.v1.DeleteObjectsOutput + 23, // 66: mosn.proto.runtime.v1.S3.ListObjects:output_type -> mosn.proto.runtime.v1.ListObjectsOutput + 29, // 67: mosn.proto.runtime.v1.S3.GetObjectAcl:output_type -> mosn.proto.runtime.v1.GetObjectAclOutput + 31, // 68: mosn.proto.runtime.v1.S3.PutObjectAcl:output_type -> mosn.proto.runtime.v1.PutObjectAclOutput + 33, // 69: mosn.proto.runtime.v1.S3.RestoreObject:output_type -> mosn.proto.runtime.v1.RestoreObjectOutput + 35, // 70: mosn.proto.runtime.v1.S3.CreateMultipartUpload:output_type -> mosn.proto.runtime.v1.CreateMultipartUploadOutput + 37, // 71: mosn.proto.runtime.v1.S3.UploadPart:output_type -> mosn.proto.runtime.v1.UploadPartOutput + 40, // 72: mosn.proto.runtime.v1.S3.UploadPartCopy:output_type -> mosn.proto.runtime.v1.UploadPartCopyOutput + 44, // 73: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:output_type -> mosn.proto.runtime.v1.CompleteMultipartUploadOutput + 46, // 74: mosn.proto.runtime.v1.S3.AbortMultipartUpload:output_type -> mosn.proto.runtime.v1.AbortMultipartUploadOutput + 50, // 75: mosn.proto.runtime.v1.S3.ListMultipartUploads:output_type -> mosn.proto.runtime.v1.ListMultipartUploadsOutput + 54, // 76: mosn.proto.runtime.v1.S3.ListObjectVersions:output_type -> mosn.proto.runtime.v1.ListObjectVersionsOutput + 56, // 77: mosn.proto.runtime.v1.S3.HeadObject:output_type -> mosn.proto.runtime.v1.HeadObjectOutput + 58, // 78: mosn.proto.runtime.v1.S3.IsObjectExist:output_type -> mosn.proto.runtime.v1.IsObjectExistOutput + 60, // 79: mosn.proto.runtime.v1.S3.SignURL:output_type -> mosn.proto.runtime.v1.SignURLOutput + 75, // 80: mosn.proto.runtime.v1.S3.UpdateDownLoadBandwidthRateLimit:output_type -> google.protobuf.Empty + 75, // 81: mosn.proto.runtime.v1.S3.UpdateUpLoadBandwidthRateLimit:output_type -> google.protobuf.Empty + 63, // 82: mosn.proto.runtime.v1.S3.AppendObject:output_type -> mosn.proto.runtime.v1.AppendObjectOutput + 66, // 83: mosn.proto.runtime.v1.S3.ListParts:output_type -> mosn.proto.runtime.v1.ListPartsOutput + 57, // [57:84] is the sub-list for method output_type + 30, // [30:57] is the sub-list for method input_type + 30, // [30:30] is the sub-list for extension type_name + 30, // [30:30] is the sub-list for extension extendee + 0, // [0:30] is the sub-list for field type_name } func init() { file_s3_proto_init() } @@ -6814,6 +7732,102 @@ func file_s3_proto_init() { return nil } } + file_s3_proto_msgTypes[59].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_s3_proto_msgTypes[60].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_s3_proto_msgTypes[61].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_s3_proto_msgTypes[62].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_s3_proto_msgTypes[63].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_s3_proto_msgTypes[64].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_s3_proto_msgTypes[65].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_s3_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListPartsOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -6821,7 +7835,7 @@ func file_s3_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_s3_proto_rawDesc, NumEnums: 0, - NumMessages: 65, + NumMessages: 75, NumExtensions: 0, NumServices: 1, }, @@ -6869,6 +7883,11 @@ type S3Client interface { ListObjectVersions(ctx context.Context, in *ListObjectVersionsInput, opts ...grpc.CallOption) (*ListObjectVersionsOutput, error) HeadObject(ctx context.Context, in *HeadObjectInput, opts ...grpc.CallOption) (*HeadObjectOutput, error) IsObjectExist(ctx context.Context, in *IsObjectExistInput, opts ...grpc.CallOption) (*IsObjectExistOutput, error) + SignURL(ctx context.Context, in *SignURLInput, opts ...grpc.CallOption) (*SignURLOutput, error) + UpdateDownLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) + UpdateUpLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) + AppendObject(ctx context.Context, opts ...grpc.CallOption) (S3_AppendObjectClient, error) + ListParts(ctx context.Context, in *ListPartsInput, opts ...grpc.CallOption) (*ListPartsOutput, error) } type s3Client struct { @@ -7150,6 +8169,76 @@ func (c *s3Client) IsObjectExist(ctx context.Context, in *IsObjectExistInput, op return out, nil } +func (c *s3Client) SignURL(ctx context.Context, in *SignURLInput, opts ...grpc.CallOption) (*SignURLOutput, error) { + out := new(SignURLOutput) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/SignURL", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *s3Client) UpdateDownLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/UpdateDownLoadBandwidthRateLimit", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *s3Client) UpdateUpLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/UpdateUpLoadBandwidthRateLimit", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *s3Client) AppendObject(ctx context.Context, opts ...grpc.CallOption) (S3_AppendObjectClient, error) { + stream, err := c.cc.NewStream(ctx, &_S3_serviceDesc.Streams[3], "/mosn.proto.runtime.v1.S3/AppendObject", opts...) + if err != nil { + return nil, err + } + x := &s3AppendObjectClient{stream} + return x, nil +} + +type S3_AppendObjectClient interface { + Send(*AppendObjectInput) error + CloseAndRecv() (*AppendObjectOutput, error) + grpc.ClientStream +} + +type s3AppendObjectClient struct { + grpc.ClientStream +} + +func (x *s3AppendObjectClient) Send(m *AppendObjectInput) error { + return x.ClientStream.SendMsg(m) +} + +func (x *s3AppendObjectClient) CloseAndRecv() (*AppendObjectOutput, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(AppendObjectOutput) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *s3Client) ListParts(ctx context.Context, in *ListPartsInput, opts ...grpc.CallOption) (*ListPartsOutput, error) { + out := new(ListPartsOutput) + err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/ListParts", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // S3Server is the server API for S3 service. type S3Server interface { InitClient(context.Context, *InitInput) (*emptypb.Empty, error) @@ -7174,6 +8263,11 @@ type S3Server interface { ListObjectVersions(context.Context, *ListObjectVersionsInput) (*ListObjectVersionsOutput, error) HeadObject(context.Context, *HeadObjectInput) (*HeadObjectOutput, error) IsObjectExist(context.Context, *IsObjectExistInput) (*IsObjectExistOutput, error) + SignURL(context.Context, *SignURLInput) (*SignURLOutput, error) + UpdateDownLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) + UpdateUpLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) + AppendObject(S3_AppendObjectServer) error + ListParts(context.Context, *ListPartsInput) (*ListPartsOutput, error) } // UnimplementedS3Server can be embedded to have forward compatible implementations. @@ -7246,6 +8340,21 @@ func (*UnimplementedS3Server) HeadObject(context.Context, *HeadObjectInput) (*He func (*UnimplementedS3Server) IsObjectExist(context.Context, *IsObjectExistInput) (*IsObjectExistOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method IsObjectExist not implemented") } +func (*UnimplementedS3Server) SignURL(context.Context, *SignURLInput) (*SignURLOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method SignURL not implemented") +} +func (*UnimplementedS3Server) UpdateDownLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateDownLoadBandwidthRateLimit not implemented") +} +func (*UnimplementedS3Server) UpdateUpLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateUpLoadBandwidthRateLimit not implemented") +} +func (*UnimplementedS3Server) AppendObject(S3_AppendObjectServer) error { + return status.Errorf(codes.Unimplemented, "method AppendObject not implemented") +} +func (*UnimplementedS3Server) ListParts(context.Context, *ListPartsInput) (*ListPartsOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListParts not implemented") +} func RegisterS3Server(s *grpc.Server, srv S3Server) { s.RegisterService(&_S3_serviceDesc, srv) @@ -7666,6 +8775,104 @@ func _S3_IsObjectExist_Handler(srv interface{}, ctx context.Context, dec func(in return interceptor(ctx, in, info, handler) } +func _S3_SignURL_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SignURLInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(S3Server).SignURL(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/SignURL", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).SignURL(ctx, req.(*SignURLInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _S3_UpdateDownLoadBandwidthRateLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateBandwidthRateLimitInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(S3Server).UpdateDownLoadBandwidthRateLimit(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/UpdateDownLoadBandwidthRateLimit", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).UpdateDownLoadBandwidthRateLimit(ctx, req.(*UpdateBandwidthRateLimitInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _S3_UpdateUpLoadBandwidthRateLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateBandwidthRateLimitInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(S3Server).UpdateUpLoadBandwidthRateLimit(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/UpdateUpLoadBandwidthRateLimit", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).UpdateUpLoadBandwidthRateLimit(ctx, req.(*UpdateBandwidthRateLimitInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _S3_AppendObject_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(S3Server).AppendObject(&s3AppendObjectServer{stream}) +} + +type S3_AppendObjectServer interface { + SendAndClose(*AppendObjectOutput) error + Recv() (*AppendObjectInput, error) + grpc.ServerStream +} + +type s3AppendObjectServer struct { + grpc.ServerStream +} + +func (x *s3AppendObjectServer) SendAndClose(m *AppendObjectOutput) error { + return x.ServerStream.SendMsg(m) +} + +func (x *s3AppendObjectServer) Recv() (*AppendObjectInput, error) { + m := new(AppendObjectInput) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func _S3_ListParts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListPartsInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(S3Server).ListParts(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mosn.proto.runtime.v1.S3/ListParts", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(S3Server).ListParts(ctx, req.(*ListPartsInput)) + } + return interceptor(ctx, in, info, handler) +} + var _S3_serviceDesc = grpc.ServiceDesc{ ServiceName: "mosn.proto.runtime.v1.S3", HandlerType: (*S3Server)(nil), @@ -7746,6 +8953,22 @@ var _S3_serviceDesc = grpc.ServiceDesc{ MethodName: "IsObjectExist", Handler: _S3_IsObjectExist_Handler, }, + { + MethodName: "SignURL", + Handler: _S3_SignURL_Handler, + }, + { + MethodName: "UpdateDownLoadBandwidthRateLimit", + Handler: _S3_UpdateDownLoadBandwidthRateLimit_Handler, + }, + { + MethodName: "UpdateUpLoadBandwidthRateLimit", + Handler: _S3_UpdateUpLoadBandwidthRateLimit_Handler, + }, + { + MethodName: "ListParts", + Handler: _S3_ListParts_Handler, + }, }, Streams: []grpc.StreamDesc{ { @@ -7763,6 +8986,11 @@ var _S3_serviceDesc = grpc.ServiceDesc{ Handler: _S3_UploadPart_Handler, ClientStreams: true, }, + { + StreamName: "AppendObject", + Handler: _S3_AppendObject_Handler, + ClientStreams: true, + }, }, Metadata: "s3.proto", } diff --git a/spec/proto/extension/v1/s3.proto b/spec/proto/extension/v1/s3.proto index 931685ae78..bae0e113d9 100644 --- a/spec/proto/extension/v1/s3.proto +++ b/spec/proto/extension/v1/s3.proto @@ -29,6 +29,11 @@ service S3 { rpc ListObjectVersions(ListObjectVersionsInput) returns(ListObjectVersionsOutput){} rpc HeadObject(HeadObjectInput) returns(HeadObjectOutput){} rpc IsObjectExist(IsObjectExistInput) returns(IsObjectExistOutput){} + rpc SignURL(SignURLInput) returns(SignURLOutput){} + rpc UpdateDownLoadBandwidthRateLimit(UpdateBandwidthRateLimitInput) returns(google.protobuf.Empty){} + rpc UpdateUpLoadBandwidthRateLimit(UpdateBandwidthRateLimitInput) returns(google.protobuf.Empty){} + rpc AppendObject(stream AppendObjectInput) returns(AppendObjectOutput){} + rpc ListParts(ListPartsInput) returns(ListPartsOutput){} } message InitInput { @@ -60,6 +65,7 @@ message GetObjectInput { string sse_customer_key_md5 = 21; string version_id = 22; string accept_encoding = 23; + string signed_url = 24; } message GetObjectOutput { bytes body = 1; @@ -77,7 +83,8 @@ message PutObjectInput{ string content_encoding = 9; int64 expires = 10; string server_side_encryption = 11; - map meta = 12; + string signed_url = 12; + map meta = 13; } message PutObjectOutput{ bool bucket_key_enabled = 1; @@ -89,6 +96,7 @@ message DeleteObjectInput{ string bucket = 2; string key = 3; string request_payer = 4; + string version_id = 5; } message DeleteObjectOutput{ bool delete_marker = 1; @@ -135,13 +143,19 @@ message CopyObjectInput{ string bucket = 2; string key = 3; CopySource copy_source = 4; + string tagging = 5; + int64 expires = 6; + // Specifies whether the metadata is copied from the source object or replaced with metadata provided in the request. + string metadata_directive = 7; + // A map of metadata to store with the object in S3. + map metadata = 8; } message CopyObjectResult{ string etag = 1; - int64 LastModified = 2; + int64 last_modified = 2; } message CopyObjectOutput{ - CopyObjectResult CopyObjectResult = 1; + CopyObjectResult copy_object_result = 1; } @@ -484,10 +498,12 @@ message HeadObjectInput{ string sse_customer_key = 13; string sse_customer_key_md5 = 14; string version_id = 15; + // Return object details meta + bool with_details = 16; } message HeadObjectOutput{ // Metadata pertaining to the operation's result. - map ResultMetadata = 1; + map result_metadata = 1; } message IsObjectExistInput{ @@ -497,4 +513,71 @@ message IsObjectExistInput{ } message IsObjectExistOutput{ bool file_exist = 1; +} + +message SignURLInput{ + string store_name = 1; + string bucket = 2; + string key = 3; + string method = 4; + int64 expired_in_sec = 5; +} +message SignURLOutput{ + string signed_url = 1; +} + +message UpdateBandwidthRateLimitInput{ + string store_name = 1; + // The average upload/download bandwidth rate limit in bits per second. + int64 average_rate_limit_in_bits_per_sec = 2; + //Resource name of gateway + string gateway_resource_name = 3; +} + +message AppendObjectInput{ + string store_name = 1; + string bucket = 2; + string key = 3; + bytes body = 4; + int64 position = 5; + string acl = 6; + string cache_control = 7; + string content_disposition = 8; + string content_encoding = 9; + string content_md5 = 10; + int64 expires = 11; + string storage_class = 12; + string server_side_encryption = 13; + string meta = 14; + map tags = 15; + +} +message AppendObjectOutput{ + int64 append_position = 1; +} + +message ListPartsInput{ + string store_name = 1; + string bucket = 2; + string key = 3; + string expected_bucket_owner = 4; + int64 max_parts = 5; + int64 part_number_marker = 6; + string request_payer = 7; + string upload_id = 8; +} +message Part{ + string etag = 1; + int64 last_modified = 2; + int64 part_number = 3; + int64 size = 4; +} +message ListPartsOutput{ + string bucket = 1; + string key = 2; + string upload_id = 3; + string next_part_number_marker = 4; + int64 max_parts = 5; + bool is_truncated = 6; + repeated Part parts = 7; } \ No newline at end of file From 8baea74613c49be59e168255fc6e052a513f07f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 14 Jun 2022 18:09:48 +0800 Subject: [PATCH 019/126] fix compile error --- go.sum | 1 + pkg/grpc/extension/s3/s3.go | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/go.sum b/go.sum index 9b5208226f..708722833f 100644 --- a/go.sum +++ b/go.sum @@ -177,6 +177,7 @@ github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDH github.com/aliyun/aliyun-oss-go-sdk v2.0.7+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/aliyun/aliyun-oss-go-sdk v2.1.8+incompatible h1:hLUNPbx10wawWW7DeNExvTrlb90db3UnnNTFKHZEFhE= github.com/aliyun/aliyun-oss-go-sdk v2.1.8+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= +github.com/aliyun/aliyun-oss-go-sdk v2.2.0+incompatible h1:ht2+VfbXtNLGhCsnTMc6/N26nSTBK6qdhktjYyjJQkk= github.com/aliyun/aliyun-oss-go-sdk v2.2.0+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/aliyun/aliyun-tablestore-go-sdk v1.6.0/go.mod h1:jixoiNNRR/4ziq0yub1fTlxmDcQwlpkaujpaWIATQWM= github.com/aliyunmq/mq-http-go-sdk v1.0.3/go.mod h1:JYfRMQoPexERvnNNBcal0ZQ2TVQ5ialDiW9ScjaadEM= diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go index 4aee88a131..5ba7b59fce 100644 --- a/pkg/grpc/extension/s3/s3.go +++ b/pkg/grpc/extension/s3/s3.go @@ -735,3 +735,24 @@ func (s *S3Server) AppendObject(stream s3.S3_AppendObjectServer) error { return stream.SendAndClose(output) } } + +func (s *S3Server) ListParts(ctx context.Context, req *s3.ListPartsInput) (*s3.ListPartsOutput, error) { + if s.ossInstance[req.StoreName] == nil { + return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) + } + st := &l8s3.ListPartsInput{} + err := transferData(req, st) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for ListParts,err: %+v", err) + } + resp, err := s.ossInstance[req.StoreName].ListParts(ctx, st) + if err != nil { + return nil, status.Errorf(codes.Internal, err.Error()) + } + out := &s3.ListPartsOutput{} + err = transferData(resp, out) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "transfer response data fail for ListParts,err: %+v", err) + } + return out, nil +} From 78a8eee63e677573d6bf3f45ed3be4d1fcae9b8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 14 Jun 2022 19:15:03 +0800 Subject: [PATCH 020/126] fix license validation --- components/file/aliyun/option.go | 16 ++++++++++++++++ components/file/aliyun/oss.go | 16 ++++++++++++++++ components/file/aws/oss.go | 15 +++++++++++++++ pkg/grpc/extension/s3/param.go | 16 ++++++++++++++++ pkg/grpc/extension/s3/s3_test.go | 16 ---------------- 5 files changed, 63 insertions(+), 16 deletions(-) delete mode 100644 pkg/grpc/extension/s3/s3_test.go diff --git a/components/file/aliyun/option.go b/components/file/aliyun/option.go index 08455a62f7..f093e5907b 100644 --- a/components/file/aliyun/option.go +++ b/components/file/aliyun/option.go @@ -1,3 +1,19 @@ +/* +* 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 aliyun import ( diff --git a/components/file/aliyun/oss.go b/components/file/aliyun/oss.go index 9d3c1aa7bf..cc81449c0c 100644 --- a/components/file/aliyun/oss.go +++ b/components/file/aliyun/oss.go @@ -1,3 +1,19 @@ +/* +* 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 aliyun import ( diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index bb77070c26..56637f6d65 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -1,3 +1,18 @@ +/* +* 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 aws import ( diff --git a/pkg/grpc/extension/s3/param.go b/pkg/grpc/extension/s3/param.go index c7edd20021..7de7f8cad4 100644 --- a/pkg/grpc/extension/s3/param.go +++ b/pkg/grpc/extension/s3/param.go @@ -1,3 +1,19 @@ +/* +* 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 s3 const ( diff --git a/pkg/grpc/extension/s3/s3_test.go b/pkg/grpc/extension/s3/s3_test.go deleted file mode 100644 index 28c437ea91..0000000000 --- a/pkg/grpc/extension/s3/s3_test.go +++ /dev/null @@ -1,16 +0,0 @@ -package s3 - -import ( - "fmt" - "testing" -) - -func TestDeepCopy(t *testing.T) { - var s map[string]string - if len(s) == 0 { - fmt.Println("s lenth is 0") - } - var n *string - a := *n - fmt.Println(a) -} From 80dfa9d178c1a37c17507583635345390b0bb088 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 14 Jun 2022 19:24:15 +0800 Subject: [PATCH 021/126] add liscensed --- components/file/factory/factory.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/components/file/factory/factory.go b/components/file/factory/factory.go index f313c06d38..2aa533a1c7 100644 --- a/components/file/factory/factory.go +++ b/components/file/factory/factory.go @@ -1,3 +1,19 @@ +/* +* 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 factory import ( From d12541f94979ea6c5fc8b208727766acc835c1ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 14 Jun 2022 19:25:15 +0800 Subject: [PATCH 022/126] go mod tidy for spec --- spec/go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/go.mod b/spec/go.mod index 61ce5343f6..9abdeb39fe 100644 --- a/spec/go.mod +++ b/spec/go.mod @@ -3,7 +3,7 @@ module mosn.io/layotto/spec go 1.14 require ( - github.com/golang/protobuf v1.5.0 // indirect + github.com/golang/protobuf v1.5.0 google.golang.org/grpc v1.37.0 google.golang.org/protobuf v1.26.0-rc.1 ) From 6a9614fcc6b8b66234a0dc2d107075c3897b127d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 14 Jun 2022 19:34:26 +0800 Subject: [PATCH 023/126] format --- cmd/layotto/main.go | 8 +++++--- cmd/layotto_multiple_api/main.go | 3 ++- components/file/aliyun/oss.go | 1 + components/file/aws/file.go | 1 + components/file/aws/file_test.go | 3 ++- components/file/aws/oss.go | 3 ++- components/file/minio/oss.go | 3 ++- components/file/registry.go | 1 + demo/file/client.go | 3 ++- demo/file/s3/client.go | 2 +- go.sum | 2 -- pkg/grpc/extension/s3/s3.go | 3 ++- pkg/runtime/config_test.go | 2 ++ spec/proto/extension/v1/s3.pb.go | 5 +++-- 14 files changed, 26 insertions(+), 14 deletions(-) diff --git a/cmd/layotto/main.go b/cmd/layotto/main.go index 0a0b87557e..cfa17c1698 100644 --- a/cmd/layotto/main.go +++ b/cmd/layotto/main.go @@ -18,11 +18,12 @@ package main import ( "encoding/json" - "mosn.io/layotto/components/file/aliyun" "os" "strconv" "time" + "mosn.io/layotto/components/file/aliyun" + mosn_jaeger "mosn.io/mosn/pkg/trace/jaeger" "github.com/dapr/components-contrib/secretstores" @@ -35,12 +36,13 @@ import ( secretstore_env "github.com/dapr/components-contrib/secretstores/local/env" secretstore_file "github.com/dapr/components-contrib/secretstores/local/file" "mosn.io/api" + "mosn.io/mosn/pkg/stagemanager" + "mosn.io/mosn/pkg/trace/skywalking" + "mosn.io/layotto/components/file/aws" "mosn.io/layotto/components/file/minio" "mosn.io/layotto/components/file/qiniu" "mosn.io/layotto/components/file/tencentcloud" - "mosn.io/mosn/pkg/stagemanager" - "mosn.io/mosn/pkg/trace/skywalking" component_actuators "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/diagnostics" diff --git a/cmd/layotto_multiple_api/main.go b/cmd/layotto_multiple_api/main.go index 9bac94c327..2f05d705b4 100644 --- a/cmd/layotto_multiple_api/main.go +++ b/cmd/layotto_multiple_api/main.go @@ -18,11 +18,12 @@ package main import ( "encoding/json" - "mosn.io/layotto/components/file/aliyun" "os" "strconv" "time" + "mosn.io/layotto/components/file/aliyun" + "github.com/dapr/components-contrib/secretstores" "github.com/dapr/components-contrib/secretstores/aws/parameterstore" "github.com/dapr/components-contrib/secretstores/aws/secretmanager" diff --git a/components/file/aliyun/oss.go b/components/file/aliyun/oss.go index cc81449c0c..70f5b5a6cf 100644 --- a/components/file/aliyun/oss.go +++ b/components/file/aliyun/oss.go @@ -23,6 +23,7 @@ import ( "net/http" "github.com/aliyun/aliyun-oss-go-sdk/oss" + "mosn.io/layotto/components/file" "mosn.io/layotto/components/file/factory" ) diff --git a/components/file/aws/file.go b/components/file/aws/file.go index 4bb196d07b..284f3ac180 100644 --- a/components/file/aws/file.go +++ b/components/file/aws/file.go @@ -29,6 +29,7 @@ import ( "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" + "mosn.io/layotto/components/file" "mosn.io/layotto/components/file/util" ) diff --git a/components/file/aws/file_test.go b/components/file/aws/file_test.go index 74232c8e94..248737c742 100644 --- a/components/file/aws/file_test.go +++ b/components/file/aws/file_test.go @@ -19,10 +19,11 @@ package aws import ( "context" "fmt" - "github.com/jinzhu/copier" "reflect" "testing" + "github.com/jinzhu/copier" + "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/stretchr/testify/assert" diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index 56637f6d65..8fe8fe8fca 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -29,9 +29,10 @@ import ( "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/file" "mosn.io/layotto/components/file/factory" - "mosn.io/pkg/log" ) const ( diff --git a/components/file/minio/oss.go b/components/file/minio/oss.go index 7751f77790..f105bebc17 100644 --- a/components/file/minio/oss.go +++ b/components/file/minio/oss.go @@ -22,9 +22,10 @@ import ( "errors" "fmt" "io" - "mosn.io/layotto/components/file/util" "strconv" + "mosn.io/layotto/components/file/util" + "github.com/minio/minio-go/v7/pkg/credentials" "github.com/minio/minio-go/v7" diff --git a/components/file/registry.go b/components/file/registry.go index 56bc19db9b..ca33854b48 100644 --- a/components/file/registry.go +++ b/components/file/registry.go @@ -18,6 +18,7 @@ package file import ( "fmt" + "mosn.io/layotto/components/pkg/info" ) diff --git a/demo/file/client.go b/demo/file/client.go index f850e19971..2318b20516 100644 --- a/demo/file/client.go +++ b/demo/file/client.go @@ -4,10 +4,11 @@ import ( "context" "fmt" "log" - s3 "mosn.io/layotto/spec/proto/extension/v1" "os" "strconv" + s3 "mosn.io/layotto/spec/proto/extension/v1" + "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" diff --git a/demo/file/s3/client.go b/demo/file/s3/client.go index 14e2a0c38e..210668b535 100644 --- a/demo/file/s3/client.go +++ b/demo/file/s3/client.go @@ -240,7 +240,7 @@ func TestPart() { } fmt.Printf("UploadPartCopy success, resp: %+v \n", resp2) - req3 := &s3.CompleteMultipartUploadInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "multicopy.jpg", UploadId: resp.UploadId, MultipartUpload: &s3.CompletedMultipartUpload{Parts: []*s3.CompletedPart{&s3.CompletedPart{Etag: resp2.CopyPartResult.Etag, PartNumber: req2.PartNumber}}}} + req3 := &s3.CompleteMultipartUploadInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "multicopy.jpg", UploadId: resp.UploadId, MultipartUpload: &s3.CompletedMultipartUpload{Parts: []*s3.CompletedPart{{Etag: resp2.CopyPartResult.Etag, PartNumber: req2.PartNumber}}}} resp3, err := c.CompleteMultipartUpload(context.Background(), req3) if err != nil { fmt.Printf("CompleteMultipartUpload fail, err: %+v \n", err) diff --git a/go.sum b/go.sum index 708722833f..c8822c5772 100644 --- a/go.sum +++ b/go.sum @@ -175,8 +175,6 @@ github.com/alicebob/miniredis/v2 v2.16.0 h1:ALkyFg7bSTEd1Mkrb4ppq4fnwjklA59dVtIe github.com/alicebob/miniredis/v2 v2.16.0/go.mod h1:gquAfGbzn92jvtrSC69+6zZnwSODVXVpYDRaGhWaL6I= github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk= github.com/aliyun/aliyun-oss-go-sdk v2.0.7+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= -github.com/aliyun/aliyun-oss-go-sdk v2.1.8+incompatible h1:hLUNPbx10wawWW7DeNExvTrlb90db3UnnNTFKHZEFhE= -github.com/aliyun/aliyun-oss-go-sdk v2.1.8+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/aliyun/aliyun-oss-go-sdk v2.2.0+incompatible h1:ht2+VfbXtNLGhCsnTMc6/N26nSTBK6qdhktjYyjJQkk= github.com/aliyun/aliyun-oss-go-sdk v2.2.0+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/aliyun/aliyun-tablestore-go-sdk v1.6.0/go.mod h1:jixoiNNRR/4ziq0yub1fTlxmDcQwlpkaujpaWIATQWM= diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go index 5ba7b59fce..dcd0b9e130 100644 --- a/pkg/grpc/extension/s3/s3.go +++ b/pkg/grpc/extension/s3/s3.go @@ -26,10 +26,11 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/emptypb" + "mosn.io/pkg/log" + l8s3 "mosn.io/layotto/components/file" "mosn.io/layotto/pkg/grpc" s3 "mosn.io/layotto/spec/proto/extension/v1" - "mosn.io/pkg/log" ) var ( diff --git a/pkg/runtime/config_test.go b/pkg/runtime/config_test.go index e6b8a38182..688e2d8ca6 100644 --- a/pkg/runtime/config_test.go +++ b/pkg/runtime/config_test.go @@ -18,6 +18,8 @@ import ( "testing" "github.com/stretchr/testify/assert" + + "mosn.io/layotto/components/file/aliyun" ) func TestConfig(t *testing.T) { diff --git a/spec/proto/extension/v1/s3.pb.go b/spec/proto/extension/v1/s3.pb.go index f1074545f5..011502ab1d 100644 --- a/spec/proto/extension/v1/s3.pb.go +++ b/spec/proto/extension/v1/s3.pb.go @@ -8,6 +8,9 @@ package s3 import ( context "context" + reflect "reflect" + sync "sync" + proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -15,8 +18,6 @@ import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" - reflect "reflect" - sync "sync" ) const ( From 256dac74d107299854a89fc0d021a25ab36f77e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 14 Jun 2022 20:11:20 +0800 Subject: [PATCH 024/126] fix go-lint --- demo/file/s3/client.go | 19 +- pkg/grpc/extension/s3/s3.go | 349 +++++++++++++++++++----------------- 2 files changed, 198 insertions(+), 170 deletions(-) diff --git a/demo/file/s3/client.go b/demo/file/s3/client.go index 210668b535..641c3df916 100644 --- a/demo/file/s3/client.go +++ b/demo/file/s3/client.go @@ -1,3 +1,19 @@ +/* +* 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 main import ( @@ -12,8 +28,7 @@ import ( ) const ( - storeName = "oss_demo" - storageType = "Standard" + storeName = "oss_demo" ) func TestGetObjectInput(fileName string) { diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go index dcd0b9e130..3960feade1 100644 --- a/pkg/grpc/extension/s3/s3.go +++ b/pkg/grpc/extension/s3/s3.go @@ -133,7 +133,6 @@ func (s *S3Server) GetObject(req *s3.GetObjectInput, stream s3.S3_GetObjectServe return nil } } - return nil } type putObjectStreamReader struct { @@ -189,16 +188,16 @@ func (s *S3Server) PutObject(stream s3.S3_PutObjectServer) error { return status.Errorf(codes.InvalidArgument, "transfer request data fail for PutObject,err: %+v", err) } st.DataStream = fileReader - if resp, err := s.ossInstance[req.StoreName].PutObject(stream.Context(), st); err != nil { + var resp *l8s3.PutObjectOutput + if resp, err = s.ossInstance[req.StoreName].PutObject(stream.Context(), st); err != nil { return status.Errorf(codes.Internal, err.Error()) - } else { - output := &s3.PutObjectOutput{} - err := transferData(resp, output) - if err != nil { - return status.Errorf(codes.Internal, "transfer response data fail for PutObject,err: %+v", err) - } - return stream.SendAndClose(output) } + output := &s3.PutObjectOutput{} + err = transferData(resp, output) + if err != nil { + return status.Errorf(codes.Internal, "transfer response data fail for PutObject,err: %+v", err) + } + return stream.SendAndClose(output) } func (s *S3Server) DeleteObject(ctx context.Context, req *s3.DeleteObjectInput) (*s3.DeleteObjectOutput, error) { @@ -210,16 +209,16 @@ func (s *S3Server) DeleteObject(ctx context.Context, req *s3.DeleteObjectInput) if err != nil { return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for DeleteObject,err: %+v", err) } - if resp, err := s.ossInstance[req.StoreName].DeleteObject(ctx, st); err != nil { + var resp *l8s3.DeleteObjectOutput + if resp, err = s.ossInstance[req.StoreName].DeleteObject(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) - } else { - output := &s3.DeleteObjectOutput{} - err := transferData(resp, output) - if err != nil { - return nil, status.Errorf(codes.Internal, "transfer response data fail for DeleteObject,err: %+v", err) - } - return output, nil } + output := &s3.DeleteObjectOutput{} + err = transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for DeleteObject,err: %+v", err) + } + return output, nil } func (s *S3Server) PutObjectTagging(ctx context.Context, req *s3.PutBucketTaggingInput) (*s3.PutBucketTaggingOutput, error) { if s.ossInstance[req.StoreName] == nil { @@ -231,16 +230,16 @@ func (s *S3Server) PutObjectTagging(ctx context.Context, req *s3.PutBucketTaggin if err != nil { return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for PutObjectTagging,err: %+v", err) } - if resp, err := s.ossInstance[req.StoreName].PutObjectTagging(ctx, st); err != nil { + var resp *l8s3.PutBucketTaggingOutput + if resp, err = s.ossInstance[req.StoreName].PutObjectTagging(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) - } else { - output := &s3.PutBucketTaggingOutput{} - err := transferData(resp, output) - if err != nil { - return nil, status.Errorf(codes.Internal, "transfer response data fail for PutObjectTagging,err: %+v", err) - } - return output, nil } + output := &s3.PutBucketTaggingOutput{} + err = transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for PutObjectTagging,err: %+v", err) + } + return output, nil } func (s *S3Server) DeleteObjectTagging(ctx context.Context, req *s3.DeleteObjectTaggingInput) (*s3.DeleteObjectTaggingOutput, error) { if s.ossInstance[req.StoreName] == nil { @@ -251,16 +250,16 @@ func (s *S3Server) DeleteObjectTagging(ctx context.Context, req *s3.DeleteObject if err != nil { return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for DeleteObjectTagging,err: %+v", err) } - if resp, err := s.ossInstance[req.StoreName].DeleteObjectTagging(ctx, st); err != nil { + var resp *l8s3.DeleteObjectTaggingOutput + if resp, err = s.ossInstance[req.StoreName].DeleteObjectTagging(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) - } else { - output := &s3.DeleteObjectTaggingOutput{} - err := transferData(resp, output) - if err != nil { - return nil, status.Errorf(codes.Internal, "transfer response data fail for DeleteObjectTagging,err: %+v", err) - } - return output, nil } + output := &s3.DeleteObjectTaggingOutput{} + err = transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for DeleteObjectTagging,err: %+v", err) + } + return output, nil } func (s *S3Server) GetObjectTagging(ctx context.Context, req *s3.GetObjectTaggingInput) (*s3.GetObjectTaggingOutput, error) { if s.ossInstance[req.StoreName] == nil { @@ -271,16 +270,16 @@ func (s *S3Server) GetObjectTagging(ctx context.Context, req *s3.GetObjectTaggin if err != nil { return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for GetObjectTagging,err: %+v", err) } - if resp, err := s.ossInstance[req.StoreName].GetObjectTagging(ctx, st); err != nil { + var resp *l8s3.GetObjectTaggingOutput + if resp, err = s.ossInstance[req.StoreName].GetObjectTagging(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) - } else { - output := &s3.GetObjectTaggingOutput{} - err := transferData(resp, output) - if err != nil { - return nil, status.Errorf(codes.Internal, "transfer response data fail for GetObjectTagging,err: %+v", err) - } - return output, nil } + output := &s3.GetObjectTaggingOutput{} + err = transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for GetObjectTagging,err: %+v", err) + } + return output, nil } func (s *S3Server) CopyObject(ctx context.Context, req *s3.CopyObjectInput) (*s3.CopyObjectOutput, error) { if s.ossInstance[req.StoreName] == nil { @@ -291,16 +290,17 @@ func (s *S3Server) CopyObject(ctx context.Context, req *s3.CopyObjectInput) (*s3 if err != nil { return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for CopyObject,err: %+v", err) } - if resp, err := s.ossInstance[req.StoreName].CopyObject(ctx, st); err != nil { + var resp *l8s3.CopyObjectOutput + if resp, err = s.ossInstance[req.StoreName].CopyObject(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) - } else { - output := &s3.CopyObjectOutput{} - err := transferData(resp, output) - if err != nil { - return nil, status.Errorf(codes.Internal, "transfer response data fail for CopyObject,err: %+v", err) - } - return output, nil } + output := &s3.CopyObjectOutput{} + err = transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for CopyObject,err: %+v", err) + } + return output, nil + } func (s *S3Server) DeleteObjects(ctx context.Context, req *s3.DeleteObjectsInput) (*s3.DeleteObjectsOutput, error) { if s.ossInstance[req.StoreName] == nil { @@ -311,16 +311,17 @@ func (s *S3Server) DeleteObjects(ctx context.Context, req *s3.DeleteObjectsInput if err != nil { return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for DeleteObjects,err: %+v", err) } - if resp, err := s.ossInstance[req.StoreName].DeleteObjects(ctx, st); err != nil { + var resp *l8s3.DeleteObjectsOutput + if resp, err = s.ossInstance[req.StoreName].DeleteObjects(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) - } else { - output := &s3.DeleteObjectsOutput{} - err := transferData(resp, output) - if err != nil { - return nil, status.Errorf(codes.Internal, "transfer response data fail for DeleteObjects,err: %+v", err) - } - return output, nil } + output := &s3.DeleteObjectsOutput{} + err = transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for DeleteObjects,err: %+v", err) + } + return output, nil + } func (s *S3Server) ListObjects(ctx context.Context, req *s3.ListObjectsInput) (*s3.ListObjectsOutput, error) { if s.ossInstance[req.StoreName] == nil { @@ -331,16 +332,17 @@ func (s *S3Server) ListObjects(ctx context.Context, req *s3.ListObjectsInput) (* if err != nil { return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for ListObjects,err: %+v", err) } - if resp, err := s.ossInstance[req.StoreName].ListObjects(ctx, st); err != nil { + var resp *l8s3.ListObjectsOutput + if resp, err = s.ossInstance[req.StoreName].ListObjects(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) - } else { - output := &s3.ListObjectsOutput{} - err := transferData(resp, output) - if err != nil { - return nil, status.Errorf(codes.Internal, "transfer response data fail for ListObjects,err: %+v", err) - } - return output, nil } + output := &s3.ListObjectsOutput{} + err = transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for ListObjects,err: %+v", err) + } + return output, nil + } func (s *S3Server) GetObjectAcl(ctx context.Context, req *s3.GetObjectAclInput) (*s3.GetObjectAclOutput, error) { if s.ossInstance[req.StoreName] == nil { @@ -351,16 +353,17 @@ func (s *S3Server) GetObjectAcl(ctx context.Context, req *s3.GetObjectAclInput) if err != nil { return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for GetObjectAcl,err: %+v", err) } - if resp, err := s.ossInstance[req.StoreName].GetObjectAcl(ctx, st); err != nil { + var resp *l8s3.GetObjectAclOutput + if resp, err = s.ossInstance[req.StoreName].GetObjectAcl(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) - } else { - output := &s3.GetObjectAclOutput{} - err := transferData(resp, output) - if err != nil { - return nil, status.Errorf(codes.Internal, "transfer response data fail for GetObjectAcl,err: %+v", err) - } - return output, nil } + output := &s3.GetObjectAclOutput{} + err = transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for GetObjectAcl,err: %+v", err) + } + return output, nil + } func (s *S3Server) PutObjectAcl(ctx context.Context, req *s3.PutObjectAclInput) (*s3.PutObjectAclOutput, error) { if s.ossInstance[req.StoreName] == nil { @@ -371,16 +374,17 @@ func (s *S3Server) PutObjectAcl(ctx context.Context, req *s3.PutObjectAclInput) if err != nil { return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for PutObjectAcl,err: %+v", err) } - if resp, err := s.ossInstance[req.StoreName].PutObjectAcl(ctx, st); err != nil { + var resp *l8s3.PutObjectAclOutput + if resp, err = s.ossInstance[req.StoreName].PutObjectAcl(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) - } else { - output := &s3.PutObjectAclOutput{} - err := transferData(resp, output) - if err != nil { - return nil, status.Errorf(codes.Internal, "transfer response data fail for PutObjectAcl,err: %+v", err) - } - return output, nil } + output := &s3.PutObjectAclOutput{} + err = transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for PutObjectAcl,err: %+v", err) + } + return output, nil + } func (s *S3Server) RestoreObject(ctx context.Context, req *s3.RestoreObjectInput) (*s3.RestoreObjectOutput, error) { if s.ossInstance[req.StoreName] == nil { @@ -391,16 +395,17 @@ func (s *S3Server) RestoreObject(ctx context.Context, req *s3.RestoreObjectInput if err != nil { return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for RestoreObject,err: %+v", err) } - if resp, err := s.ossInstance[req.StoreName].RestoreObject(ctx, st); err != nil { + var resp *l8s3.RestoreObjectOutput + if resp, err = s.ossInstance[req.StoreName].RestoreObject(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) - } else { - output := &s3.RestoreObjectOutput{} - err := transferData(resp, output) - if err != nil { - return nil, status.Errorf(codes.Internal, "transfer response data fail for RestoreObject,err: %+v", err) - } - return output, nil } + output := &s3.RestoreObjectOutput{} + err = transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for RestoreObject,err: %+v", err) + } + return output, nil + } func (s *S3Server) CreateMultipartUpload(ctx context.Context, req *s3.CreateMultipartUploadInput) (*s3.CreateMultipartUploadOutput, error) { if s.ossInstance[req.StoreName] == nil { @@ -411,16 +416,17 @@ func (s *S3Server) CreateMultipartUpload(ctx context.Context, req *s3.CreateMult if err != nil { return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for CreateMultipartUpload,err: %+v", err) } - if resp, err := s.ossInstance[req.StoreName].CreateMultipartUpload(ctx, st); err != nil { + var resp *l8s3.CreateMultipartUploadOutput + if resp, err = s.ossInstance[req.StoreName].CreateMultipartUpload(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) - } else { - output := &s3.CreateMultipartUploadOutput{} - err := transferData(resp, output) - if err != nil { - return nil, status.Errorf(codes.Internal, "transfer response data fail for CreateMultipartUpload,err: %+v", err) - } - return output, nil } + output := &s3.CreateMultipartUploadOutput{} + err = transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for CreateMultipartUpload,err: %+v", err) + } + return output, nil + } type uploadPartStreamReader struct { @@ -476,16 +482,17 @@ func (s *S3Server) UploadPart(stream s3.S3_UploadPartServer) error { return status.Errorf(codes.InvalidArgument, "transfer request data fail for UploadPart,err: %+v", err) } st.DataStream = fileReader - if resp, err := s.ossInstance[req.StoreName].UploadPart(stream.Context(), st); err != nil { + var resp *l8s3.UploadPartOutput + if resp, err = s.ossInstance[req.StoreName].UploadPart(stream.Context(), st); err != nil { return status.Errorf(codes.Internal, err.Error()) - } else { - output := &s3.UploadPartOutput{} - err := transferData(resp, output) - if err != nil { - return status.Errorf(codes.Internal, "transfer response data fail for UploadPart,err: %+v", err) - } - return stream.SendAndClose(output) } + output := &s3.UploadPartOutput{} + err = transferData(resp, output) + if err != nil { + return status.Errorf(codes.Internal, "transfer response data fail for UploadPart,err: %+v", err) + } + return stream.SendAndClose(output) + } func (s *S3Server) UploadPartCopy(ctx context.Context, req *s3.UploadPartCopyInput) (*s3.UploadPartCopyOutput, error) { if s.ossInstance[req.StoreName] == nil { @@ -496,16 +503,17 @@ func (s *S3Server) UploadPartCopy(ctx context.Context, req *s3.UploadPartCopyInp if err != nil { return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for UploadPartCopy,err: %+v", err) } - if resp, err := s.ossInstance[req.StoreName].UploadPartCopy(ctx, st); err != nil { + var resp *l8s3.UploadPartCopyOutput + if resp, err = s.ossInstance[req.StoreName].UploadPartCopy(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) - } else { - output := &s3.UploadPartCopyOutput{} - err := transferData(resp, output) - if err != nil { - return nil, status.Errorf(codes.Internal, "transfer response data fail for UploadPartCopy,err: %+v", err) - } - return output, nil } + output := &s3.UploadPartCopyOutput{} + err = transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for UploadPartCopy,err: %+v", err) + } + return output, nil + } func (s *S3Server) CompleteMultipartUpload(ctx context.Context, req *s3.CompleteMultipartUploadInput) (*s3.CompleteMultipartUploadOutput, error) { if s.ossInstance[req.StoreName] == nil { @@ -516,16 +524,17 @@ func (s *S3Server) CompleteMultipartUpload(ctx context.Context, req *s3.Complete if err != nil { return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for CompleteMultipartUpload,err: %+v", err) } - if resp, err := s.ossInstance[req.StoreName].CompleteMultipartUpload(ctx, st); err != nil { + var resp *l8s3.CompleteMultipartUploadOutput + if resp, err = s.ossInstance[req.StoreName].CompleteMultipartUpload(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) - } else { - output := &s3.CompleteMultipartUploadOutput{} - err := transferData(resp, output) - if err != nil { - return nil, status.Errorf(codes.Internal, "transfer response data fail for CompleteMultipartUpload,err: %+v", err) - } - return output, nil } + output := &s3.CompleteMultipartUploadOutput{} + err = transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for CompleteMultipartUpload,err: %+v", err) + } + return output, nil + } func (s *S3Server) AbortMultipartUpload(ctx context.Context, req *s3.AbortMultipartUploadInput) (*s3.AbortMultipartUploadOutput, error) { if s.ossInstance[req.StoreName] == nil { @@ -536,16 +545,17 @@ func (s *S3Server) AbortMultipartUpload(ctx context.Context, req *s3.AbortMultip if err != nil { return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for AbortMultipartUpload,err: %+v", err) } - if resp, err := s.ossInstance[req.StoreName].AbortMultipartUpload(ctx, st); err != nil { + var resp *l8s3.AbortMultipartUploadOutput + if resp, err = s.ossInstance[req.StoreName].AbortMultipartUpload(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) - } else { - output := &s3.AbortMultipartUploadOutput{} - err := transferData(resp, output) - if err != nil { - return nil, status.Errorf(codes.Internal, "transfer response data fail for AbortMultipartUpload,err: %+v", err) - } - return output, nil } + output := &s3.AbortMultipartUploadOutput{} + err = transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for AbortMultipartUpload,err: %+v", err) + } + return output, nil + } func (s *S3Server) ListMultipartUploads(ctx context.Context, req *s3.ListMultipartUploadsInput) (*s3.ListMultipartUploadsOutput, error) { if s.ossInstance[req.StoreName] == nil { @@ -556,16 +566,16 @@ func (s *S3Server) ListMultipartUploads(ctx context.Context, req *s3.ListMultipa if err != nil { return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for AbortMultipartUpload,err: %+v", err) } - if resp, err := s.ossInstance[req.StoreName].ListMultipartUploads(ctx, st); err != nil { + var resp *l8s3.ListMultipartUploadsOutput + if resp, err = s.ossInstance[req.StoreName].ListMultipartUploads(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) - } else { - output := &s3.ListMultipartUploadsOutput{} - err := transferData(resp, output) - if err != nil { - return nil, status.Errorf(codes.Internal, "transfer response data fail for AbortMultipartUpload,err: %+v", err) - } - return output, nil } + output := &s3.ListMultipartUploadsOutput{} + err = transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for AbortMultipartUpload,err: %+v", err) + } + return output, nil } func (s *S3Server) ListObjectVersions(ctx context.Context, req *s3.ListObjectVersionsInput) (*s3.ListObjectVersionsOutput, error) { if s.ossInstance[req.StoreName] == nil { @@ -576,16 +586,17 @@ func (s *S3Server) ListObjectVersions(ctx context.Context, req *s3.ListObjectVer if err != nil { return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for ListObjectVersions,err: %+v", err) } - if resp, err := s.ossInstance[req.StoreName].ListObjectVersions(ctx, st); err != nil { + var resp *l8s3.ListObjectVersionsOutput + if resp, err = s.ossInstance[req.StoreName].ListObjectVersions(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) - } else { - output := &s3.ListObjectVersionsOutput{} - err := transferData(resp, output) - if err != nil { - return nil, status.Errorf(codes.Internal, "transfer response data fail for ListObjectVersions,err: %+v", err) - } - return output, nil } + output := &s3.ListObjectVersionsOutput{} + err = transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for ListObjectVersions,err: %+v", err) + } + return output, nil + } func (s *S3Server) HeadObject(ctx context.Context, req *s3.HeadObjectInput) (*s3.HeadObjectOutput, error) { @@ -597,16 +608,17 @@ func (s *S3Server) HeadObject(ctx context.Context, req *s3.HeadObjectInput) (*s3 if err != nil { return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for ListObjectVersions,err: %+v", err) } - if resp, err := s.ossInstance[req.StoreName].HeadObject(ctx, st); err != nil { + var resp *l8s3.HeadObjectOutput + if resp, err = s.ossInstance[req.StoreName].HeadObject(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) - } else { - output := &s3.HeadObjectOutput{} - err := transferData(resp, output) - if err != nil { - return nil, status.Errorf(codes.Internal, "transfer response data fail for ListObjectVersions,err: %+v", err) - } - return output, nil } + output := &s3.HeadObjectOutput{} + err = transferData(resp, output) + if err != nil { + return nil, status.Errorf(codes.Internal, "transfer response data fail for ListObjectVersions,err: %+v", err) + } + return output, nil + } func (s *S3Server) IsObjectExist(ctx context.Context, req *s3.IsObjectExistInput) (*s3.IsObjectExistOutput, error) { @@ -618,13 +630,13 @@ func (s *S3Server) IsObjectExist(ctx context.Context, req *s3.IsObjectExistInput if err != nil { return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for IsObjectExist,err: %+v", err) } - if resp, err := s.ossInstance[req.StoreName].IsObjectExist(ctx, st); err != nil { + var resp *l8s3.IsObjectExistOutput + if resp, err = s.ossInstance[req.StoreName].IsObjectExist(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) - } else { - output := &s3.IsObjectExistOutput{} - output.FileExist = resp.FileExist - return output, nil } + output := &s3.IsObjectExistOutput{} + output.FileExist = resp.FileExist + return output, nil } func (s *S3Server) SignURL(ctx context.Context, req *s3.SignURLInput) (*s3.SignURLOutput, error) { @@ -636,13 +648,13 @@ func (s *S3Server) SignURL(ctx context.Context, req *s3.SignURLInput) (*s3.SignU if err != nil { return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for SignURL,err: %+v", err) } - if resp, err := s.ossInstance[req.StoreName].SignURL(ctx, st); err != nil { + var resp *l8s3.SignURLOutput + if resp, err = s.ossInstance[req.StoreName].SignURL(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) - } else { - output := &s3.SignURLOutput{} - output.SignedUrl = resp.SignedUrl - return output, nil } + output := &s3.SignURLOutput{} + output.SignedUrl = resp.SignedUrl + return output, nil } func (s *S3Server) UpdateDownLoadBandwidthRateLimit(ctx context.Context, req *s3.UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { @@ -728,13 +740,14 @@ func (s *S3Server) AppendObject(stream s3.S3_AppendObjectServer) error { return status.Errorf(codes.InvalidArgument, "transfer request data fail for AppendObject,err: %+v", err) } st.DataStream = fileReader - if resp, err := s.ossInstance[req.StoreName].AppendObject(stream.Context(), st); err != nil { + var resp *l8s3.AppendObjectOutput + if resp, err = s.ossInstance[req.StoreName].AppendObject(stream.Context(), st); err != nil { return status.Errorf(codes.Internal, err.Error()) - } else { - output := &s3.AppendObjectOutput{} - output.AppendPosition = resp.AppendPosition - return stream.SendAndClose(output) } + output := &s3.AppendObjectOutput{} + output.AppendPosition = resp.AppendPosition + return stream.SendAndClose(output) + } func (s *S3Server) ListParts(ctx context.Context, req *s3.ListPartsInput) (*s3.ListPartsOutput, error) { From 41362462b2c5a6786f33f716a5367a6e48f8a898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 14 Jun 2022 20:20:05 +0800 Subject: [PATCH 025/126] fix go lint --- components/file/aliyun/option.go | 7 ------- components/file/aliyun/oss.go | 2 +- components/file/aws/file.go | 2 -- components/rpc/callback/dubbo_json_rpc_test.go | 2 +- 4 files changed, 2 insertions(+), 11 deletions(-) diff --git a/components/file/aliyun/option.go b/components/file/aliyun/option.go index f093e5907b..35095cb5d3 100644 --- a/components/file/aliyun/option.go +++ b/components/file/aliyun/option.go @@ -389,13 +389,6 @@ func StorageClass(value string) oss.Option { return oss.StorageClass(oss.StorageClassType(value)) } -// Checkpoint configuration -type cpConfig struct { - IsEnable bool - FilePath string - DirPath string -} - // ResponseContentType is an option to set response-content-type param func ResponseContentType(value string) oss.Option { if value == "" { diff --git a/components/file/aliyun/oss.go b/components/file/aliyun/oss.go index 70f5b5a6cf..c9104bd99d 100644 --- a/components/file/aliyun/oss.go +++ b/components/file/aliyun/oss.go @@ -244,7 +244,7 @@ func (a *AliyunOSS) GetObjectAcl(ctx context.Context, req *file.GetObjectAclInpu return nil, err } output := &file.GetObjectAclOutput{Owner: &file.Owner{DisplayName: resp.Owner.DisplayName, ID: resp.Owner.ID}} - grant := &file.Grant{&file.Grantee{DisplayName: resp.Owner.DisplayName, ID: resp.Owner.ID}, resp.ACL} + grant := &file.Grant{Grantee: &file.Grantee{DisplayName: resp.Owner.DisplayName, ID: resp.Owner.ID}, Permission: resp.ACL} output.Grants = append(output.Grants, grant) return output, err } diff --git a/components/file/aws/file.go b/components/file/aws/file.go index 284f3ac180..ef6be49496 100644 --- a/components/file/aws/file.go +++ b/components/file/aws/file.go @@ -36,9 +36,7 @@ import ( const ( endpointKey = "endpoint" - bucketKey = "bucket" defaultCredentialsSource = "provider" - fileLength = "length" ) // AwsOss is a binding for aws oss storage. diff --git a/components/rpc/callback/dubbo_json_rpc_test.go b/components/rpc/callback/dubbo_json_rpc_test.go index 4410d11118..7d2e7b93ee 100644 --- a/components/rpc/callback/dubbo_json_rpc_test.go +++ b/components/rpc/callback/dubbo_json_rpc_test.go @@ -33,7 +33,7 @@ func Test_beforeFactory_Create(t *testing.T) { Id: "1", Timeout: 300, Method: "Hello", - Header: make(map[string][]string, 0), + Header: make(map[string][]string), } newReq, err := f(req) assert.Nil(t, err) From 3675dc244e399d5cfb0fe90a2e9ba345118c9b7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 14 Jun 2022 20:31:07 +0800 Subject: [PATCH 026/126] fix client.go --- demo/file/client.go | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/demo/file/client.go b/demo/file/client.go index b8b2a71aa1..45d3149309 100644 --- a/demo/file/client.go +++ b/demo/file/client.go @@ -5,7 +5,6 @@ import ( "fmt" "log" "os" - "strconv" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" @@ -59,7 +58,7 @@ func TestGet(fileName string) { } func TestPut(fileName string, value string) { - conn, err := grpc.Dial("127.0.0.1:11004", grpc.WithInsecure()) + conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) panic(err) @@ -74,7 +73,6 @@ func TestPut(fileName string, value string) { panic(err) } req.Data = []byte(value) - meta["length"] = strconv.Itoa(len(value)) stream.Send(req) _, err = stream.CloseAndRecv() if err != nil { @@ -84,7 +82,7 @@ func TestPut(fileName string, value string) { } func TestList(bucketName string) { - conn, err := grpc.Dial("127.0.0.1:11004", grpc.WithInsecure()) + conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) panic(err) @@ -113,7 +111,7 @@ func TestList(bucketName string) { } func TestDel(fileName string) { - conn, err := grpc.Dial("127.0.0.1:11004", grpc.WithInsecure()) + conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return @@ -132,7 +130,7 @@ func TestDel(fileName string) { } func TestStat(fileName string) { - conn, err := grpc.Dial("127.0.0.1:11004", grpc.WithInsecure()) + conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) panic(err) From 0e39784b8dc0f60d7977c01acd669e5241ea425b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 15 Jun 2022 11:42:11 +0800 Subject: [PATCH 027/126] change proto file name --- pkg/grpc/extension/s3/s3.go | 22 +- .../extension/v1/{s3.pb.go => oss.pb.go} | 3749 +++++++++-------- .../extension/v1/{s3.proto => oss.proto} | 21 +- 3 files changed, 2001 insertions(+), 1791 deletions(-) rename spec/proto/extension/v1/{s3.pb.go => oss.pb.go} (59%) rename spec/proto/extension/v1/{s3.proto => oss.proto} (96%) diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go index 3960feade1..1b6594790d 100644 --- a/pkg/grpc/extension/s3/s3.go +++ b/pkg/grpc/extension/s3/s3.go @@ -68,7 +68,7 @@ func (s *S3Server) Init(conn *rawGRPC.ClientConn) error { } func (s *S3Server) Register(rawGrpcServer *rawGRPC.Server) error { - s3.RegisterS3Server(rawGrpcServer, s) + s3.RegisterObjectStorageServiceServer(rawGrpcServer, s) return nil } @@ -92,7 +92,7 @@ func transferData(source interface{}, target interface{}) error { return err } -func (s *S3Server) GetObject(req *s3.GetObjectInput, stream s3.S3_GetObjectServer) error { +func (s *S3Server) GetObject(req *s3.GetObjectInput, stream s3.ObjectStorageService_GetObjectServer) error { if s.ossInstance[req.StoreName] == nil { return status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } @@ -137,10 +137,10 @@ func (s *S3Server) GetObject(req *s3.GetObjectInput, stream s3.S3_GetObjectServe type putObjectStreamReader struct { data []byte - server s3.S3_PutObjectServer + server s3.ObjectStorageService_PutObjectServer } -func newPutObjectStreamReader(data []byte, server s3.S3_PutObjectServer) *putObjectStreamReader { +func newPutObjectStreamReader(data []byte, server s3.ObjectStorageService_PutObjectServer) *putObjectStreamReader { return &putObjectStreamReader{data: data, server: server} } @@ -167,7 +167,7 @@ func (r *putObjectStreamReader) Read(p []byte) (int, error) { } } -func (s *S3Server) PutObject(stream s3.S3_PutObjectServer) error { +func (s *S3Server) PutObject(stream s3.ObjectStorageService_PutObjectServer) error { req, err := stream.Recv() if err != nil { //if client send eof error directly, return nil @@ -431,10 +431,10 @@ func (s *S3Server) CreateMultipartUpload(ctx context.Context, req *s3.CreateMult type uploadPartStreamReader struct { data []byte - server s3.S3_UploadPartServer + server s3.ObjectStorageService_UploadPartServer } -func newUploadPartStreamReader(data []byte, server s3.S3_UploadPartServer) *uploadPartStreamReader { +func newUploadPartStreamReader(data []byte, server s3.ObjectStorageService_UploadPartServer) *uploadPartStreamReader { return &uploadPartStreamReader{data: data, server: server} } @@ -461,7 +461,7 @@ func (r *uploadPartStreamReader) Read(p []byte) (int, error) { } } -func (s *S3Server) UploadPart(stream s3.S3_UploadPartServer) error { +func (s *S3Server) UploadPart(stream s3.ObjectStorageService_UploadPartServer) error { req, err := stream.Recv() if err != nil { //if client send eof error directly, return nil @@ -689,10 +689,10 @@ func (s *S3Server) UpdateUpLoadBandwidthRateLimit(ctx context.Context, req *s3.U type appendObjectStreamReader struct { data []byte - server s3.S3_AppendObjectServer + server s3.ObjectStorageService_AppendObjectServer } -func newAppendObjectStreamReader(data []byte, server s3.S3_AppendObjectServer) *appendObjectStreamReader { +func newAppendObjectStreamReader(data []byte, server s3.ObjectStorageService_AppendObjectServer) *appendObjectStreamReader { return &appendObjectStreamReader{data: data, server: server} } @@ -719,7 +719,7 @@ func (r *appendObjectStreamReader) Read(p []byte) (int, error) { } } -func (s *S3Server) AppendObject(stream s3.S3_AppendObjectServer) error { +func (s *S3Server) AppendObject(stream s3.ObjectStorageService_AppendObjectServer) error { req, err := stream.Recv() if err != nil { //if client send eof error directly, return nil diff --git a/spec/proto/extension/v1/s3.pb.go b/spec/proto/extension/v1/oss.pb.go similarity index 59% rename from spec/proto/extension/v1/s3.pb.go rename to spec/proto/extension/v1/oss.pb.go index 011502ab1d..76a7f036d1 100644 --- a/spec/proto/extension/v1/s3.pb.go +++ b/spec/proto/extension/v1/oss.pb.go @@ -2,15 +2,12 @@ // versions: // protoc-gen-go v1.23.0 // protoc v3.19.1 -// source: s3.proto +// source: oss.proto package s3 import ( context "context" - reflect "reflect" - sync "sync" - proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -18,6 +15,8 @@ import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" + reflect "reflect" + sync "sync" ) const ( @@ -43,7 +42,7 @@ type InitInput struct { func (x *InitInput) Reset() { *x = InitInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[0] + mi := &file_oss_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -56,7 +55,7 @@ func (x *InitInput) String() string { func (*InitInput) ProtoMessage() {} func (x *InitInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[0] + mi := &file_oss_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -69,7 +68,7 @@ func (x *InitInput) ProtoReflect() protoreflect.Message { // Deprecated: Use InitInput.ProtoReflect.Descriptor instead. func (*InitInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{0} + return file_oss_proto_rawDescGZIP(), []int{0} } func (x *InitInput) GetStoreName() string { @@ -120,7 +119,7 @@ type GetObjectInput struct { func (x *GetObjectInput) Reset() { *x = GetObjectInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[1] + mi := &file_oss_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -133,7 +132,7 @@ func (x *GetObjectInput) String() string { func (*GetObjectInput) ProtoMessage() {} func (x *GetObjectInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[1] + mi := &file_oss_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -146,7 +145,7 @@ func (x *GetObjectInput) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObjectInput.ProtoReflect.Descriptor instead. func (*GetObjectInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{1} + return file_oss_proto_rawDescGZIP(), []int{1} } func (x *GetObjectInput) GetStoreName() string { @@ -322,13 +321,30 @@ type GetObjectOutput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Body []byte `protobuf:"bytes,1,opt,name=body,proto3" json:"body,omitempty"` + Body []byte `protobuf:"bytes,1,opt,name=body,proto3" json:"body,omitempty"` + CacheControl string `protobuf:"bytes,2,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` + ContentDisposition string `protobuf:"bytes,3,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` + ContentEncoding string `protobuf:"bytes,4,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` + ContentLanguage string `protobuf:"bytes,5,opt,name=content_language,json=contentLanguage,proto3" json:"content_language,omitempty"` + ContentLength int64 `protobuf:"varint,6,opt,name=content_length,json=contentLength,proto3" json:"content_length,omitempty"` + ContentRange string `protobuf:"bytes,7,opt,name=content_range,json=contentRange,proto3" json:"content_range,omitempty"` + ContentType string `protobuf:"bytes,8,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` + DeleteMarker bool `protobuf:"varint,9,opt,name=delete_marker,json=deleteMarker,proto3" json:"delete_marker,omitempty"` + Etag string `protobuf:"bytes,10,opt,name=etag,proto3" json:"etag,omitempty"` + Expiration string `protobuf:"bytes,11,opt,name=expiration,proto3" json:"expiration,omitempty"` + Expires string `protobuf:"bytes,12,opt,name=expires,proto3" json:"expires,omitempty"` + LastModified int64 `protobuf:"varint,13,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` + VersionId string `protobuf:"bytes,14,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + TagCount int64 `protobuf:"varint,15,opt,name=tag_count,json=tagCount,proto3" json:"tag_count,omitempty"` + StorageClass string `protobuf:"bytes,16,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` + PartsCount int64 `protobuf:"varint,17,opt,name=parts_count,json=partsCount,proto3" json:"parts_count,omitempty"` + Metadata map[string]string `protobuf:"bytes,18,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *GetObjectOutput) Reset() { *x = GetObjectOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[2] + mi := &file_oss_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -341,7 +357,7 @@ func (x *GetObjectOutput) String() string { func (*GetObjectOutput) ProtoMessage() {} func (x *GetObjectOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[2] + mi := &file_oss_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -354,7 +370,7 @@ func (x *GetObjectOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObjectOutput.ProtoReflect.Descriptor instead. func (*GetObjectOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{2} + return file_oss_proto_rawDescGZIP(), []int{2} } func (x *GetObjectOutput) GetBody() []byte { @@ -364,6 +380,125 @@ func (x *GetObjectOutput) GetBody() []byte { return nil } +func (x *GetObjectOutput) GetCacheControl() string { + if x != nil { + return x.CacheControl + } + return "" +} + +func (x *GetObjectOutput) GetContentDisposition() string { + if x != nil { + return x.ContentDisposition + } + return "" +} + +func (x *GetObjectOutput) GetContentEncoding() string { + if x != nil { + return x.ContentEncoding + } + return "" +} + +func (x *GetObjectOutput) GetContentLanguage() string { + if x != nil { + return x.ContentLanguage + } + return "" +} + +func (x *GetObjectOutput) GetContentLength() int64 { + if x != nil { + return x.ContentLength + } + return 0 +} + +func (x *GetObjectOutput) GetContentRange() string { + if x != nil { + return x.ContentRange + } + return "" +} + +func (x *GetObjectOutput) GetContentType() string { + if x != nil { + return x.ContentType + } + return "" +} + +func (x *GetObjectOutput) GetDeleteMarker() bool { + if x != nil { + return x.DeleteMarker + } + return false +} + +func (x *GetObjectOutput) GetEtag() string { + if x != nil { + return x.Etag + } + return "" +} + +func (x *GetObjectOutput) GetExpiration() string { + if x != nil { + return x.Expiration + } + return "" +} + +func (x *GetObjectOutput) GetExpires() string { + if x != nil { + return x.Expires + } + return "" +} + +func (x *GetObjectOutput) GetLastModified() int64 { + if x != nil { + return x.LastModified + } + return 0 +} + +func (x *GetObjectOutput) GetVersionId() string { + if x != nil { + return x.VersionId + } + return "" +} + +func (x *GetObjectOutput) GetTagCount() int64 { + if x != nil { + return x.TagCount + } + return 0 +} + +func (x *GetObjectOutput) GetStorageClass() string { + if x != nil { + return x.StorageClass + } + return "" +} + +func (x *GetObjectOutput) GetPartsCount() int64 { + if x != nil { + return x.PartsCount + } + return 0 +} + +func (x *GetObjectOutput) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + type PutObjectInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -387,7 +522,7 @@ type PutObjectInput struct { func (x *PutObjectInput) Reset() { *x = PutObjectInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[3] + mi := &file_oss_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -400,7 +535,7 @@ func (x *PutObjectInput) String() string { func (*PutObjectInput) ProtoMessage() {} func (x *PutObjectInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[3] + mi := &file_oss_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -413,7 +548,7 @@ func (x *PutObjectInput) ProtoReflect() protoreflect.Message { // Deprecated: Use PutObjectInput.ProtoReflect.Descriptor instead. func (*PutObjectInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{3} + return file_oss_proto_rawDescGZIP(), []int{3} } func (x *PutObjectInput) GetStoreName() string { @@ -519,7 +654,7 @@ type PutObjectOutput struct { func (x *PutObjectOutput) Reset() { *x = PutObjectOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[4] + mi := &file_oss_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -532,7 +667,7 @@ func (x *PutObjectOutput) String() string { func (*PutObjectOutput) ProtoMessage() {} func (x *PutObjectOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[4] + mi := &file_oss_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -545,7 +680,7 @@ func (x *PutObjectOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use PutObjectOutput.ProtoReflect.Descriptor instead. func (*PutObjectOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{4} + return file_oss_proto_rawDescGZIP(), []int{4} } func (x *PutObjectOutput) GetBucketKeyEnabled() bool { @@ -577,7 +712,7 @@ type DeleteObjectInput struct { func (x *DeleteObjectInput) Reset() { *x = DeleteObjectInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[5] + mi := &file_oss_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -590,7 +725,7 @@ func (x *DeleteObjectInput) String() string { func (*DeleteObjectInput) ProtoMessage() {} func (x *DeleteObjectInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[5] + mi := &file_oss_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -603,7 +738,7 @@ func (x *DeleteObjectInput) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteObjectInput.ProtoReflect.Descriptor instead. func (*DeleteObjectInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{5} + return file_oss_proto_rawDescGZIP(), []int{5} } func (x *DeleteObjectInput) GetStoreName() string { @@ -654,7 +789,7 @@ type DeleteObjectOutput struct { func (x *DeleteObjectOutput) Reset() { *x = DeleteObjectOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[6] + mi := &file_oss_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -667,7 +802,7 @@ func (x *DeleteObjectOutput) String() string { func (*DeleteObjectOutput) ProtoMessage() {} func (x *DeleteObjectOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[6] + mi := &file_oss_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -680,7 +815,7 @@ func (x *DeleteObjectOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteObjectOutput.ProtoReflect.Descriptor instead. func (*DeleteObjectOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{6} + return file_oss_proto_rawDescGZIP(), []int{6} } func (x *DeleteObjectOutput) GetDeleteMarker() bool { @@ -719,7 +854,7 @@ type PutBucketTaggingInput struct { func (x *PutBucketTaggingInput) Reset() { *x = PutBucketTaggingInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[7] + mi := &file_oss_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -732,7 +867,7 @@ func (x *PutBucketTaggingInput) String() string { func (*PutBucketTaggingInput) ProtoMessage() {} func (x *PutBucketTaggingInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[7] + mi := &file_oss_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -745,7 +880,7 @@ func (x *PutBucketTaggingInput) ProtoReflect() protoreflect.Message { // Deprecated: Use PutBucketTaggingInput.ProtoReflect.Descriptor instead. func (*PutBucketTaggingInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{7} + return file_oss_proto_rawDescGZIP(), []int{7} } func (x *PutBucketTaggingInput) GetStoreName() string { @@ -792,7 +927,7 @@ type PutBucketTaggingOutput struct { func (x *PutBucketTaggingOutput) Reset() { *x = PutBucketTaggingOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[8] + mi := &file_oss_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -805,7 +940,7 @@ func (x *PutBucketTaggingOutput) String() string { func (*PutBucketTaggingOutput) ProtoMessage() {} func (x *PutBucketTaggingOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[8] + mi := &file_oss_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -818,7 +953,7 @@ func (x *PutBucketTaggingOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use PutBucketTaggingOutput.ProtoReflect.Descriptor instead. func (*PutBucketTaggingOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{8} + return file_oss_proto_rawDescGZIP(), []int{8} } type DeleteObjectTaggingInput struct { @@ -834,7 +969,7 @@ type DeleteObjectTaggingInput struct { func (x *DeleteObjectTaggingInput) Reset() { *x = DeleteObjectTaggingInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[9] + mi := &file_oss_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -847,7 +982,7 @@ func (x *DeleteObjectTaggingInput) String() string { func (*DeleteObjectTaggingInput) ProtoMessage() {} func (x *DeleteObjectTaggingInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[9] + mi := &file_oss_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -860,7 +995,7 @@ func (x *DeleteObjectTaggingInput) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteObjectTaggingInput.ProtoReflect.Descriptor instead. func (*DeleteObjectTaggingInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{9} + return file_oss_proto_rawDescGZIP(), []int{9} } func (x *DeleteObjectTaggingInput) GetStoreName() string { @@ -895,7 +1030,7 @@ type DeleteObjectTaggingOutput struct { func (x *DeleteObjectTaggingOutput) Reset() { *x = DeleteObjectTaggingOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[10] + mi := &file_oss_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -908,7 +1043,7 @@ func (x *DeleteObjectTaggingOutput) String() string { func (*DeleteObjectTaggingOutput) ProtoMessage() {} func (x *DeleteObjectTaggingOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[10] + mi := &file_oss_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -921,7 +1056,7 @@ func (x *DeleteObjectTaggingOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteObjectTaggingOutput.ProtoReflect.Descriptor instead. func (*DeleteObjectTaggingOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{10} + return file_oss_proto_rawDescGZIP(), []int{10} } func (x *DeleteObjectTaggingOutput) GetVersionId() string { @@ -944,7 +1079,7 @@ type GetObjectTaggingInput struct { func (x *GetObjectTaggingInput) Reset() { *x = GetObjectTaggingInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[11] + mi := &file_oss_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -957,7 +1092,7 @@ func (x *GetObjectTaggingInput) String() string { func (*GetObjectTaggingInput) ProtoMessage() {} func (x *GetObjectTaggingInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[11] + mi := &file_oss_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -970,7 +1105,7 @@ func (x *GetObjectTaggingInput) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObjectTaggingInput.ProtoReflect.Descriptor instead. func (*GetObjectTaggingInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{11} + return file_oss_proto_rawDescGZIP(), []int{11} } func (x *GetObjectTaggingInput) GetStoreName() string { @@ -1005,7 +1140,7 @@ type GetObjectTaggingOutput struct { func (x *GetObjectTaggingOutput) Reset() { *x = GetObjectTaggingOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[12] + mi := &file_oss_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1018,7 +1153,7 @@ func (x *GetObjectTaggingOutput) String() string { func (*GetObjectTaggingOutput) ProtoMessage() {} func (x *GetObjectTaggingOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[12] + mi := &file_oss_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1031,7 +1166,7 @@ func (x *GetObjectTaggingOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObjectTaggingOutput.ProtoReflect.Descriptor instead. func (*GetObjectTaggingOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{12} + return file_oss_proto_rawDescGZIP(), []int{12} } func (x *GetObjectTaggingOutput) GetTags() map[string]string { @@ -1054,7 +1189,7 @@ type CopySource struct { func (x *CopySource) Reset() { *x = CopySource{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[13] + mi := &file_oss_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1067,7 +1202,7 @@ func (x *CopySource) String() string { func (*CopySource) ProtoMessage() {} func (x *CopySource) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[13] + mi := &file_oss_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1080,7 +1215,7 @@ func (x *CopySource) ProtoReflect() protoreflect.Message { // Deprecated: Use CopySource.ProtoReflect.Descriptor instead. func (*CopySource) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{13} + return file_oss_proto_rawDescGZIP(), []int{13} } func (x *CopySource) GetCopySourceBucket() string { @@ -1124,7 +1259,7 @@ type CopyObjectInput struct { func (x *CopyObjectInput) Reset() { *x = CopyObjectInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[14] + mi := &file_oss_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1137,7 +1272,7 @@ func (x *CopyObjectInput) String() string { func (*CopyObjectInput) ProtoMessage() {} func (x *CopyObjectInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[14] + mi := &file_oss_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1150,7 +1285,7 @@ func (x *CopyObjectInput) ProtoReflect() protoreflect.Message { // Deprecated: Use CopyObjectInput.ProtoReflect.Descriptor instead. func (*CopyObjectInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{14} + return file_oss_proto_rawDescGZIP(), []int{14} } func (x *CopyObjectInput) GetStoreName() string { @@ -1221,7 +1356,7 @@ type CopyObjectResult struct { func (x *CopyObjectResult) Reset() { *x = CopyObjectResult{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[15] + mi := &file_oss_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1234,7 +1369,7 @@ func (x *CopyObjectResult) String() string { func (*CopyObjectResult) ProtoMessage() {} func (x *CopyObjectResult) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[15] + mi := &file_oss_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1247,7 +1382,7 @@ func (x *CopyObjectResult) ProtoReflect() protoreflect.Message { // Deprecated: Use CopyObjectResult.ProtoReflect.Descriptor instead. func (*CopyObjectResult) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{15} + return file_oss_proto_rawDescGZIP(), []int{15} } func (x *CopyObjectResult) GetEtag() string { @@ -1269,13 +1404,13 @@ type CopyObjectOutput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CopyObjectResult *CopyObjectResult `protobuf:"bytes,1,opt,name=CopyObjectResult,proto3" json:"CopyObjectResult,omitempty"` + CopyObjectResult *CopyObjectResult `protobuf:"bytes,1,opt,name=copy_object_result,json=copyObjectResult,proto3" json:"copy_object_result,omitempty"` } func (x *CopyObjectOutput) Reset() { *x = CopyObjectOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[16] + mi := &file_oss_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1288,7 +1423,7 @@ func (x *CopyObjectOutput) String() string { func (*CopyObjectOutput) ProtoMessage() {} func (x *CopyObjectOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[16] + mi := &file_oss_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1301,7 +1436,7 @@ func (x *CopyObjectOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use CopyObjectOutput.ProtoReflect.Descriptor instead. func (*CopyObjectOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{16} + return file_oss_proto_rawDescGZIP(), []int{16} } func (x *CopyObjectOutput) GetCopyObjectResult() *CopyObjectResult { @@ -1323,7 +1458,7 @@ type Delete struct { func (x *Delete) Reset() { *x = Delete{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[17] + mi := &file_oss_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1336,7 +1471,7 @@ func (x *Delete) String() string { func (*Delete) ProtoMessage() {} func (x *Delete) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[17] + mi := &file_oss_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1349,7 +1484,7 @@ func (x *Delete) ProtoReflect() protoreflect.Message { // Deprecated: Use Delete.ProtoReflect.Descriptor instead. func (*Delete) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{17} + return file_oss_proto_rawDescGZIP(), []int{17} } func (x *Delete) GetObjects() []*ObjectIdentifier { @@ -1378,7 +1513,7 @@ type ObjectIdentifier struct { func (x *ObjectIdentifier) Reset() { *x = ObjectIdentifier{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[18] + mi := &file_oss_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1391,7 +1526,7 @@ func (x *ObjectIdentifier) String() string { func (*ObjectIdentifier) ProtoMessage() {} func (x *ObjectIdentifier) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[18] + mi := &file_oss_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1404,7 +1539,7 @@ func (x *ObjectIdentifier) ProtoReflect() protoreflect.Message { // Deprecated: Use ObjectIdentifier.ProtoReflect.Descriptor instead. func (*ObjectIdentifier) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{18} + return file_oss_proto_rawDescGZIP(), []int{18} } func (x *ObjectIdentifier) GetKey() string { @@ -1435,7 +1570,7 @@ type DeleteObjectsInput struct { func (x *DeleteObjectsInput) Reset() { *x = DeleteObjectsInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[19] + mi := &file_oss_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1448,7 +1583,7 @@ func (x *DeleteObjectsInput) String() string { func (*DeleteObjectsInput) ProtoMessage() {} func (x *DeleteObjectsInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[19] + mi := &file_oss_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1461,7 +1596,7 @@ func (x *DeleteObjectsInput) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteObjectsInput.ProtoReflect.Descriptor instead. func (*DeleteObjectsInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{19} + return file_oss_proto_rawDescGZIP(), []int{19} } func (x *DeleteObjectsInput) GetStoreName() string { @@ -1506,7 +1641,7 @@ type DeletedObject struct { func (x *DeletedObject) Reset() { *x = DeletedObject{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[20] + mi := &file_oss_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1519,7 +1654,7 @@ func (x *DeletedObject) String() string { func (*DeletedObject) ProtoMessage() {} func (x *DeletedObject) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[20] + mi := &file_oss_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1532,7 +1667,7 @@ func (x *DeletedObject) ProtoReflect() protoreflect.Message { // Deprecated: Use DeletedObject.ProtoReflect.Descriptor instead. func (*DeletedObject) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{20} + return file_oss_proto_rawDescGZIP(), []int{20} } func (x *DeletedObject) GetDeleteMarker() bool { @@ -1574,7 +1709,7 @@ type DeleteObjectsOutput struct { func (x *DeleteObjectsOutput) Reset() { *x = DeleteObjectsOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[21] + mi := &file_oss_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1587,7 +1722,7 @@ func (x *DeleteObjectsOutput) String() string { func (*DeleteObjectsOutput) ProtoMessage() {} func (x *DeleteObjectsOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[21] + mi := &file_oss_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1600,7 +1735,7 @@ func (x *DeleteObjectsOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteObjectsOutput.ProtoReflect.Descriptor instead. func (*DeleteObjectsOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{21} + return file_oss_proto_rawDescGZIP(), []int{21} } func (x *DeleteObjectsOutput) GetDeleted() []*DeletedObject { @@ -1629,7 +1764,7 @@ type ListObjectsInput struct { func (x *ListObjectsInput) Reset() { *x = ListObjectsInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[22] + mi := &file_oss_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1642,7 +1777,7 @@ func (x *ListObjectsInput) String() string { func (*ListObjectsInput) ProtoMessage() {} func (x *ListObjectsInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[22] + mi := &file_oss_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1655,7 +1790,7 @@ func (x *ListObjectsInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListObjectsInput.ProtoReflect.Descriptor instead. func (*ListObjectsInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{22} + return file_oss_proto_rawDescGZIP(), []int{22} } func (x *ListObjectsInput) GetStoreName() string { @@ -1741,7 +1876,7 @@ type ListObjectsOutput struct { func (x *ListObjectsOutput) Reset() { *x = ListObjectsOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[23] + mi := &file_oss_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1754,7 +1889,7 @@ func (x *ListObjectsOutput) String() string { func (*ListObjectsOutput) ProtoMessage() {} func (x *ListObjectsOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[23] + mi := &file_oss_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1767,7 +1902,7 @@ func (x *ListObjectsOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListObjectsOutput.ProtoReflect.Descriptor instead. func (*ListObjectsOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{23} + return file_oss_proto_rawDescGZIP(), []int{23} } func (x *ListObjectsOutput) GetCommonPrefixes() []string { @@ -1852,7 +1987,7 @@ type Owner struct { func (x *Owner) Reset() { *x = Owner{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[24] + mi := &file_oss_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1865,7 +2000,7 @@ func (x *Owner) String() string { func (*Owner) ProtoMessage() {} func (x *Owner) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[24] + mi := &file_oss_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1878,7 +2013,7 @@ func (x *Owner) ProtoReflect() protoreflect.Message { // Deprecated: Use Owner.ProtoReflect.Descriptor instead. func (*Owner) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{24} + return file_oss_proto_rawDescGZIP(), []int{24} } func (x *Owner) GetDisplayName() string { @@ -1911,7 +2046,7 @@ type Object struct { func (x *Object) Reset() { *x = Object{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[25] + mi := &file_oss_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1924,7 +2059,7 @@ func (x *Object) String() string { func (*Object) ProtoMessage() {} func (x *Object) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[25] + mi := &file_oss_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1937,7 +2072,7 @@ func (x *Object) ProtoReflect() protoreflect.Message { // Deprecated: Use Object.ProtoReflect.Descriptor instead. func (*Object) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{25} + return file_oss_proto_rawDescGZIP(), []int{25} } func (x *Object) GetEtag() string { @@ -1997,7 +2132,7 @@ type Grantee struct { func (x *Grantee) Reset() { *x = Grantee{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[26] + mi := &file_oss_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2010,7 +2145,7 @@ func (x *Grantee) String() string { func (*Grantee) ProtoMessage() {} func (x *Grantee) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[26] + mi := &file_oss_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2023,7 +2158,7 @@ func (x *Grantee) ProtoReflect() protoreflect.Message { // Deprecated: Use Grantee.ProtoReflect.Descriptor instead. func (*Grantee) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{26} + return file_oss_proto_rawDescGZIP(), []int{26} } func (x *Grantee) GetDisplayName() string { @@ -2073,7 +2208,7 @@ type Grant struct { func (x *Grant) Reset() { *x = Grant{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[27] + mi := &file_oss_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2086,7 +2221,7 @@ func (x *Grant) String() string { func (*Grant) ProtoMessage() {} func (x *Grant) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[27] + mi := &file_oss_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2099,7 +2234,7 @@ func (x *Grant) ProtoReflect() protoreflect.Message { // Deprecated: Use Grant.ProtoReflect.Descriptor instead. func (*Grant) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{27} + return file_oss_proto_rawDescGZIP(), []int{27} } func (x *Grant) GetGrantee() *Grantee { @@ -2129,7 +2264,7 @@ type GetObjectAclInput struct { func (x *GetObjectAclInput) Reset() { *x = GetObjectAclInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[28] + mi := &file_oss_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2142,7 +2277,7 @@ func (x *GetObjectAclInput) String() string { func (*GetObjectAclInput) ProtoMessage() {} func (x *GetObjectAclInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[28] + mi := &file_oss_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2155,7 +2290,7 @@ func (x *GetObjectAclInput) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObjectAclInput.ProtoReflect.Descriptor instead. func (*GetObjectAclInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{28} + return file_oss_proto_rawDescGZIP(), []int{28} } func (x *GetObjectAclInput) GetStoreName() string { @@ -2192,7 +2327,7 @@ type GetObjectAclOutput struct { func (x *GetObjectAclOutput) Reset() { *x = GetObjectAclOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[29] + mi := &file_oss_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2205,7 +2340,7 @@ func (x *GetObjectAclOutput) String() string { func (*GetObjectAclOutput) ProtoMessage() {} func (x *GetObjectAclOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[29] + mi := &file_oss_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2218,7 +2353,7 @@ func (x *GetObjectAclOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObjectAclOutput.ProtoReflect.Descriptor instead. func (*GetObjectAclOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{29} + return file_oss_proto_rawDescGZIP(), []int{29} } func (x *GetObjectAclOutput) GetGrants() []*Grant { @@ -2256,7 +2391,7 @@ type PutObjectAclInput struct { func (x *PutObjectAclInput) Reset() { *x = PutObjectAclInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[30] + mi := &file_oss_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2269,7 +2404,7 @@ func (x *PutObjectAclInput) String() string { func (*PutObjectAclInput) ProtoMessage() {} func (x *PutObjectAclInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[30] + mi := &file_oss_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2282,7 +2417,7 @@ func (x *PutObjectAclInput) ProtoReflect() protoreflect.Message { // Deprecated: Use PutObjectAclInput.ProtoReflect.Descriptor instead. func (*PutObjectAclInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{30} + return file_oss_proto_rawDescGZIP(), []int{30} } func (x *PutObjectAclInput) GetStoreName() string { @@ -2324,7 +2459,7 @@ type PutObjectAclOutput struct { func (x *PutObjectAclOutput) Reset() { *x = PutObjectAclOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[31] + mi := &file_oss_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2337,7 +2472,7 @@ func (x *PutObjectAclOutput) String() string { func (*PutObjectAclOutput) ProtoMessage() {} func (x *PutObjectAclOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[31] + mi := &file_oss_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2350,7 +2485,7 @@ func (x *PutObjectAclOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use PutObjectAclOutput.ProtoReflect.Descriptor instead. func (*PutObjectAclOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{31} + return file_oss_proto_rawDescGZIP(), []int{31} } func (x *PutObjectAclOutput) GetRequestCharged() string { @@ -2373,7 +2508,7 @@ type RestoreObjectInput struct { func (x *RestoreObjectInput) Reset() { *x = RestoreObjectInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[32] + mi := &file_oss_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2386,7 +2521,7 @@ func (x *RestoreObjectInput) String() string { func (*RestoreObjectInput) ProtoMessage() {} func (x *RestoreObjectInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[32] + mi := &file_oss_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2399,7 +2534,7 @@ func (x *RestoreObjectInput) ProtoReflect() protoreflect.Message { // Deprecated: Use RestoreObjectInput.ProtoReflect.Descriptor instead. func (*RestoreObjectInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{32} + return file_oss_proto_rawDescGZIP(), []int{32} } func (x *RestoreObjectInput) GetStoreName() string { @@ -2435,7 +2570,7 @@ type RestoreObjectOutput struct { func (x *RestoreObjectOutput) Reset() { *x = RestoreObjectOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[33] + mi := &file_oss_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2448,7 +2583,7 @@ func (x *RestoreObjectOutput) String() string { func (*RestoreObjectOutput) ProtoMessage() {} func (x *RestoreObjectOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[33] + mi := &file_oss_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2461,7 +2596,7 @@ func (x *RestoreObjectOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use RestoreObjectOutput.ProtoReflect.Descriptor instead. func (*RestoreObjectOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{33} + return file_oss_proto_rawDescGZIP(), []int{33} } func (x *RestoreObjectOutput) GetRequestCharged() string { @@ -2518,7 +2653,7 @@ type CreateMultipartUploadInput struct { func (x *CreateMultipartUploadInput) Reset() { *x = CreateMultipartUploadInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[34] + mi := &file_oss_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2531,7 +2666,7 @@ func (x *CreateMultipartUploadInput) String() string { func (*CreateMultipartUploadInput) ProtoMessage() {} func (x *CreateMultipartUploadInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[34] + mi := &file_oss_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2544,7 +2679,7 @@ func (x *CreateMultipartUploadInput) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateMultipartUploadInput.ProtoReflect.Descriptor instead. func (*CreateMultipartUploadInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{34} + return file_oss_proto_rawDescGZIP(), []int{34} } func (x *CreateMultipartUploadInput) GetStoreName() string { @@ -2779,7 +2914,7 @@ type CreateMultipartUploadOutput struct { func (x *CreateMultipartUploadOutput) Reset() { *x = CreateMultipartUploadOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[35] + mi := &file_oss_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2792,7 +2927,7 @@ func (x *CreateMultipartUploadOutput) String() string { func (*CreateMultipartUploadOutput) ProtoMessage() {} func (x *CreateMultipartUploadOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[35] + mi := &file_oss_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2805,7 +2940,7 @@ func (x *CreateMultipartUploadOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateMultipartUploadOutput.ProtoReflect.Descriptor instead. func (*CreateMultipartUploadOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{35} + return file_oss_proto_rawDescGZIP(), []int{35} } func (x *CreateMultipartUploadOutput) GetBucket() string { @@ -2915,7 +3050,7 @@ type UploadPartInput struct { func (x *UploadPartInput) Reset() { *x = UploadPartInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[36] + mi := &file_oss_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2928,7 +3063,7 @@ func (x *UploadPartInput) String() string { func (*UploadPartInput) ProtoMessage() {} func (x *UploadPartInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[36] + mi := &file_oss_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2941,7 +3076,7 @@ func (x *UploadPartInput) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadPartInput.ProtoReflect.Descriptor instead. func (*UploadPartInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{36} + return file_oss_proto_rawDescGZIP(), []int{36} } func (x *UploadPartInput) GetStoreName() string { @@ -3052,7 +3187,7 @@ type UploadPartOutput struct { func (x *UploadPartOutput) Reset() { *x = UploadPartOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[37] + mi := &file_oss_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3065,7 +3200,7 @@ func (x *UploadPartOutput) String() string { func (*UploadPartOutput) ProtoMessage() {} func (x *UploadPartOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[37] + mi := &file_oss_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3078,7 +3213,7 @@ func (x *UploadPartOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadPartOutput.ProtoReflect.Descriptor instead. func (*UploadPartOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{37} + return file_oss_proto_rawDescGZIP(), []int{37} } func (x *UploadPartOutput) GetBucketKeyEnabled() bool { @@ -3148,7 +3283,7 @@ type UploadPartCopyInput struct { func (x *UploadPartCopyInput) Reset() { *x = UploadPartCopyInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[38] + mi := &file_oss_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3161,7 +3296,7 @@ func (x *UploadPartCopyInput) String() string { func (*UploadPartCopyInput) ProtoMessage() {} func (x *UploadPartCopyInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[38] + mi := &file_oss_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3174,7 +3309,7 @@ func (x *UploadPartCopyInput) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadPartCopyInput.ProtoReflect.Descriptor instead. func (*UploadPartCopyInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{38} + return file_oss_proto_rawDescGZIP(), []int{38} } func (x *UploadPartCopyInput) GetStoreName() string { @@ -3245,7 +3380,7 @@ type CopyPartResult struct { func (x *CopyPartResult) Reset() { *x = CopyPartResult{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[39] + mi := &file_oss_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3258,7 +3393,7 @@ func (x *CopyPartResult) String() string { func (*CopyPartResult) ProtoMessage() {} func (x *CopyPartResult) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[39] + mi := &file_oss_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3271,7 +3406,7 @@ func (x *CopyPartResult) ProtoReflect() protoreflect.Message { // Deprecated: Use CopyPartResult.ProtoReflect.Descriptor instead. func (*CopyPartResult) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{39} + return file_oss_proto_rawDescGZIP(), []int{39} } func (x *CopyPartResult) GetEtag() string { @@ -3306,7 +3441,7 @@ type UploadPartCopyOutput struct { func (x *UploadPartCopyOutput) Reset() { *x = UploadPartCopyOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[40] + mi := &file_oss_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3319,7 +3454,7 @@ func (x *UploadPartCopyOutput) String() string { func (*UploadPartCopyOutput) ProtoMessage() {} func (x *UploadPartCopyOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[40] + mi := &file_oss_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3332,7 +3467,7 @@ func (x *UploadPartCopyOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadPartCopyOutput.ProtoReflect.Descriptor instead. func (*UploadPartCopyOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{40} + return file_oss_proto_rawDescGZIP(), []int{40} } func (x *UploadPartCopyOutput) GetBucketKeyEnabled() bool { @@ -3403,7 +3538,7 @@ type CompletedPart struct { func (x *CompletedPart) Reset() { *x = CompletedPart{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[41] + mi := &file_oss_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3416,7 +3551,7 @@ func (x *CompletedPart) String() string { func (*CompletedPart) ProtoMessage() {} func (x *CompletedPart) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[41] + mi := &file_oss_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3429,7 +3564,7 @@ func (x *CompletedPart) ProtoReflect() protoreflect.Message { // Deprecated: Use CompletedPart.ProtoReflect.Descriptor instead. func (*CompletedPart) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{41} + return file_oss_proto_rawDescGZIP(), []int{41} } func (x *CompletedPart) GetEtag() string { @@ -3457,7 +3592,7 @@ type CompletedMultipartUpload struct { func (x *CompletedMultipartUpload) Reset() { *x = CompletedMultipartUpload{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[42] + mi := &file_oss_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3470,7 +3605,7 @@ func (x *CompletedMultipartUpload) String() string { func (*CompletedMultipartUpload) ProtoMessage() {} func (x *CompletedMultipartUpload) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[42] + mi := &file_oss_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3483,7 +3618,7 @@ func (x *CompletedMultipartUpload) ProtoReflect() protoreflect.Message { // Deprecated: Use CompletedMultipartUpload.ProtoReflect.Descriptor instead. func (*CompletedMultipartUpload) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{42} + return file_oss_proto_rawDescGZIP(), []int{42} } func (x *CompletedMultipartUpload) GetParts() []*CompletedPart { @@ -3510,7 +3645,7 @@ type CompleteMultipartUploadInput struct { func (x *CompleteMultipartUploadInput) Reset() { *x = CompleteMultipartUploadInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[43] + mi := &file_oss_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3523,7 +3658,7 @@ func (x *CompleteMultipartUploadInput) String() string { func (*CompleteMultipartUploadInput) ProtoMessage() {} func (x *CompleteMultipartUploadInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[43] + mi := &file_oss_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3536,7 +3671,7 @@ func (x *CompleteMultipartUploadInput) ProtoReflect() protoreflect.Message { // Deprecated: Use CompleteMultipartUploadInput.ProtoReflect.Descriptor instead. func (*CompleteMultipartUploadInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{43} + return file_oss_proto_rawDescGZIP(), []int{43} } func (x *CompleteMultipartUploadInput) GetStoreName() string { @@ -3608,7 +3743,7 @@ type CompleteMultipartUploadOutput struct { func (x *CompleteMultipartUploadOutput) Reset() { *x = CompleteMultipartUploadOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[44] + mi := &file_oss_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3621,7 +3756,7 @@ func (x *CompleteMultipartUploadOutput) String() string { func (*CompleteMultipartUploadOutput) ProtoMessage() {} func (x *CompleteMultipartUploadOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[44] + mi := &file_oss_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3634,7 +3769,7 @@ func (x *CompleteMultipartUploadOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use CompleteMultipartUploadOutput.ProtoReflect.Descriptor instead. func (*CompleteMultipartUploadOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{44} + return file_oss_proto_rawDescGZIP(), []int{44} } func (x *CompleteMultipartUploadOutput) GetBucket() string { @@ -3723,7 +3858,7 @@ type AbortMultipartUploadInput struct { func (x *AbortMultipartUploadInput) Reset() { *x = AbortMultipartUploadInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[45] + mi := &file_oss_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3736,7 +3871,7 @@ func (x *AbortMultipartUploadInput) String() string { func (*AbortMultipartUploadInput) ProtoMessage() {} func (x *AbortMultipartUploadInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[45] + mi := &file_oss_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3749,7 +3884,7 @@ func (x *AbortMultipartUploadInput) ProtoReflect() protoreflect.Message { // Deprecated: Use AbortMultipartUploadInput.ProtoReflect.Descriptor instead. func (*AbortMultipartUploadInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{45} + return file_oss_proto_rawDescGZIP(), []int{45} } func (x *AbortMultipartUploadInput) GetStoreName() string { @@ -3805,7 +3940,7 @@ type AbortMultipartUploadOutput struct { func (x *AbortMultipartUploadOutput) Reset() { *x = AbortMultipartUploadOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[46] + mi := &file_oss_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3818,7 +3953,7 @@ func (x *AbortMultipartUploadOutput) String() string { func (*AbortMultipartUploadOutput) ProtoMessage() {} func (x *AbortMultipartUploadOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[46] + mi := &file_oss_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3831,7 +3966,7 @@ func (x *AbortMultipartUploadOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use AbortMultipartUploadOutput.ProtoReflect.Descriptor instead. func (*AbortMultipartUploadOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{46} + return file_oss_proto_rawDescGZIP(), []int{46} } func (x *AbortMultipartUploadOutput) GetRequestCharged() string { @@ -3860,7 +3995,7 @@ type ListMultipartUploadsInput struct { func (x *ListMultipartUploadsInput) Reset() { *x = ListMultipartUploadsInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[47] + mi := &file_oss_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3873,7 +4008,7 @@ func (x *ListMultipartUploadsInput) String() string { func (*ListMultipartUploadsInput) ProtoMessage() {} func (x *ListMultipartUploadsInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[47] + mi := &file_oss_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3886,7 +4021,7 @@ func (x *ListMultipartUploadsInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMultipartUploadsInput.ProtoReflect.Descriptor instead. func (*ListMultipartUploadsInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{47} + return file_oss_proto_rawDescGZIP(), []int{47} } func (x *ListMultipartUploadsInput) GetStoreName() string { @@ -3964,7 +4099,7 @@ type Initiator struct { func (x *Initiator) Reset() { *x = Initiator{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[48] + mi := &file_oss_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3977,7 +4112,7 @@ func (x *Initiator) String() string { func (*Initiator) ProtoMessage() {} func (x *Initiator) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[48] + mi := &file_oss_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3990,7 +4125,7 @@ func (x *Initiator) ProtoReflect() protoreflect.Message { // Deprecated: Use Initiator.ProtoReflect.Descriptor instead. func (*Initiator) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{48} + return file_oss_proto_rawDescGZIP(), []int{48} } func (x *Initiator) GetDisplayName() string { @@ -4023,7 +4158,7 @@ type MultipartUpload struct { func (x *MultipartUpload) Reset() { *x = MultipartUpload{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[49] + mi := &file_oss_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4036,7 +4171,7 @@ func (x *MultipartUpload) String() string { func (*MultipartUpload) ProtoMessage() {} func (x *MultipartUpload) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[49] + mi := &file_oss_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4049,7 +4184,7 @@ func (x *MultipartUpload) ProtoReflect() protoreflect.Message { // Deprecated: Use MultipartUpload.ProtoReflect.Descriptor instead. func (*MultipartUpload) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{49} + return file_oss_proto_rawDescGZIP(), []int{49} } func (x *MultipartUpload) GetInitiated() int64 { @@ -4116,7 +4251,7 @@ type ListMultipartUploadsOutput struct { func (x *ListMultipartUploadsOutput) Reset() { *x = ListMultipartUploadsOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[50] + mi := &file_oss_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4129,7 +4264,7 @@ func (x *ListMultipartUploadsOutput) String() string { func (*ListMultipartUploadsOutput) ProtoMessage() {} func (x *ListMultipartUploadsOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[50] + mi := &file_oss_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4142,7 +4277,7 @@ func (x *ListMultipartUploadsOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMultipartUploadsOutput.ProtoReflect.Descriptor instead. func (*ListMultipartUploadsOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{50} + return file_oss_proto_rawDescGZIP(), []int{50} } func (x *ListMultipartUploadsOutput) GetBucket() string { @@ -4248,7 +4383,7 @@ type ListObjectVersionsInput struct { func (x *ListObjectVersionsInput) Reset() { *x = ListObjectVersionsInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[51] + mi := &file_oss_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4261,7 +4396,7 @@ func (x *ListObjectVersionsInput) String() string { func (*ListObjectVersionsInput) ProtoMessage() {} func (x *ListObjectVersionsInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[51] + mi := &file_oss_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4274,7 +4409,7 @@ func (x *ListObjectVersionsInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListObjectVersionsInput.ProtoReflect.Descriptor instead. func (*ListObjectVersionsInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{51} + return file_oss_proto_rawDescGZIP(), []int{51} } func (x *ListObjectVersionsInput) GetStoreName() string { @@ -4355,7 +4490,7 @@ type DeleteMarkerEntry struct { func (x *DeleteMarkerEntry) Reset() { *x = DeleteMarkerEntry{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[52] + mi := &file_oss_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4368,7 +4503,7 @@ func (x *DeleteMarkerEntry) String() string { func (*DeleteMarkerEntry) ProtoMessage() {} func (x *DeleteMarkerEntry) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[52] + mi := &file_oss_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4381,7 +4516,7 @@ func (x *DeleteMarkerEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteMarkerEntry.ProtoReflect.Descriptor instead. func (*DeleteMarkerEntry) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{52} + return file_oss_proto_rawDescGZIP(), []int{52} } func (x *DeleteMarkerEntry) GetIsLatest() bool { @@ -4437,7 +4572,7 @@ type ObjectVersion struct { func (x *ObjectVersion) Reset() { *x = ObjectVersion{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[53] + mi := &file_oss_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4450,7 +4585,7 @@ func (x *ObjectVersion) String() string { func (*ObjectVersion) ProtoMessage() {} func (x *ObjectVersion) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[53] + mi := &file_oss_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4463,7 +4598,7 @@ func (x *ObjectVersion) ProtoReflect() protoreflect.Message { // Deprecated: Use ObjectVersion.ProtoReflect.Descriptor instead. func (*ObjectVersion) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{53} + return file_oss_proto_rawDescGZIP(), []int{53} } func (x *ObjectVersion) GetEtag() string { @@ -4545,7 +4680,7 @@ type ListObjectVersionsOutput struct { func (x *ListObjectVersionsOutput) Reset() { *x = ListObjectVersionsOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[54] + mi := &file_oss_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4558,7 +4693,7 @@ func (x *ListObjectVersionsOutput) String() string { func (*ListObjectVersionsOutput) ProtoMessage() {} func (x *ListObjectVersionsOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[54] + mi := &file_oss_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4571,7 +4706,7 @@ func (x *ListObjectVersionsOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListObjectVersionsOutput.ProtoReflect.Descriptor instead. func (*ListObjectVersionsOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{54} + return file_oss_proto_rawDescGZIP(), []int{54} } func (x *ListObjectVersionsOutput) GetCommonPrefixes() []string { @@ -4692,7 +4827,7 @@ type HeadObjectInput struct { func (x *HeadObjectInput) Reset() { *x = HeadObjectInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[55] + mi := &file_oss_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4705,7 +4840,7 @@ func (x *HeadObjectInput) String() string { func (*HeadObjectInput) ProtoMessage() {} func (x *HeadObjectInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[55] + mi := &file_oss_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4718,7 +4853,7 @@ func (x *HeadObjectInput) ProtoReflect() protoreflect.Message { // Deprecated: Use HeadObjectInput.ProtoReflect.Descriptor instead. func (*HeadObjectInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{55} + return file_oss_proto_rawDescGZIP(), []int{55} } func (x *HeadObjectInput) GetStoreName() string { @@ -4839,13 +4974,13 @@ type HeadObjectOutput struct { unknownFields protoimpl.UnknownFields // Metadata pertaining to the operation's result. - ResultMetadata map[string]string `protobuf:"bytes,1,rep,name=ResultMetadata,proto3" json:"ResultMetadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + 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 *HeadObjectOutput) Reset() { *x = HeadObjectOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[56] + mi := &file_oss_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4858,7 +4993,7 @@ func (x *HeadObjectOutput) String() string { func (*HeadObjectOutput) ProtoMessage() {} func (x *HeadObjectOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[56] + mi := &file_oss_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4871,7 +5006,7 @@ func (x *HeadObjectOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use HeadObjectOutput.ProtoReflect.Descriptor instead. func (*HeadObjectOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{56} + return file_oss_proto_rawDescGZIP(), []int{56} } func (x *HeadObjectOutput) GetResultMetadata() map[string]string { @@ -4894,7 +5029,7 @@ type IsObjectExistInput struct { func (x *IsObjectExistInput) Reset() { *x = IsObjectExistInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[57] + mi := &file_oss_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4907,7 +5042,7 @@ func (x *IsObjectExistInput) String() string { func (*IsObjectExistInput) ProtoMessage() {} func (x *IsObjectExistInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[57] + mi := &file_oss_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4920,7 +5055,7 @@ func (x *IsObjectExistInput) ProtoReflect() protoreflect.Message { // Deprecated: Use IsObjectExistInput.ProtoReflect.Descriptor instead. func (*IsObjectExistInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{57} + return file_oss_proto_rawDescGZIP(), []int{57} } func (x *IsObjectExistInput) GetStoreName() string { @@ -4955,7 +5090,7 @@ type IsObjectExistOutput struct { func (x *IsObjectExistOutput) Reset() { *x = IsObjectExistOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[58] + mi := &file_oss_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4968,7 +5103,7 @@ func (x *IsObjectExistOutput) String() string { func (*IsObjectExistOutput) ProtoMessage() {} func (x *IsObjectExistOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[58] + mi := &file_oss_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4981,7 +5116,7 @@ func (x *IsObjectExistOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use IsObjectExistOutput.ProtoReflect.Descriptor instead. func (*IsObjectExistOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{58} + return file_oss_proto_rawDescGZIP(), []int{58} } func (x *IsObjectExistOutput) GetFileExist() bool { @@ -5006,7 +5141,7 @@ type SignURLInput struct { func (x *SignURLInput) Reset() { *x = SignURLInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[59] + mi := &file_oss_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5019,7 +5154,7 @@ func (x *SignURLInput) String() string { func (*SignURLInput) ProtoMessage() {} func (x *SignURLInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[59] + mi := &file_oss_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5032,7 +5167,7 @@ func (x *SignURLInput) ProtoReflect() protoreflect.Message { // Deprecated: Use SignURLInput.ProtoReflect.Descriptor instead. func (*SignURLInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{59} + return file_oss_proto_rawDescGZIP(), []int{59} } func (x *SignURLInput) GetStoreName() string { @@ -5081,7 +5216,7 @@ type SignURLOutput struct { func (x *SignURLOutput) Reset() { *x = SignURLOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[60] + mi := &file_oss_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5094,7 +5229,7 @@ func (x *SignURLOutput) String() string { func (*SignURLOutput) ProtoMessage() {} func (x *SignURLOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[60] + mi := &file_oss_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5107,7 +5242,7 @@ func (x *SignURLOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use SignURLOutput.ProtoReflect.Descriptor instead. func (*SignURLOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{60} + return file_oss_proto_rawDescGZIP(), []int{60} } func (x *SignURLOutput) GetSignedUrl() string { @@ -5132,7 +5267,7 @@ type UpdateBandwidthRateLimitInput struct { func (x *UpdateBandwidthRateLimitInput) Reset() { *x = UpdateBandwidthRateLimitInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[61] + mi := &file_oss_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5145,7 +5280,7 @@ func (x *UpdateBandwidthRateLimitInput) String() string { func (*UpdateBandwidthRateLimitInput) ProtoMessage() {} func (x *UpdateBandwidthRateLimitInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[61] + mi := &file_oss_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5158,7 +5293,7 @@ func (x *UpdateBandwidthRateLimitInput) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateBandwidthRateLimitInput.ProtoReflect.Descriptor instead. func (*UpdateBandwidthRateLimitInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{61} + return file_oss_proto_rawDescGZIP(), []int{61} } func (x *UpdateBandwidthRateLimitInput) GetStoreName() string { @@ -5207,7 +5342,7 @@ type AppendObjectInput struct { func (x *AppendObjectInput) Reset() { *x = AppendObjectInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[62] + mi := &file_oss_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5220,7 +5355,7 @@ func (x *AppendObjectInput) String() string { func (*AppendObjectInput) ProtoMessage() {} func (x *AppendObjectInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[62] + mi := &file_oss_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5233,7 +5368,7 @@ func (x *AppendObjectInput) ProtoReflect() protoreflect.Message { // Deprecated: Use AppendObjectInput.ProtoReflect.Descriptor instead. func (*AppendObjectInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{62} + return file_oss_proto_rawDescGZIP(), []int{62} } func (x *AppendObjectInput) GetStoreName() string { @@ -5352,7 +5487,7 @@ type AppendObjectOutput struct { func (x *AppendObjectOutput) Reset() { *x = AppendObjectOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[63] + mi := &file_oss_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5365,7 +5500,7 @@ func (x *AppendObjectOutput) String() string { func (*AppendObjectOutput) ProtoMessage() {} func (x *AppendObjectOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[63] + mi := &file_oss_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5378,7 +5513,7 @@ func (x *AppendObjectOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use AppendObjectOutput.ProtoReflect.Descriptor instead. func (*AppendObjectOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{63} + return file_oss_proto_rawDescGZIP(), []int{63} } func (x *AppendObjectOutput) GetAppendPosition() int64 { @@ -5406,7 +5541,7 @@ type ListPartsInput struct { func (x *ListPartsInput) Reset() { *x = ListPartsInput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[64] + mi := &file_oss_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5419,7 +5554,7 @@ func (x *ListPartsInput) String() string { func (*ListPartsInput) ProtoMessage() {} func (x *ListPartsInput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[64] + mi := &file_oss_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5432,7 +5567,7 @@ func (x *ListPartsInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPartsInput.ProtoReflect.Descriptor instead. func (*ListPartsInput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{64} + return file_oss_proto_rawDescGZIP(), []int{64} } func (x *ListPartsInput) GetStoreName() string { @@ -5505,7 +5640,7 @@ type Part struct { func (x *Part) Reset() { *x = Part{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[65] + mi := &file_oss_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5518,7 +5653,7 @@ func (x *Part) String() string { func (*Part) ProtoMessage() {} func (x *Part) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[65] + mi := &file_oss_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5531,7 +5666,7 @@ func (x *Part) ProtoReflect() protoreflect.Message { // Deprecated: Use Part.ProtoReflect.Descriptor instead. func (*Part) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{65} + return file_oss_proto_rawDescGZIP(), []int{65} } func (x *Part) GetEtag() string { @@ -5579,7 +5714,7 @@ type ListPartsOutput struct { func (x *ListPartsOutput) Reset() { *x = ListPartsOutput{} if protoimpl.UnsafeEnabled { - mi := &file_s3_proto_msgTypes[66] + mi := &file_oss_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5592,7 +5727,7 @@ func (x *ListPartsOutput) String() string { func (*ListPartsOutput) ProtoMessage() {} func (x *ListPartsOutput) ProtoReflect() protoreflect.Message { - mi := &file_s3_proto_msgTypes[66] + mi := &file_oss_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5605,7 +5740,7 @@ func (x *ListPartsOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPartsOutput.ProtoReflect.Descriptor instead. func (*ListPartsOutput) Descriptor() ([]byte, []int) { - return file_s3_proto_rawDescGZIP(), []int{66} + return file_oss_proto_rawDescGZIP(), []int{66} } func (x *ListPartsOutput) GetBucket() string { @@ -5657,155 +5792,200 @@ func (x *ListPartsOutput) GetParts() []*Part { return nil } -var File_s3_proto protoreflect.FileDescriptor +var File_oss_proto protoreflect.FileDescriptor -var file_s3_proto_rawDesc = []byte{ - 0x0a, 0x08, 0x73, 0x33, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x6d, 0x6f, 0x73, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 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, 0xb3, - 0x01, 0x0a, 0x09, 0x49, 0x6e, 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, 0x4a, 0x0a, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, - 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x69, 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, 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, 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, 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, 0x03, 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, 0x04, - 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, 0x05, 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, 0x06, 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, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x69, 0x66, 0x55, 0x6e, - 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x65, 0x72, 0x12, 0x34, 0x0a, - 0x16, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x12, 0x40, 0x0a, 0x1c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, - 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, - 0x67, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, - 0x15, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x65, 0x78, - 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 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, 0x13, 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, 0x14, 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, 0x15, 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, 0x16, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, - 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, - 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x65, - 0x64, 0x55, 0x72, 0x6c, 0x22, 0x25, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x9b, 0x04, 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, 0x10, 0x0a, - 0x03, 0x61, 0x63, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x12, - 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, - 0x6f, 0x64, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x05, 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, 0x06, 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, 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, 0x43, 0x0a, 0x04, 0x6d, - 0x65, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 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, - 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, +var file_oss_proto_rawDesc = []byte{ + 0x0a, 0x09, 0x6f, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x17, 0x73, 0x70, 0x65, + 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x31, 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, 0xb5, 0x01, 0x0a, 0x09, 0x49, 0x6e, 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, 0x4c, + 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 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, 0x49, 0x6e, 0x69, 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, 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, 0x53, 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, 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, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 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, 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, 0x03, 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, 0x04, 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, 0x05, 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, + 0x06, 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, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x11, 0x69, 0x66, 0x55, 0x6e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x53, 0x69, 0x6e, + 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, + 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x23, 0x0a, + 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x0c, 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, 0x84, 0x02, 0x0a, 0x15, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, - 0x6b, 0x65, 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, 0x4a, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x14, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x40, 0x0a, 0x1c, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x44, + 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, + 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, + 0x61, 0x67, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, + 0x67, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x13, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, + 0x73, 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, 0x13, 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, 0x14, 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, 0x15, 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, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x63, 0x65, + 0x70, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x55, 0x72, 0x6c, 0x22, 0xeb, 0x05, 0x0a, 0x0f, 0x47, 0x65, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, + 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x18, 0x02, 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, 0x03, 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, 0x04, 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, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x25, 0x0a, + 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x72, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x0a, 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, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x12, + 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x67, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x74, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, + 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x52, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 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, 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, 0x9d, 0x04, 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, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x62, + 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, + 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x05, + 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, + 0x06, 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, 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, 0x45, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, + 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, + 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, 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, 0x22, 0x53, 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, 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, 0x86, 0x02, 0x0a, 0x15, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, + 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, 0x4c, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, + 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, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 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, @@ -5831,98 +6011,99 @@ var file_s3_proto_rawDesc = []byte{ 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, 0x22, 0x9e, 0x01, 0x0a, 0x16, 0x47, 0x65, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0xa0, 0x01, 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, 0x4b, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 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, 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, 0x03, 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, + 0x74, 0x70, 0x75, 0x74, 0x12, 0x4d, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 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, 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, 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, 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, 0x94, 0x03, 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, 0x44, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 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, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0a, 0x63, + 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x67, + 0x67, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 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, 0x52, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 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, 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, 0x6b, 0x0a, 0x10, 0x43, 0x6f, + 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x57, + 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, 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, 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, 0x22, 0x63, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x12, 0x43, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 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, 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, 0xa9, 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, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x42, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x70, 0x79, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 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, 0x50, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 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, 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, 0x67, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x53, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x10, 0x43, 0x6f, 0x70, - 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x61, 0x0a, - 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x41, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 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, 0xa7, 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, 0x35, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x55, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x3e, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x37, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1f, 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, 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, 0x57, + 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x18, 0x01, 0x20, 0x03, 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, 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, @@ -5943,300 +6124,301 @@ var file_s3_proto_rawDesc = []byte{ 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, 0xdd, 0x02, 0x0a, 0x11, 0x4c, 0x69, + 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x65, 0x72, 0x22, 0xdf, 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, 0x39, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 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, 0xc0, 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, 0x32, 0x0a, 0x05, 0x6f, - 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 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, 0x87, 0x01, 0x0a, 0x07, 0x47, 0x72, 0x61, - 0x6e, 0x74, 0x65, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, + 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 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, 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, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, - 0x72, 0x69, 0x22, 0x61, 0x0a, 0x05, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x67, - 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, - 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x52, 0x07, 0x67, 0x72, - 0x61, 0x6e, 0x74, 0x65, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5c, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 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, 0x22, 0xa7, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x34, 0x0a, 0x06, 0x67, 0x72, - 0x61, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x06, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, - 0x12, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x6e, 0x0a, - 0x11, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x22, 0x3d, 0x0a, - 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x5d, 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, 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, 0xef, 0x0a, 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, + 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0xc2, 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, 0x34, 0x0a, + 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0x87, 0x01, 0x0a, + 0x07, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 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, 0x23, 0x0a, 0x0d, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x22, 0x63, 0x0a, 0x05, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, + 0x3a, 0x0a, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 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, 0x47, 0x72, 0x61, 0x6e, 0x74, + 0x65, 0x65, 0x52, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5c, 0x0a, 0x11, 0x47, + 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x22, 0xab, 0x01, 0x0a, 0x12, 0x47, 0x65, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x12, 0x36, 0x0a, 0x06, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1e, 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, 0x47, 0x72, 0x61, 0x6e, 0x74, + 0x52, 0x06, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0x6e, 0x0a, 0x11, 0x50, 0x75, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 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, 0x22, 0x3d, 0x0a, 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 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, 0x5d, 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, 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, 0xf1, 0x0a, 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, 0x5e, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 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, 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, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, + 0x67, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 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, 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, 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, 0x5c, 0x0a, 0x09, 0x6d, - 0x65, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, - 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, + 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, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x73, + 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, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x73, + 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, 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, 0x18, 0x0a, 0x07, 0x74, 0x61, - 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 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, 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, + 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, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, + 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, 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, 0xa4, 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, 0x42, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xb5, 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, 0x4f, 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, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, + 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, 0xa6, 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, 0x44, 0x0a, + 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 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, 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, 0xb7, 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, 0x51, 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, 0x27, 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, 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, @@ -6261,199 +6443,200 @@ var file_s3_proto_rawDesc = []byte{ 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, 0x56, 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, 0x3a, 0x0a, 0x05, - 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x6f, - 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, - 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x22, 0xb9, 0x02, 0x0a, 0x1c, 0x43, 0x6f, 0x6d, + 0x22, 0x58, 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, 0x3c, 0x0a, 0x05, + 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 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, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, + 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x22, 0xbb, 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, 0x5c, 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, 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, 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, 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, 0x5a, 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, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, + 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, 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, 0xf7, 0x01, 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, 0x3e, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xe2, 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, - 0x40, 0x0a, 0x07, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, + 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, 0xfb, 0x01, 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, 0x40, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 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, 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, 0x34, 0x0a, 0x05, + 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0xe4, 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, 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, 0xba, 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, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x83, 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, 0x32, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0xab, 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, 0x4f, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 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, 0x42, 0x0a, 0x07, 0x75, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 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, 0xbc, 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, 0x34, 0x0a, + 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0x85, 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, 0x34, 0x0a, 0x05, + 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0xaf, 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, 0x51, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 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, 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, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, @@ -6477,555 +6660,565 @@ var file_s3_proto_rawDesc = []byte{ 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, 0x40, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 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, 0xba, 0x01, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x63, 0x0a, 0x0e, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x3b, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, - 0x52, 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, + 0x49, 0x64, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 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, 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, 0xbd, 0x01, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x64, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x66, 0x0a, 0x0f, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 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, 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, 0x5d, 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, 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, 0xcc, 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, 0x48, + 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0f, 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, 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, 0x5d, 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, - 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, 0xca, 0x04, - 0x0a, 0x11, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, + 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, 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, 0x46, 0x0a, 0x04, 0x74, 0x61, 0x67, - 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x82, 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, 0x31, - 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, - 0x73, 0x32, 0xe1, 0x16, 0x0a, 0x02, 0x53, 0x33, 0x12, 0x48, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, - 0x6e, 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, 0x5e, 0x0a, 0x09, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, - 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, - 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, - 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x65, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, - 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x10, 0x50, 0x75, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x2e, - 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, - 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x6d, 0x6f, - 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, - 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x13, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, - 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 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, 0x84, 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, 0x33, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 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, 0x50, + 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x32, 0xdb, 0x17, 0x0a, 0x14, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x12, 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, 0x49, 0x6e, 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, + 0x62, 0x0a, 0x09, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, + 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, + 0x00, 0x28, 0x01, 0x12, 0x62, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x12, 0x27, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x69, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x12, 0x75, 0x0a, 0x10, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, + 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, + 0x67, 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, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, + 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x13, 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, 0x71, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x2e, 0x6d, - 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, - 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 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, 0x5f, 0x0a, 0x0a, 0x43, - 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0d, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x29, 0x2e, - 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x28, - 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x47, 0x65, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 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, 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, 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, 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, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 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, 0x63, 0x0a, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 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, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 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, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x12, 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, 0x4c, 0x69, 0x73, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x0c, 0x47, + 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, + 0x63, 0x6c, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x0c, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, - 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, - 0x6c, 0x12, 0x28, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, - 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0x00, 0x12, 0x80, 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, 0x31, 0x2e, 0x6d, - 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 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, - 0x32, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x61, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x61, 0x72, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x6f, - 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6b, 0x0a, 0x0e, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, - 0x79, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2b, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x86, 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, 0x33, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x34, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x7d, - 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, + 0x84, 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, 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, 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, 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, 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, 0x65, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x61, 0x72, 0x74, 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, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x61, 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, + 0x0e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, + 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x8a, + 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, 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, 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, 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, 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, 0x81, 0x01, 0x0a, 0x14, + 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x12, 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, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 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, 0x7d, 0x0a, - 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x30, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x31, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x77, 0x0a, 0x12, - 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x2e, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x2f, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x5f, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x64, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x6f, - 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0d, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x12, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x73, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, - 0x12, 0x56, 0x0a, 0x07, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x12, 0x23, 0x2e, 0x6d, 0x6f, - 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x1a, 0x24, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, - 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x34, 0x2e, 0x6d, - 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 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, 0x70, 0x0a, 0x1e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x70, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x64, - 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x34, - 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 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, 0x67, - 0x0a, 0x0c, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x28, - 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5c, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x61, 0x72, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x6f, - 0x73, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 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, - 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x61, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 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, + 0x81, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, + 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 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, 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, 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, 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, 0x7b, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 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, 0x63, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x49, 0x73, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x07, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x12, 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, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, + 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, + 0x74, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x4c, 0x6f, 0x61, + 0x64, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 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, 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, 0x72, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, + 0x70, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, + 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 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, 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, 0x6b, 0x0a, 0x0c, 0x41, 0x70, 0x70, + 0x65, 0x6e, 0x64, 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, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 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, + 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x60, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, + 0x72, 0x74, 0x73, 0x12, 0x27, 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, 0x4c, 0x69, + 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_s3_proto_rawDescOnce sync.Once - file_s3_proto_rawDescData = file_s3_proto_rawDesc + file_oss_proto_rawDescOnce sync.Once + file_oss_proto_rawDescData = file_oss_proto_rawDesc ) -func file_s3_proto_rawDescGZIP() []byte { - file_s3_proto_rawDescOnce.Do(func() { - file_s3_proto_rawDescData = protoimpl.X.CompressGZIP(file_s3_proto_rawDescData) +func file_oss_proto_rawDescGZIP() []byte { + file_oss_proto_rawDescOnce.Do(func() { + file_oss_proto_rawDescData = protoimpl.X.CompressGZIP(file_oss_proto_rawDescData) }) - return file_s3_proto_rawDescData -} - -var file_s3_proto_msgTypes = make([]protoimpl.MessageInfo, 75) -var file_s3_proto_goTypes = []interface{}{ - (*InitInput)(nil), // 0: mosn.proto.runtime.v1.InitInput - (*GetObjectInput)(nil), // 1: mosn.proto.runtime.v1.GetObjectInput - (*GetObjectOutput)(nil), // 2: mosn.proto.runtime.v1.GetObjectOutput - (*PutObjectInput)(nil), // 3: mosn.proto.runtime.v1.PutObjectInput - (*PutObjectOutput)(nil), // 4: mosn.proto.runtime.v1.PutObjectOutput - (*DeleteObjectInput)(nil), // 5: mosn.proto.runtime.v1.DeleteObjectInput - (*DeleteObjectOutput)(nil), // 6: mosn.proto.runtime.v1.DeleteObjectOutput - (*PutBucketTaggingInput)(nil), // 7: mosn.proto.runtime.v1.PutBucketTaggingInput - (*PutBucketTaggingOutput)(nil), // 8: mosn.proto.runtime.v1.PutBucketTaggingOutput - (*DeleteObjectTaggingInput)(nil), // 9: mosn.proto.runtime.v1.DeleteObjectTaggingInput - (*DeleteObjectTaggingOutput)(nil), // 10: mosn.proto.runtime.v1.DeleteObjectTaggingOutput - (*GetObjectTaggingInput)(nil), // 11: mosn.proto.runtime.v1.GetObjectTaggingInput - (*GetObjectTaggingOutput)(nil), // 12: mosn.proto.runtime.v1.GetObjectTaggingOutput - (*CopySource)(nil), // 13: mosn.proto.runtime.v1.CopySource - (*CopyObjectInput)(nil), // 14: mosn.proto.runtime.v1.CopyObjectInput - (*CopyObjectResult)(nil), // 15: mosn.proto.runtime.v1.CopyObjectResult - (*CopyObjectOutput)(nil), // 16: mosn.proto.runtime.v1.CopyObjectOutput - (*Delete)(nil), // 17: mosn.proto.runtime.v1.Delete - (*ObjectIdentifier)(nil), // 18: mosn.proto.runtime.v1.ObjectIdentifier - (*DeleteObjectsInput)(nil), // 19: mosn.proto.runtime.v1.DeleteObjectsInput - (*DeletedObject)(nil), // 20: mosn.proto.runtime.v1.DeletedObject - (*DeleteObjectsOutput)(nil), // 21: mosn.proto.runtime.v1.DeleteObjectsOutput - (*ListObjectsInput)(nil), // 22: mosn.proto.runtime.v1.ListObjectsInput - (*ListObjectsOutput)(nil), // 23: mosn.proto.runtime.v1.ListObjectsOutput - (*Owner)(nil), // 24: mosn.proto.runtime.v1.Owner - (*Object)(nil), // 25: mosn.proto.runtime.v1.Object - (*Grantee)(nil), // 26: mosn.proto.runtime.v1.Grantee - (*Grant)(nil), // 27: mosn.proto.runtime.v1.Grant - (*GetObjectAclInput)(nil), // 28: mosn.proto.runtime.v1.GetObjectAclInput - (*GetObjectAclOutput)(nil), // 29: mosn.proto.runtime.v1.GetObjectAclOutput - (*PutObjectAclInput)(nil), // 30: mosn.proto.runtime.v1.PutObjectAclInput - (*PutObjectAclOutput)(nil), // 31: mosn.proto.runtime.v1.PutObjectAclOutput - (*RestoreObjectInput)(nil), // 32: mosn.proto.runtime.v1.RestoreObjectInput - (*RestoreObjectOutput)(nil), // 33: mosn.proto.runtime.v1.RestoreObjectOutput - (*CreateMultipartUploadInput)(nil), // 34: mosn.proto.runtime.v1.CreateMultipartUploadInput - (*CreateMultipartUploadOutput)(nil), // 35: mosn.proto.runtime.v1.CreateMultipartUploadOutput - (*UploadPartInput)(nil), // 36: mosn.proto.runtime.v1.UploadPartInput - (*UploadPartOutput)(nil), // 37: mosn.proto.runtime.v1.UploadPartOutput - (*UploadPartCopyInput)(nil), // 38: mosn.proto.runtime.v1.UploadPartCopyInput - (*CopyPartResult)(nil), // 39: mosn.proto.runtime.v1.CopyPartResult - (*UploadPartCopyOutput)(nil), // 40: mosn.proto.runtime.v1.UploadPartCopyOutput - (*CompletedPart)(nil), // 41: mosn.proto.runtime.v1.CompletedPart - (*CompletedMultipartUpload)(nil), // 42: mosn.proto.runtime.v1.CompletedMultipartUpload - (*CompleteMultipartUploadInput)(nil), // 43: mosn.proto.runtime.v1.CompleteMultipartUploadInput - (*CompleteMultipartUploadOutput)(nil), // 44: mosn.proto.runtime.v1.CompleteMultipartUploadOutput - (*AbortMultipartUploadInput)(nil), // 45: mosn.proto.runtime.v1.AbortMultipartUploadInput - (*AbortMultipartUploadOutput)(nil), // 46: mosn.proto.runtime.v1.AbortMultipartUploadOutput - (*ListMultipartUploadsInput)(nil), // 47: mosn.proto.runtime.v1.ListMultipartUploadsInput - (*Initiator)(nil), // 48: mosn.proto.runtime.v1.Initiator - (*MultipartUpload)(nil), // 49: mosn.proto.runtime.v1.MultipartUpload - (*ListMultipartUploadsOutput)(nil), // 50: mosn.proto.runtime.v1.ListMultipartUploadsOutput - (*ListObjectVersionsInput)(nil), // 51: mosn.proto.runtime.v1.ListObjectVersionsInput - (*DeleteMarkerEntry)(nil), // 52: mosn.proto.runtime.v1.DeleteMarkerEntry - (*ObjectVersion)(nil), // 53: mosn.proto.runtime.v1.ObjectVersion - (*ListObjectVersionsOutput)(nil), // 54: mosn.proto.runtime.v1.ListObjectVersionsOutput - (*HeadObjectInput)(nil), // 55: mosn.proto.runtime.v1.HeadObjectInput - (*HeadObjectOutput)(nil), // 56: mosn.proto.runtime.v1.HeadObjectOutput - (*IsObjectExistInput)(nil), // 57: mosn.proto.runtime.v1.IsObjectExistInput - (*IsObjectExistOutput)(nil), // 58: mosn.proto.runtime.v1.IsObjectExistOutput - (*SignURLInput)(nil), // 59: mosn.proto.runtime.v1.SignURLInput - (*SignURLOutput)(nil), // 60: mosn.proto.runtime.v1.SignURLOutput - (*UpdateBandwidthRateLimitInput)(nil), // 61: mosn.proto.runtime.v1.UpdateBandwidthRateLimitInput - (*AppendObjectInput)(nil), // 62: mosn.proto.runtime.v1.AppendObjectInput - (*AppendObjectOutput)(nil), // 63: mosn.proto.runtime.v1.AppendObjectOutput - (*ListPartsInput)(nil), // 64: mosn.proto.runtime.v1.ListPartsInput - (*Part)(nil), // 65: mosn.proto.runtime.v1.Part - (*ListPartsOutput)(nil), // 66: mosn.proto.runtime.v1.ListPartsOutput - nil, // 67: mosn.proto.runtime.v1.InitInput.MetadataEntry - nil, // 68: mosn.proto.runtime.v1.PutObjectInput.MetaEntry - nil, // 69: mosn.proto.runtime.v1.PutBucketTaggingInput.TagsEntry - nil, // 70: mosn.proto.runtime.v1.GetObjectTaggingOutput.TagsEntry - nil, // 71: mosn.proto.runtime.v1.CopyObjectInput.MetadataEntry - nil, // 72: mosn.proto.runtime.v1.CreateMultipartUploadInput.MetaDataEntry - nil, // 73: mosn.proto.runtime.v1.HeadObjectOutput.ResultMetadataEntry - nil, // 74: mosn.proto.runtime.v1.AppendObjectInput.TagsEntry - (*emptypb.Empty)(nil), // 75: google.protobuf.Empty -} -var file_s3_proto_depIdxs = []int32{ - 67, // 0: mosn.proto.runtime.v1.InitInput.metadata:type_name -> mosn.proto.runtime.v1.InitInput.MetadataEntry - 68, // 1: mosn.proto.runtime.v1.PutObjectInput.meta:type_name -> mosn.proto.runtime.v1.PutObjectInput.MetaEntry - 69, // 2: mosn.proto.runtime.v1.PutBucketTaggingInput.tags:type_name -> mosn.proto.runtime.v1.PutBucketTaggingInput.TagsEntry - 70, // 3: mosn.proto.runtime.v1.GetObjectTaggingOutput.tags:type_name -> mosn.proto.runtime.v1.GetObjectTaggingOutput.TagsEntry - 13, // 4: mosn.proto.runtime.v1.CopyObjectInput.copy_source:type_name -> mosn.proto.runtime.v1.CopySource - 71, // 5: mosn.proto.runtime.v1.CopyObjectInput.metadata:type_name -> mosn.proto.runtime.v1.CopyObjectInput.MetadataEntry - 15, // 6: mosn.proto.runtime.v1.CopyObjectOutput.CopyObjectResult:type_name -> mosn.proto.runtime.v1.CopyObjectResult - 18, // 7: mosn.proto.runtime.v1.Delete.objects:type_name -> mosn.proto.runtime.v1.ObjectIdentifier - 17, // 8: mosn.proto.runtime.v1.DeleteObjectsInput.delete:type_name -> mosn.proto.runtime.v1.Delete - 20, // 9: mosn.proto.runtime.v1.DeleteObjectsOutput.deleted:type_name -> mosn.proto.runtime.v1.DeletedObject - 25, // 10: mosn.proto.runtime.v1.ListObjectsOutput.contents:type_name -> mosn.proto.runtime.v1.Object - 24, // 11: mosn.proto.runtime.v1.Object.owner:type_name -> mosn.proto.runtime.v1.Owner - 26, // 12: mosn.proto.runtime.v1.Grant.grantee:type_name -> mosn.proto.runtime.v1.Grantee - 27, // 13: mosn.proto.runtime.v1.GetObjectAclOutput.grants:type_name -> mosn.proto.runtime.v1.Grant - 24, // 14: mosn.proto.runtime.v1.GetObjectAclOutput.owner:type_name -> mosn.proto.runtime.v1.Owner - 72, // 15: mosn.proto.runtime.v1.CreateMultipartUploadInput.meta_data:type_name -> mosn.proto.runtime.v1.CreateMultipartUploadInput.MetaDataEntry - 13, // 16: mosn.proto.runtime.v1.UploadPartCopyInput.copy_source:type_name -> mosn.proto.runtime.v1.CopySource - 39, // 17: mosn.proto.runtime.v1.UploadPartCopyOutput.copy_part_result:type_name -> mosn.proto.runtime.v1.CopyPartResult - 41, // 18: mosn.proto.runtime.v1.CompletedMultipartUpload.parts:type_name -> mosn.proto.runtime.v1.CompletedPart - 42, // 19: mosn.proto.runtime.v1.CompleteMultipartUploadInput.multipart_upload:type_name -> mosn.proto.runtime.v1.CompletedMultipartUpload - 48, // 20: mosn.proto.runtime.v1.MultipartUpload.initiator:type_name -> mosn.proto.runtime.v1.Initiator - 24, // 21: mosn.proto.runtime.v1.MultipartUpload.owner:type_name -> mosn.proto.runtime.v1.Owner - 49, // 22: mosn.proto.runtime.v1.ListMultipartUploadsOutput.uploads:type_name -> mosn.proto.runtime.v1.MultipartUpload - 24, // 23: mosn.proto.runtime.v1.DeleteMarkerEntry.owner:type_name -> mosn.proto.runtime.v1.Owner - 24, // 24: mosn.proto.runtime.v1.ObjectVersion.owner:type_name -> mosn.proto.runtime.v1.Owner - 52, // 25: mosn.proto.runtime.v1.ListObjectVersionsOutput.delete_markers:type_name -> mosn.proto.runtime.v1.DeleteMarkerEntry - 53, // 26: mosn.proto.runtime.v1.ListObjectVersionsOutput.versions:type_name -> mosn.proto.runtime.v1.ObjectVersion - 73, // 27: mosn.proto.runtime.v1.HeadObjectOutput.ResultMetadata:type_name -> mosn.proto.runtime.v1.HeadObjectOutput.ResultMetadataEntry - 74, // 28: mosn.proto.runtime.v1.AppendObjectInput.tags:type_name -> mosn.proto.runtime.v1.AppendObjectInput.TagsEntry - 65, // 29: mosn.proto.runtime.v1.ListPartsOutput.parts:type_name -> mosn.proto.runtime.v1.Part - 0, // 30: mosn.proto.runtime.v1.S3.InitClient:input_type -> mosn.proto.runtime.v1.InitInput - 3, // 31: mosn.proto.runtime.v1.S3.PutObject:input_type -> mosn.proto.runtime.v1.PutObjectInput - 1, // 32: mosn.proto.runtime.v1.S3.GetObject:input_type -> mosn.proto.runtime.v1.GetObjectInput - 5, // 33: mosn.proto.runtime.v1.S3.DeleteObject:input_type -> mosn.proto.runtime.v1.DeleteObjectInput - 7, // 34: mosn.proto.runtime.v1.S3.PutObjectTagging:input_type -> mosn.proto.runtime.v1.PutBucketTaggingInput - 9, // 35: mosn.proto.runtime.v1.S3.DeleteObjectTagging:input_type -> mosn.proto.runtime.v1.DeleteObjectTaggingInput - 11, // 36: mosn.proto.runtime.v1.S3.GetObjectTagging:input_type -> mosn.proto.runtime.v1.GetObjectTaggingInput - 14, // 37: mosn.proto.runtime.v1.S3.CopyObject:input_type -> mosn.proto.runtime.v1.CopyObjectInput - 19, // 38: mosn.proto.runtime.v1.S3.DeleteObjects:input_type -> mosn.proto.runtime.v1.DeleteObjectsInput - 22, // 39: mosn.proto.runtime.v1.S3.ListObjects:input_type -> mosn.proto.runtime.v1.ListObjectsInput - 28, // 40: mosn.proto.runtime.v1.S3.GetObjectAcl:input_type -> mosn.proto.runtime.v1.GetObjectAclInput - 30, // 41: mosn.proto.runtime.v1.S3.PutObjectAcl:input_type -> mosn.proto.runtime.v1.PutObjectAclInput - 32, // 42: mosn.proto.runtime.v1.S3.RestoreObject:input_type -> mosn.proto.runtime.v1.RestoreObjectInput - 34, // 43: mosn.proto.runtime.v1.S3.CreateMultipartUpload:input_type -> mosn.proto.runtime.v1.CreateMultipartUploadInput - 36, // 44: mosn.proto.runtime.v1.S3.UploadPart:input_type -> mosn.proto.runtime.v1.UploadPartInput - 38, // 45: mosn.proto.runtime.v1.S3.UploadPartCopy:input_type -> mosn.proto.runtime.v1.UploadPartCopyInput - 43, // 46: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:input_type -> mosn.proto.runtime.v1.CompleteMultipartUploadInput - 45, // 47: mosn.proto.runtime.v1.S3.AbortMultipartUpload:input_type -> mosn.proto.runtime.v1.AbortMultipartUploadInput - 47, // 48: mosn.proto.runtime.v1.S3.ListMultipartUploads:input_type -> mosn.proto.runtime.v1.ListMultipartUploadsInput - 51, // 49: mosn.proto.runtime.v1.S3.ListObjectVersions:input_type -> mosn.proto.runtime.v1.ListObjectVersionsInput - 55, // 50: mosn.proto.runtime.v1.S3.HeadObject:input_type -> mosn.proto.runtime.v1.HeadObjectInput - 57, // 51: mosn.proto.runtime.v1.S3.IsObjectExist:input_type -> mosn.proto.runtime.v1.IsObjectExistInput - 59, // 52: mosn.proto.runtime.v1.S3.SignURL:input_type -> mosn.proto.runtime.v1.SignURLInput - 61, // 53: mosn.proto.runtime.v1.S3.UpdateDownLoadBandwidthRateLimit:input_type -> mosn.proto.runtime.v1.UpdateBandwidthRateLimitInput - 61, // 54: mosn.proto.runtime.v1.S3.UpdateUpLoadBandwidthRateLimit:input_type -> mosn.proto.runtime.v1.UpdateBandwidthRateLimitInput - 62, // 55: mosn.proto.runtime.v1.S3.AppendObject:input_type -> mosn.proto.runtime.v1.AppendObjectInput - 64, // 56: mosn.proto.runtime.v1.S3.ListParts:input_type -> mosn.proto.runtime.v1.ListPartsInput - 75, // 57: mosn.proto.runtime.v1.S3.InitClient:output_type -> google.protobuf.Empty - 4, // 58: mosn.proto.runtime.v1.S3.PutObject:output_type -> mosn.proto.runtime.v1.PutObjectOutput - 2, // 59: mosn.proto.runtime.v1.S3.GetObject:output_type -> mosn.proto.runtime.v1.GetObjectOutput - 6, // 60: mosn.proto.runtime.v1.S3.DeleteObject:output_type -> mosn.proto.runtime.v1.DeleteObjectOutput - 8, // 61: mosn.proto.runtime.v1.S3.PutObjectTagging:output_type -> mosn.proto.runtime.v1.PutBucketTaggingOutput - 10, // 62: mosn.proto.runtime.v1.S3.DeleteObjectTagging:output_type -> mosn.proto.runtime.v1.DeleteObjectTaggingOutput - 12, // 63: mosn.proto.runtime.v1.S3.GetObjectTagging:output_type -> mosn.proto.runtime.v1.GetObjectTaggingOutput - 16, // 64: mosn.proto.runtime.v1.S3.CopyObject:output_type -> mosn.proto.runtime.v1.CopyObjectOutput - 21, // 65: mosn.proto.runtime.v1.S3.DeleteObjects:output_type -> mosn.proto.runtime.v1.DeleteObjectsOutput - 23, // 66: mosn.proto.runtime.v1.S3.ListObjects:output_type -> mosn.proto.runtime.v1.ListObjectsOutput - 29, // 67: mosn.proto.runtime.v1.S3.GetObjectAcl:output_type -> mosn.proto.runtime.v1.GetObjectAclOutput - 31, // 68: mosn.proto.runtime.v1.S3.PutObjectAcl:output_type -> mosn.proto.runtime.v1.PutObjectAclOutput - 33, // 69: mosn.proto.runtime.v1.S3.RestoreObject:output_type -> mosn.proto.runtime.v1.RestoreObjectOutput - 35, // 70: mosn.proto.runtime.v1.S3.CreateMultipartUpload:output_type -> mosn.proto.runtime.v1.CreateMultipartUploadOutput - 37, // 71: mosn.proto.runtime.v1.S3.UploadPart:output_type -> mosn.proto.runtime.v1.UploadPartOutput - 40, // 72: mosn.proto.runtime.v1.S3.UploadPartCopy:output_type -> mosn.proto.runtime.v1.UploadPartCopyOutput - 44, // 73: mosn.proto.runtime.v1.S3.CompleteMultipartUpload:output_type -> mosn.proto.runtime.v1.CompleteMultipartUploadOutput - 46, // 74: mosn.proto.runtime.v1.S3.AbortMultipartUpload:output_type -> mosn.proto.runtime.v1.AbortMultipartUploadOutput - 50, // 75: mosn.proto.runtime.v1.S3.ListMultipartUploads:output_type -> mosn.proto.runtime.v1.ListMultipartUploadsOutput - 54, // 76: mosn.proto.runtime.v1.S3.ListObjectVersions:output_type -> mosn.proto.runtime.v1.ListObjectVersionsOutput - 56, // 77: mosn.proto.runtime.v1.S3.HeadObject:output_type -> mosn.proto.runtime.v1.HeadObjectOutput - 58, // 78: mosn.proto.runtime.v1.S3.IsObjectExist:output_type -> mosn.proto.runtime.v1.IsObjectExistOutput - 60, // 79: mosn.proto.runtime.v1.S3.SignURL:output_type -> mosn.proto.runtime.v1.SignURLOutput - 75, // 80: mosn.proto.runtime.v1.S3.UpdateDownLoadBandwidthRateLimit:output_type -> google.protobuf.Empty - 75, // 81: mosn.proto.runtime.v1.S3.UpdateUpLoadBandwidthRateLimit:output_type -> google.protobuf.Empty - 63, // 82: mosn.proto.runtime.v1.S3.AppendObject:output_type -> mosn.proto.runtime.v1.AppendObjectOutput - 66, // 83: mosn.proto.runtime.v1.S3.ListParts:output_type -> mosn.proto.runtime.v1.ListPartsOutput - 57, // [57:84] is the sub-list for method output_type - 30, // [30:57] is the sub-list for method input_type - 30, // [30:30] is the sub-list for extension type_name - 30, // [30:30] is the sub-list for extension extendee - 0, // [0:30] is the sub-list for field type_name -} - -func init() { file_s3_proto_init() } -func file_s3_proto_init() { - if File_s3_proto != nil { + return file_oss_proto_rawDescData +} + +var file_oss_proto_msgTypes = make([]protoimpl.MessageInfo, 76) +var file_oss_proto_goTypes = []interface{}{ + (*InitInput)(nil), // 0: spec.proto.extension.v1.InitInput + (*GetObjectInput)(nil), // 1: spec.proto.extension.v1.GetObjectInput + (*GetObjectOutput)(nil), // 2: spec.proto.extension.v1.GetObjectOutput + (*PutObjectInput)(nil), // 3: spec.proto.extension.v1.PutObjectInput + (*PutObjectOutput)(nil), // 4: spec.proto.extension.v1.PutObjectOutput + (*DeleteObjectInput)(nil), // 5: spec.proto.extension.v1.DeleteObjectInput + (*DeleteObjectOutput)(nil), // 6: spec.proto.extension.v1.DeleteObjectOutput + (*PutBucketTaggingInput)(nil), // 7: spec.proto.extension.v1.PutBucketTaggingInput + (*PutBucketTaggingOutput)(nil), // 8: spec.proto.extension.v1.PutBucketTaggingOutput + (*DeleteObjectTaggingInput)(nil), // 9: spec.proto.extension.v1.DeleteObjectTaggingInput + (*DeleteObjectTaggingOutput)(nil), // 10: spec.proto.extension.v1.DeleteObjectTaggingOutput + (*GetObjectTaggingInput)(nil), // 11: spec.proto.extension.v1.GetObjectTaggingInput + (*GetObjectTaggingOutput)(nil), // 12: spec.proto.extension.v1.GetObjectTaggingOutput + (*CopySource)(nil), // 13: spec.proto.extension.v1.CopySource + (*CopyObjectInput)(nil), // 14: spec.proto.extension.v1.CopyObjectInput + (*CopyObjectResult)(nil), // 15: spec.proto.extension.v1.CopyObjectResult + (*CopyObjectOutput)(nil), // 16: spec.proto.extension.v1.CopyObjectOutput + (*Delete)(nil), // 17: spec.proto.extension.v1.Delete + (*ObjectIdentifier)(nil), // 18: spec.proto.extension.v1.ObjectIdentifier + (*DeleteObjectsInput)(nil), // 19: spec.proto.extension.v1.DeleteObjectsInput + (*DeletedObject)(nil), // 20: spec.proto.extension.v1.DeletedObject + (*DeleteObjectsOutput)(nil), // 21: spec.proto.extension.v1.DeleteObjectsOutput + (*ListObjectsInput)(nil), // 22: spec.proto.extension.v1.ListObjectsInput + (*ListObjectsOutput)(nil), // 23: spec.proto.extension.v1.ListObjectsOutput + (*Owner)(nil), // 24: spec.proto.extension.v1.Owner + (*Object)(nil), // 25: spec.proto.extension.v1.Object + (*Grantee)(nil), // 26: spec.proto.extension.v1.Grantee + (*Grant)(nil), // 27: spec.proto.extension.v1.Grant + (*GetObjectAclInput)(nil), // 28: spec.proto.extension.v1.GetObjectAclInput + (*GetObjectAclOutput)(nil), // 29: spec.proto.extension.v1.GetObjectAclOutput + (*PutObjectAclInput)(nil), // 30: spec.proto.extension.v1.PutObjectAclInput + (*PutObjectAclOutput)(nil), // 31: spec.proto.extension.v1.PutObjectAclOutput + (*RestoreObjectInput)(nil), // 32: spec.proto.extension.v1.RestoreObjectInput + (*RestoreObjectOutput)(nil), // 33: spec.proto.extension.v1.RestoreObjectOutput + (*CreateMultipartUploadInput)(nil), // 34: spec.proto.extension.v1.CreateMultipartUploadInput + (*CreateMultipartUploadOutput)(nil), // 35: spec.proto.extension.v1.CreateMultipartUploadOutput + (*UploadPartInput)(nil), // 36: spec.proto.extension.v1.UploadPartInput + (*UploadPartOutput)(nil), // 37: spec.proto.extension.v1.UploadPartOutput + (*UploadPartCopyInput)(nil), // 38: spec.proto.extension.v1.UploadPartCopyInput + (*CopyPartResult)(nil), // 39: spec.proto.extension.v1.CopyPartResult + (*UploadPartCopyOutput)(nil), // 40: spec.proto.extension.v1.UploadPartCopyOutput + (*CompletedPart)(nil), // 41: spec.proto.extension.v1.CompletedPart + (*CompletedMultipartUpload)(nil), // 42: spec.proto.extension.v1.CompletedMultipartUpload + (*CompleteMultipartUploadInput)(nil), // 43: spec.proto.extension.v1.CompleteMultipartUploadInput + (*CompleteMultipartUploadOutput)(nil), // 44: spec.proto.extension.v1.CompleteMultipartUploadOutput + (*AbortMultipartUploadInput)(nil), // 45: spec.proto.extension.v1.AbortMultipartUploadInput + (*AbortMultipartUploadOutput)(nil), // 46: spec.proto.extension.v1.AbortMultipartUploadOutput + (*ListMultipartUploadsInput)(nil), // 47: spec.proto.extension.v1.ListMultipartUploadsInput + (*Initiator)(nil), // 48: spec.proto.extension.v1.Initiator + (*MultipartUpload)(nil), // 49: spec.proto.extension.v1.MultipartUpload + (*ListMultipartUploadsOutput)(nil), // 50: spec.proto.extension.v1.ListMultipartUploadsOutput + (*ListObjectVersionsInput)(nil), // 51: spec.proto.extension.v1.ListObjectVersionsInput + (*DeleteMarkerEntry)(nil), // 52: spec.proto.extension.v1.DeleteMarkerEntry + (*ObjectVersion)(nil), // 53: spec.proto.extension.v1.ObjectVersion + (*ListObjectVersionsOutput)(nil), // 54: spec.proto.extension.v1.ListObjectVersionsOutput + (*HeadObjectInput)(nil), // 55: spec.proto.extension.v1.HeadObjectInput + (*HeadObjectOutput)(nil), // 56: spec.proto.extension.v1.HeadObjectOutput + (*IsObjectExistInput)(nil), // 57: spec.proto.extension.v1.IsObjectExistInput + (*IsObjectExistOutput)(nil), // 58: spec.proto.extension.v1.IsObjectExistOutput + (*SignURLInput)(nil), // 59: spec.proto.extension.v1.SignURLInput + (*SignURLOutput)(nil), // 60: spec.proto.extension.v1.SignURLOutput + (*UpdateBandwidthRateLimitInput)(nil), // 61: spec.proto.extension.v1.UpdateBandwidthRateLimitInput + (*AppendObjectInput)(nil), // 62: spec.proto.extension.v1.AppendObjectInput + (*AppendObjectOutput)(nil), // 63: spec.proto.extension.v1.AppendObjectOutput + (*ListPartsInput)(nil), // 64: spec.proto.extension.v1.ListPartsInput + (*Part)(nil), // 65: spec.proto.extension.v1.Part + (*ListPartsOutput)(nil), // 66: spec.proto.extension.v1.ListPartsOutput + nil, // 67: spec.proto.extension.v1.InitInput.MetadataEntry + nil, // 68: spec.proto.extension.v1.GetObjectOutput.MetadataEntry + nil, // 69: spec.proto.extension.v1.PutObjectInput.MetaEntry + nil, // 70: spec.proto.extension.v1.PutBucketTaggingInput.TagsEntry + nil, // 71: spec.proto.extension.v1.GetObjectTaggingOutput.TagsEntry + nil, // 72: spec.proto.extension.v1.CopyObjectInput.MetadataEntry + nil, // 73: spec.proto.extension.v1.CreateMultipartUploadInput.MetaDataEntry + nil, // 74: spec.proto.extension.v1.HeadObjectOutput.ResultMetadataEntry + nil, // 75: spec.proto.extension.v1.AppendObjectInput.TagsEntry + (*emptypb.Empty)(nil), // 76: google.protobuf.Empty +} +var file_oss_proto_depIdxs = []int32{ + 67, // 0: spec.proto.extension.v1.InitInput.metadata:type_name -> spec.proto.extension.v1.InitInput.MetadataEntry + 68, // 1: spec.proto.extension.v1.GetObjectOutput.metadata:type_name -> spec.proto.extension.v1.GetObjectOutput.MetadataEntry + 69, // 2: spec.proto.extension.v1.PutObjectInput.meta:type_name -> spec.proto.extension.v1.PutObjectInput.MetaEntry + 70, // 3: spec.proto.extension.v1.PutBucketTaggingInput.tags:type_name -> spec.proto.extension.v1.PutBucketTaggingInput.TagsEntry + 71, // 4: spec.proto.extension.v1.GetObjectTaggingOutput.tags:type_name -> spec.proto.extension.v1.GetObjectTaggingOutput.TagsEntry + 13, // 5: spec.proto.extension.v1.CopyObjectInput.copy_source:type_name -> spec.proto.extension.v1.CopySource + 72, // 6: spec.proto.extension.v1.CopyObjectInput.metadata:type_name -> spec.proto.extension.v1.CopyObjectInput.MetadataEntry + 15, // 7: spec.proto.extension.v1.CopyObjectOutput.copy_object_result:type_name -> spec.proto.extension.v1.CopyObjectResult + 18, // 8: spec.proto.extension.v1.Delete.objects:type_name -> spec.proto.extension.v1.ObjectIdentifier + 17, // 9: spec.proto.extension.v1.DeleteObjectsInput.delete:type_name -> spec.proto.extension.v1.Delete + 20, // 10: spec.proto.extension.v1.DeleteObjectsOutput.deleted:type_name -> spec.proto.extension.v1.DeletedObject + 25, // 11: spec.proto.extension.v1.ListObjectsOutput.contents:type_name -> spec.proto.extension.v1.Object + 24, // 12: spec.proto.extension.v1.Object.owner:type_name -> spec.proto.extension.v1.Owner + 26, // 13: spec.proto.extension.v1.Grant.grantee:type_name -> spec.proto.extension.v1.Grantee + 27, // 14: spec.proto.extension.v1.GetObjectAclOutput.grants:type_name -> spec.proto.extension.v1.Grant + 24, // 15: spec.proto.extension.v1.GetObjectAclOutput.owner:type_name -> spec.proto.extension.v1.Owner + 73, // 16: spec.proto.extension.v1.CreateMultipartUploadInput.meta_data:type_name -> spec.proto.extension.v1.CreateMultipartUploadInput.MetaDataEntry + 13, // 17: spec.proto.extension.v1.UploadPartCopyInput.copy_source:type_name -> spec.proto.extension.v1.CopySource + 39, // 18: spec.proto.extension.v1.UploadPartCopyOutput.copy_part_result:type_name -> spec.proto.extension.v1.CopyPartResult + 41, // 19: spec.proto.extension.v1.CompletedMultipartUpload.parts:type_name -> spec.proto.extension.v1.CompletedPart + 42, // 20: spec.proto.extension.v1.CompleteMultipartUploadInput.multipart_upload:type_name -> spec.proto.extension.v1.CompletedMultipartUpload + 48, // 21: spec.proto.extension.v1.MultipartUpload.initiator:type_name -> spec.proto.extension.v1.Initiator + 24, // 22: spec.proto.extension.v1.MultipartUpload.owner:type_name -> spec.proto.extension.v1.Owner + 49, // 23: spec.proto.extension.v1.ListMultipartUploadsOutput.uploads:type_name -> spec.proto.extension.v1.MultipartUpload + 24, // 24: spec.proto.extension.v1.DeleteMarkerEntry.owner:type_name -> spec.proto.extension.v1.Owner + 24, // 25: spec.proto.extension.v1.ObjectVersion.owner:type_name -> spec.proto.extension.v1.Owner + 52, // 26: spec.proto.extension.v1.ListObjectVersionsOutput.delete_markers:type_name -> spec.proto.extension.v1.DeleteMarkerEntry + 53, // 27: spec.proto.extension.v1.ListObjectVersionsOutput.versions:type_name -> spec.proto.extension.v1.ObjectVersion + 74, // 28: spec.proto.extension.v1.HeadObjectOutput.result_metadata:type_name -> spec.proto.extension.v1.HeadObjectOutput.ResultMetadataEntry + 75, // 29: spec.proto.extension.v1.AppendObjectInput.tags:type_name -> spec.proto.extension.v1.AppendObjectInput.TagsEntry + 65, // 30: spec.proto.extension.v1.ListPartsOutput.parts:type_name -> spec.proto.extension.v1.Part + 0, // 31: spec.proto.extension.v1.ObjectStorageService.InitClient:input_type -> spec.proto.extension.v1.InitInput + 3, // 32: spec.proto.extension.v1.ObjectStorageService.PutObject:input_type -> spec.proto.extension.v1.PutObjectInput + 1, // 33: spec.proto.extension.v1.ObjectStorageService.GetObject:input_type -> spec.proto.extension.v1.GetObjectInput + 5, // 34: spec.proto.extension.v1.ObjectStorageService.DeleteObject:input_type -> spec.proto.extension.v1.DeleteObjectInput + 7, // 35: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:input_type -> spec.proto.extension.v1.PutBucketTaggingInput + 9, // 36: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:input_type -> spec.proto.extension.v1.DeleteObjectTaggingInput + 11, // 37: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:input_type -> spec.proto.extension.v1.GetObjectTaggingInput + 14, // 38: spec.proto.extension.v1.ObjectStorageService.CopyObject:input_type -> spec.proto.extension.v1.CopyObjectInput + 19, // 39: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:input_type -> spec.proto.extension.v1.DeleteObjectsInput + 22, // 40: spec.proto.extension.v1.ObjectStorageService.ListObjects:input_type -> spec.proto.extension.v1.ListObjectsInput + 28, // 41: spec.proto.extension.v1.ObjectStorageService.GetObjectAcl:input_type -> spec.proto.extension.v1.GetObjectAclInput + 30, // 42: spec.proto.extension.v1.ObjectStorageService.PutObjectAcl:input_type -> spec.proto.extension.v1.PutObjectAclInput + 32, // 43: spec.proto.extension.v1.ObjectStorageService.RestoreObject:input_type -> spec.proto.extension.v1.RestoreObjectInput + 34, // 44: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:input_type -> spec.proto.extension.v1.CreateMultipartUploadInput + 36, // 45: spec.proto.extension.v1.ObjectStorageService.UploadPart:input_type -> spec.proto.extension.v1.UploadPartInput + 38, // 46: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:input_type -> spec.proto.extension.v1.UploadPartCopyInput + 43, // 47: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:input_type -> spec.proto.extension.v1.CompleteMultipartUploadInput + 45, // 48: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:input_type -> spec.proto.extension.v1.AbortMultipartUploadInput + 47, // 49: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:input_type -> spec.proto.extension.v1.ListMultipartUploadsInput + 51, // 50: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:input_type -> spec.proto.extension.v1.ListObjectVersionsInput + 55, // 51: spec.proto.extension.v1.ObjectStorageService.HeadObject:input_type -> spec.proto.extension.v1.HeadObjectInput + 57, // 52: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:input_type -> spec.proto.extension.v1.IsObjectExistInput + 59, // 53: spec.proto.extension.v1.ObjectStorageService.SignURL:input_type -> spec.proto.extension.v1.SignURLInput + 61, // 54: spec.proto.extension.v1.ObjectStorageService.UpdateDownLoadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput + 61, // 55: spec.proto.extension.v1.ObjectStorageService.UpdateUpLoadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput + 62, // 56: spec.proto.extension.v1.ObjectStorageService.AppendObject:input_type -> spec.proto.extension.v1.AppendObjectInput + 64, // 57: spec.proto.extension.v1.ObjectStorageService.ListParts:input_type -> spec.proto.extension.v1.ListPartsInput + 76, // 58: spec.proto.extension.v1.ObjectStorageService.InitClient:output_type -> google.protobuf.Empty + 4, // 59: spec.proto.extension.v1.ObjectStorageService.PutObject:output_type -> spec.proto.extension.v1.PutObjectOutput + 2, // 60: spec.proto.extension.v1.ObjectStorageService.GetObject:output_type -> spec.proto.extension.v1.GetObjectOutput + 6, // 61: spec.proto.extension.v1.ObjectStorageService.DeleteObject:output_type -> spec.proto.extension.v1.DeleteObjectOutput + 8, // 62: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:output_type -> spec.proto.extension.v1.PutBucketTaggingOutput + 10, // 63: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:output_type -> spec.proto.extension.v1.DeleteObjectTaggingOutput + 12, // 64: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:output_type -> spec.proto.extension.v1.GetObjectTaggingOutput + 16, // 65: spec.proto.extension.v1.ObjectStorageService.CopyObject:output_type -> spec.proto.extension.v1.CopyObjectOutput + 21, // 66: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:output_type -> spec.proto.extension.v1.DeleteObjectsOutput + 23, // 67: spec.proto.extension.v1.ObjectStorageService.ListObjects:output_type -> spec.proto.extension.v1.ListObjectsOutput + 29, // 68: spec.proto.extension.v1.ObjectStorageService.GetObjectAcl:output_type -> spec.proto.extension.v1.GetObjectAclOutput + 31, // 69: spec.proto.extension.v1.ObjectStorageService.PutObjectAcl:output_type -> spec.proto.extension.v1.PutObjectAclOutput + 33, // 70: spec.proto.extension.v1.ObjectStorageService.RestoreObject:output_type -> spec.proto.extension.v1.RestoreObjectOutput + 35, // 71: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:output_type -> spec.proto.extension.v1.CreateMultipartUploadOutput + 37, // 72: spec.proto.extension.v1.ObjectStorageService.UploadPart:output_type -> spec.proto.extension.v1.UploadPartOutput + 40, // 73: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:output_type -> spec.proto.extension.v1.UploadPartCopyOutput + 44, // 74: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:output_type -> spec.proto.extension.v1.CompleteMultipartUploadOutput + 46, // 75: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:output_type -> spec.proto.extension.v1.AbortMultipartUploadOutput + 50, // 76: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:output_type -> spec.proto.extension.v1.ListMultipartUploadsOutput + 54, // 77: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:output_type -> spec.proto.extension.v1.ListObjectVersionsOutput + 56, // 78: spec.proto.extension.v1.ObjectStorageService.HeadObject:output_type -> spec.proto.extension.v1.HeadObjectOutput + 58, // 79: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:output_type -> spec.proto.extension.v1.IsObjectExistOutput + 60, // 80: spec.proto.extension.v1.ObjectStorageService.SignURL:output_type -> spec.proto.extension.v1.SignURLOutput + 76, // 81: spec.proto.extension.v1.ObjectStorageService.UpdateDownLoadBandwidthRateLimit:output_type -> google.protobuf.Empty + 76, // 82: spec.proto.extension.v1.ObjectStorageService.UpdateUpLoadBandwidthRateLimit:output_type -> google.protobuf.Empty + 63, // 83: spec.proto.extension.v1.ObjectStorageService.AppendObject:output_type -> spec.proto.extension.v1.AppendObjectOutput + 66, // 84: spec.proto.extension.v1.ObjectStorageService.ListParts:output_type -> spec.proto.extension.v1.ListPartsOutput + 58, // [58:85] is the sub-list for method output_type + 31, // [31:58] is the sub-list for method input_type + 31, // [31:31] is the sub-list for extension type_name + 31, // [31:31] is the sub-list for extension extendee + 0, // [0:31] is the sub-list for field type_name +} + +func init() { file_oss_proto_init() } +func file_oss_proto_init() { + if File_oss_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_s3_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InitInput); i { case 0: return &v.state @@ -7037,7 +7230,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetObjectInput); i { case 0: return &v.state @@ -7049,7 +7242,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetObjectOutput); i { case 0: return &v.state @@ -7061,7 +7254,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PutObjectInput); i { case 0: return &v.state @@ -7073,7 +7266,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PutObjectOutput); i { case 0: return &v.state @@ -7085,7 +7278,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteObjectInput); i { case 0: return &v.state @@ -7097,7 +7290,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteObjectOutput); i { case 0: return &v.state @@ -7109,7 +7302,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PutBucketTaggingInput); i { case 0: return &v.state @@ -7121,7 +7314,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PutBucketTaggingOutput); i { case 0: return &v.state @@ -7133,7 +7326,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteObjectTaggingInput); i { case 0: return &v.state @@ -7145,7 +7338,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteObjectTaggingOutput); i { case 0: return &v.state @@ -7157,7 +7350,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetObjectTaggingInput); i { case 0: return &v.state @@ -7169,7 +7362,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetObjectTaggingOutput); i { case 0: return &v.state @@ -7181,7 +7374,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CopySource); i { case 0: return &v.state @@ -7193,7 +7386,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CopyObjectInput); i { case 0: return &v.state @@ -7205,7 +7398,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CopyObjectResult); i { case 0: return &v.state @@ -7217,7 +7410,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CopyObjectOutput); i { case 0: return &v.state @@ -7229,7 +7422,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Delete); i { case 0: return &v.state @@ -7241,7 +7434,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ObjectIdentifier); i { case 0: return &v.state @@ -7253,7 +7446,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteObjectsInput); i { case 0: return &v.state @@ -7265,7 +7458,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeletedObject); i { case 0: return &v.state @@ -7277,7 +7470,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteObjectsOutput); i { case 0: return &v.state @@ -7289,7 +7482,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListObjectsInput); i { case 0: return &v.state @@ -7301,7 +7494,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListObjectsOutput); i { case 0: return &v.state @@ -7313,7 +7506,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Owner); i { case 0: return &v.state @@ -7325,7 +7518,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Object); i { case 0: return &v.state @@ -7337,7 +7530,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Grantee); i { case 0: return &v.state @@ -7349,7 +7542,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Grant); i { case 0: return &v.state @@ -7361,7 +7554,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetObjectAclInput); i { case 0: return &v.state @@ -7373,7 +7566,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetObjectAclOutput); i { case 0: return &v.state @@ -7385,7 +7578,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PutObjectAclInput); i { case 0: return &v.state @@ -7397,7 +7590,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PutObjectAclOutput); i { case 0: return &v.state @@ -7409,7 +7602,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RestoreObjectInput); i { case 0: return &v.state @@ -7421,7 +7614,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RestoreObjectOutput); i { case 0: return &v.state @@ -7433,7 +7626,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateMultipartUploadInput); i { case 0: return &v.state @@ -7445,7 +7638,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateMultipartUploadOutput); i { case 0: return &v.state @@ -7457,7 +7650,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UploadPartInput); i { case 0: return &v.state @@ -7469,7 +7662,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UploadPartOutput); i { case 0: return &v.state @@ -7481,7 +7674,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UploadPartCopyInput); i { case 0: return &v.state @@ -7493,7 +7686,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CopyPartResult); i { case 0: return &v.state @@ -7505,7 +7698,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UploadPartCopyOutput); i { case 0: return &v.state @@ -7517,7 +7710,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CompletedPart); i { case 0: return &v.state @@ -7529,7 +7722,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CompletedMultipartUpload); i { case 0: return &v.state @@ -7541,7 +7734,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CompleteMultipartUploadInput); i { case 0: return &v.state @@ -7553,7 +7746,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CompleteMultipartUploadOutput); i { case 0: return &v.state @@ -7565,7 +7758,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AbortMultipartUploadInput); i { case 0: return &v.state @@ -7577,7 +7770,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AbortMultipartUploadOutput); i { case 0: return &v.state @@ -7589,7 +7782,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListMultipartUploadsInput); i { case 0: return &v.state @@ -7601,7 +7794,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Initiator); i { case 0: return &v.state @@ -7613,7 +7806,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MultipartUpload); i { case 0: return &v.state @@ -7625,7 +7818,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListMultipartUploadsOutput); i { case 0: return &v.state @@ -7637,7 +7830,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListObjectVersionsInput); i { case 0: return &v.state @@ -7649,7 +7842,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteMarkerEntry); i { case 0: return &v.state @@ -7661,7 +7854,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ObjectVersion); i { case 0: return &v.state @@ -7673,7 +7866,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListObjectVersionsOutput); i { case 0: return &v.state @@ -7685,7 +7878,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HeadObjectInput); i { case 0: return &v.state @@ -7697,7 +7890,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HeadObjectOutput); i { case 0: return &v.state @@ -7709,7 +7902,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IsObjectExistInput); i { case 0: return &v.state @@ -7721,7 +7914,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IsObjectExistOutput); i { case 0: return &v.state @@ -7733,7 +7926,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SignURLInput); i { case 0: return &v.state @@ -7745,7 +7938,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SignURLOutput); i { case 0: return &v.state @@ -7757,7 +7950,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateBandwidthRateLimitInput); i { case 0: return &v.state @@ -7769,7 +7962,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AppendObjectInput); i { case 0: return &v.state @@ -7781,7 +7974,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AppendObjectOutput); i { case 0: return &v.state @@ -7793,7 +7986,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListPartsInput); i { case 0: return &v.state @@ -7805,7 +7998,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Part); i { case 0: return &v.state @@ -7817,7 +8010,7 @@ func file_s3_proto_init() { return nil } } - file_s3_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListPartsOutput); i { case 0: return &v.state @@ -7834,20 +8027,20 @@ func file_s3_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_s3_proto_rawDesc, + RawDescriptor: file_oss_proto_rawDesc, NumEnums: 0, - NumMessages: 75, + NumMessages: 76, NumExtensions: 0, NumServices: 1, }, - GoTypes: file_s3_proto_goTypes, - DependencyIndexes: file_s3_proto_depIdxs, - MessageInfos: file_s3_proto_msgTypes, + GoTypes: file_oss_proto_goTypes, + DependencyIndexes: file_oss_proto_depIdxs, + MessageInfos: file_oss_proto_msgTypes, }.Build() - File_s3_proto = out.File - file_s3_proto_rawDesc = nil - file_s3_proto_goTypes = nil - file_s3_proto_depIdxs = nil + File_oss_proto = out.File + file_oss_proto_rawDesc = nil + file_oss_proto_goTypes = nil + file_oss_proto_depIdxs = nil } // Reference imports to suppress errors if they are not otherwise used. @@ -7858,13 +8051,13 @@ var _ grpc.ClientConnInterface // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion6 -// S3Client is the client API for S3 service. +// ObjectStorageServiceClient is the client API for ObjectStorageService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type S3Client interface { +type ObjectStorageServiceClient interface { InitClient(ctx context.Context, in *InitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) - PutObject(ctx context.Context, opts ...grpc.CallOption) (S3_PutObjectClient, error) - GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (S3_GetObjectClient, error) + PutObject(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_PutObjectClient, error) + GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (ObjectStorageService_GetObjectClient, error) DeleteObject(ctx context.Context, in *DeleteObjectInput, opts ...grpc.CallOption) (*DeleteObjectOutput, error) PutObjectTagging(ctx context.Context, in *PutBucketTaggingInput, opts ...grpc.CallOption) (*PutBucketTaggingOutput, error) DeleteObjectTagging(ctx context.Context, in *DeleteObjectTaggingInput, opts ...grpc.CallOption) (*DeleteObjectTaggingOutput, error) @@ -7876,7 +8069,7 @@ type S3Client interface { PutObjectAcl(ctx context.Context, in *PutObjectAclInput, opts ...grpc.CallOption) (*PutObjectAclOutput, error) RestoreObject(ctx context.Context, in *RestoreObjectInput, opts ...grpc.CallOption) (*RestoreObjectOutput, error) CreateMultipartUpload(ctx context.Context, in *CreateMultipartUploadInput, opts ...grpc.CallOption) (*CreateMultipartUploadOutput, error) - UploadPart(ctx context.Context, opts ...grpc.CallOption) (S3_UploadPartClient, error) + UploadPart(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_UploadPartClient, error) UploadPartCopy(ctx context.Context, in *UploadPartCopyInput, opts ...grpc.CallOption) (*UploadPartCopyOutput, error) CompleteMultipartUpload(ctx context.Context, in *CompleteMultipartUploadInput, opts ...grpc.CallOption) (*CompleteMultipartUploadOutput, error) AbortMultipartUpload(ctx context.Context, in *AbortMultipartUploadInput, opts ...grpc.CallOption) (*AbortMultipartUploadOutput, error) @@ -7887,51 +8080,51 @@ type S3Client interface { SignURL(ctx context.Context, in *SignURLInput, opts ...grpc.CallOption) (*SignURLOutput, error) UpdateDownLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) UpdateUpLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) - AppendObject(ctx context.Context, opts ...grpc.CallOption) (S3_AppendObjectClient, error) + AppendObject(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_AppendObjectClient, error) ListParts(ctx context.Context, in *ListPartsInput, opts ...grpc.CallOption) (*ListPartsOutput, error) } -type s3Client struct { +type objectStorageServiceClient struct { cc grpc.ClientConnInterface } -func NewS3Client(cc grpc.ClientConnInterface) S3Client { - return &s3Client{cc} +func NewObjectStorageServiceClient(cc grpc.ClientConnInterface) ObjectStorageServiceClient { + return &objectStorageServiceClient{cc} } -func (c *s3Client) InitClient(ctx context.Context, in *InitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { +func (c *objectStorageServiceClient) InitClient(ctx context.Context, in *InitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/InitClient", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/InitClient", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *s3Client) PutObject(ctx context.Context, opts ...grpc.CallOption) (S3_PutObjectClient, error) { - stream, err := c.cc.NewStream(ctx, &_S3_serviceDesc.Streams[0], "/mosn.proto.runtime.v1.S3/PutObject", opts...) +func (c *objectStorageServiceClient) PutObject(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_PutObjectClient, error) { + stream, err := c.cc.NewStream(ctx, &_ObjectStorageService_serviceDesc.Streams[0], "/spec.proto.extension.v1.ObjectStorageService/PutObject", opts...) if err != nil { return nil, err } - x := &s3PutObjectClient{stream} + x := &objectStorageServicePutObjectClient{stream} return x, nil } -type S3_PutObjectClient interface { +type ObjectStorageService_PutObjectClient interface { Send(*PutObjectInput) error CloseAndRecv() (*PutObjectOutput, error) grpc.ClientStream } -type s3PutObjectClient struct { +type objectStorageServicePutObjectClient struct { grpc.ClientStream } -func (x *s3PutObjectClient) Send(m *PutObjectInput) error { +func (x *objectStorageServicePutObjectClient) Send(m *PutObjectInput) error { return x.ClientStream.SendMsg(m) } -func (x *s3PutObjectClient) CloseAndRecv() (*PutObjectOutput, error) { +func (x *objectStorageServicePutObjectClient) CloseAndRecv() (*PutObjectOutput, error) { if err := x.ClientStream.CloseSend(); err != nil { return nil, err } @@ -7942,12 +8135,12 @@ func (x *s3PutObjectClient) CloseAndRecv() (*PutObjectOutput, error) { return m, nil } -func (c *s3Client) GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (S3_GetObjectClient, error) { - stream, err := c.cc.NewStream(ctx, &_S3_serviceDesc.Streams[1], "/mosn.proto.runtime.v1.S3/GetObject", opts...) +func (c *objectStorageServiceClient) GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (ObjectStorageService_GetObjectClient, error) { + stream, err := c.cc.NewStream(ctx, &_ObjectStorageService_serviceDesc.Streams[1], "/spec.proto.extension.v1.ObjectStorageService/GetObject", opts...) if err != nil { return nil, err } - x := &s3GetObjectClient{stream} + x := &objectStorageServiceGetObjectClient{stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } @@ -7957,16 +8150,16 @@ func (c *s3Client) GetObject(ctx context.Context, in *GetObjectInput, opts ...gr return x, nil } -type S3_GetObjectClient interface { +type ObjectStorageService_GetObjectClient interface { Recv() (*GetObjectOutput, error) grpc.ClientStream } -type s3GetObjectClient struct { +type objectStorageServiceGetObjectClient struct { grpc.ClientStream } -func (x *s3GetObjectClient) Recv() (*GetObjectOutput, error) { +func (x *objectStorageServiceGetObjectClient) Recv() (*GetObjectOutput, error) { m := new(GetObjectOutput) if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err @@ -7974,129 +8167,129 @@ func (x *s3GetObjectClient) Recv() (*GetObjectOutput, error) { return m, nil } -func (c *s3Client) DeleteObject(ctx context.Context, in *DeleteObjectInput, opts ...grpc.CallOption) (*DeleteObjectOutput, error) { +func (c *objectStorageServiceClient) DeleteObject(ctx context.Context, in *DeleteObjectInput, opts ...grpc.CallOption) (*DeleteObjectOutput, error) { out := new(DeleteObjectOutput) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/DeleteObject", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/DeleteObject", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *s3Client) PutObjectTagging(ctx context.Context, in *PutBucketTaggingInput, opts ...grpc.CallOption) (*PutBucketTaggingOutput, error) { +func (c *objectStorageServiceClient) PutObjectTagging(ctx context.Context, in *PutBucketTaggingInput, opts ...grpc.CallOption) (*PutBucketTaggingOutput, error) { out := new(PutBucketTaggingOutput) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/PutObjectTagging", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/PutObjectTagging", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *s3Client) DeleteObjectTagging(ctx context.Context, in *DeleteObjectTaggingInput, opts ...grpc.CallOption) (*DeleteObjectTaggingOutput, error) { +func (c *objectStorageServiceClient) DeleteObjectTagging(ctx context.Context, in *DeleteObjectTaggingInput, opts ...grpc.CallOption) (*DeleteObjectTaggingOutput, error) { out := new(DeleteObjectTaggingOutput) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/DeleteObjectTagging", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/DeleteObjectTagging", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *s3Client) GetObjectTagging(ctx context.Context, in *GetObjectTaggingInput, opts ...grpc.CallOption) (*GetObjectTaggingOutput, error) { +func (c *objectStorageServiceClient) GetObjectTagging(ctx context.Context, in *GetObjectTaggingInput, opts ...grpc.CallOption) (*GetObjectTaggingOutput, error) { out := new(GetObjectTaggingOutput) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/GetObjectTagging", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/GetObjectTagging", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *s3Client) CopyObject(ctx context.Context, in *CopyObjectInput, opts ...grpc.CallOption) (*CopyObjectOutput, error) { +func (c *objectStorageServiceClient) CopyObject(ctx context.Context, in *CopyObjectInput, opts ...grpc.CallOption) (*CopyObjectOutput, error) { out := new(CopyObjectOutput) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/CopyObject", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/CopyObject", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *s3Client) DeleteObjects(ctx context.Context, in *DeleteObjectsInput, opts ...grpc.CallOption) (*DeleteObjectsOutput, error) { +func (c *objectStorageServiceClient) DeleteObjects(ctx context.Context, in *DeleteObjectsInput, opts ...grpc.CallOption) (*DeleteObjectsOutput, error) { out := new(DeleteObjectsOutput) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/DeleteObjects", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/DeleteObjects", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *s3Client) ListObjects(ctx context.Context, in *ListObjectsInput, opts ...grpc.CallOption) (*ListObjectsOutput, error) { +func (c *objectStorageServiceClient) ListObjects(ctx context.Context, in *ListObjectsInput, opts ...grpc.CallOption) (*ListObjectsOutput, error) { out := new(ListObjectsOutput) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/ListObjects", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/ListObjects", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *s3Client) GetObjectAcl(ctx context.Context, in *GetObjectAclInput, opts ...grpc.CallOption) (*GetObjectAclOutput, error) { +func (c *objectStorageServiceClient) GetObjectAcl(ctx context.Context, in *GetObjectAclInput, opts ...grpc.CallOption) (*GetObjectAclOutput, error) { out := new(GetObjectAclOutput) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/GetObjectAcl", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/GetObjectAcl", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *s3Client) PutObjectAcl(ctx context.Context, in *PutObjectAclInput, opts ...grpc.CallOption) (*PutObjectAclOutput, error) { +func (c *objectStorageServiceClient) PutObjectAcl(ctx context.Context, in *PutObjectAclInput, opts ...grpc.CallOption) (*PutObjectAclOutput, error) { out := new(PutObjectAclOutput) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/PutObjectAcl", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/PutObjectAcl", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *s3Client) RestoreObject(ctx context.Context, in *RestoreObjectInput, opts ...grpc.CallOption) (*RestoreObjectOutput, error) { +func (c *objectStorageServiceClient) RestoreObject(ctx context.Context, in *RestoreObjectInput, opts ...grpc.CallOption) (*RestoreObjectOutput, error) { out := new(RestoreObjectOutput) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/RestoreObject", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/RestoreObject", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *s3Client) CreateMultipartUpload(ctx context.Context, in *CreateMultipartUploadInput, opts ...grpc.CallOption) (*CreateMultipartUploadOutput, error) { +func (c *objectStorageServiceClient) CreateMultipartUpload(ctx context.Context, in *CreateMultipartUploadInput, opts ...grpc.CallOption) (*CreateMultipartUploadOutput, error) { out := new(CreateMultipartUploadOutput) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/CreateMultipartUpload", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/CreateMultipartUpload", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *s3Client) UploadPart(ctx context.Context, opts ...grpc.CallOption) (S3_UploadPartClient, error) { - stream, err := c.cc.NewStream(ctx, &_S3_serviceDesc.Streams[2], "/mosn.proto.runtime.v1.S3/UploadPart", opts...) +func (c *objectStorageServiceClient) UploadPart(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_UploadPartClient, error) { + stream, err := c.cc.NewStream(ctx, &_ObjectStorageService_serviceDesc.Streams[2], "/spec.proto.extension.v1.ObjectStorageService/UploadPart", opts...) if err != nil { return nil, err } - x := &s3UploadPartClient{stream} + x := &objectStorageServiceUploadPartClient{stream} return x, nil } -type S3_UploadPartClient interface { +type ObjectStorageService_UploadPartClient interface { Send(*UploadPartInput) error CloseAndRecv() (*UploadPartOutput, error) grpc.ClientStream } -type s3UploadPartClient struct { +type objectStorageServiceUploadPartClient struct { grpc.ClientStream } -func (x *s3UploadPartClient) Send(m *UploadPartInput) error { +func (x *objectStorageServiceUploadPartClient) Send(m *UploadPartInput) error { return x.ClientStream.SendMsg(m) } -func (x *s3UploadPartClient) CloseAndRecv() (*UploadPartOutput, error) { +func (x *objectStorageServiceUploadPartClient) CloseAndRecv() (*UploadPartOutput, error) { if err := x.ClientStream.CloseSend(); err != nil { return nil, err } @@ -8107,120 +8300,120 @@ func (x *s3UploadPartClient) CloseAndRecv() (*UploadPartOutput, error) { return m, nil } -func (c *s3Client) UploadPartCopy(ctx context.Context, in *UploadPartCopyInput, opts ...grpc.CallOption) (*UploadPartCopyOutput, error) { +func (c *objectStorageServiceClient) UploadPartCopy(ctx context.Context, in *UploadPartCopyInput, opts ...grpc.CallOption) (*UploadPartCopyOutput, error) { out := new(UploadPartCopyOutput) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/UploadPartCopy", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/UploadPartCopy", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *s3Client) CompleteMultipartUpload(ctx context.Context, in *CompleteMultipartUploadInput, opts ...grpc.CallOption) (*CompleteMultipartUploadOutput, error) { +func (c *objectStorageServiceClient) CompleteMultipartUpload(ctx context.Context, in *CompleteMultipartUploadInput, opts ...grpc.CallOption) (*CompleteMultipartUploadOutput, error) { out := new(CompleteMultipartUploadOutput) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/CompleteMultipartUpload", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/CompleteMultipartUpload", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *s3Client) AbortMultipartUpload(ctx context.Context, in *AbortMultipartUploadInput, opts ...grpc.CallOption) (*AbortMultipartUploadOutput, error) { +func (c *objectStorageServiceClient) AbortMultipartUpload(ctx context.Context, in *AbortMultipartUploadInput, opts ...grpc.CallOption) (*AbortMultipartUploadOutput, error) { out := new(AbortMultipartUploadOutput) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/AbortMultipartUpload", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/AbortMultipartUpload", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *s3Client) ListMultipartUploads(ctx context.Context, in *ListMultipartUploadsInput, opts ...grpc.CallOption) (*ListMultipartUploadsOutput, error) { +func (c *objectStorageServiceClient) ListMultipartUploads(ctx context.Context, in *ListMultipartUploadsInput, opts ...grpc.CallOption) (*ListMultipartUploadsOutput, error) { out := new(ListMultipartUploadsOutput) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/ListMultipartUploads", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/ListMultipartUploads", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *s3Client) ListObjectVersions(ctx context.Context, in *ListObjectVersionsInput, opts ...grpc.CallOption) (*ListObjectVersionsOutput, error) { +func (c *objectStorageServiceClient) ListObjectVersions(ctx context.Context, in *ListObjectVersionsInput, opts ...grpc.CallOption) (*ListObjectVersionsOutput, error) { out := new(ListObjectVersionsOutput) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/ListObjectVersions", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/ListObjectVersions", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *s3Client) HeadObject(ctx context.Context, in *HeadObjectInput, opts ...grpc.CallOption) (*HeadObjectOutput, error) { +func (c *objectStorageServiceClient) HeadObject(ctx context.Context, in *HeadObjectInput, opts ...grpc.CallOption) (*HeadObjectOutput, error) { out := new(HeadObjectOutput) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/HeadObject", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/HeadObject", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *s3Client) IsObjectExist(ctx context.Context, in *IsObjectExistInput, opts ...grpc.CallOption) (*IsObjectExistOutput, error) { +func (c *objectStorageServiceClient) IsObjectExist(ctx context.Context, in *IsObjectExistInput, opts ...grpc.CallOption) (*IsObjectExistOutput, error) { out := new(IsObjectExistOutput) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/IsObjectExist", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/IsObjectExist", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *s3Client) SignURL(ctx context.Context, in *SignURLInput, opts ...grpc.CallOption) (*SignURLOutput, error) { +func (c *objectStorageServiceClient) SignURL(ctx context.Context, in *SignURLInput, opts ...grpc.CallOption) (*SignURLOutput, error) { out := new(SignURLOutput) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/SignURL", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/SignURL", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *s3Client) UpdateDownLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { +func (c *objectStorageServiceClient) UpdateDownLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/UpdateDownLoadBandwidthRateLimit", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/UpdateDownLoadBandwidthRateLimit", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *s3Client) UpdateUpLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { +func (c *objectStorageServiceClient) UpdateUpLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/UpdateUpLoadBandwidthRateLimit", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/UpdateUpLoadBandwidthRateLimit", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *s3Client) AppendObject(ctx context.Context, opts ...grpc.CallOption) (S3_AppendObjectClient, error) { - stream, err := c.cc.NewStream(ctx, &_S3_serviceDesc.Streams[3], "/mosn.proto.runtime.v1.S3/AppendObject", opts...) +func (c *objectStorageServiceClient) AppendObject(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_AppendObjectClient, error) { + stream, err := c.cc.NewStream(ctx, &_ObjectStorageService_serviceDesc.Streams[3], "/spec.proto.extension.v1.ObjectStorageService/AppendObject", opts...) if err != nil { return nil, err } - x := &s3AppendObjectClient{stream} + x := &objectStorageServiceAppendObjectClient{stream} return x, nil } -type S3_AppendObjectClient interface { +type ObjectStorageService_AppendObjectClient interface { Send(*AppendObjectInput) error CloseAndRecv() (*AppendObjectOutput, error) grpc.ClientStream } -type s3AppendObjectClient struct { +type objectStorageServiceAppendObjectClient struct { grpc.ClientStream } -func (x *s3AppendObjectClient) Send(m *AppendObjectInput) error { +func (x *objectStorageServiceAppendObjectClient) Send(m *AppendObjectInput) error { return x.ClientStream.SendMsg(m) } -func (x *s3AppendObjectClient) CloseAndRecv() (*AppendObjectOutput, error) { +func (x *objectStorageServiceAppendObjectClient) CloseAndRecv() (*AppendObjectOutput, error) { if err := x.ClientStream.CloseSend(); err != nil { return nil, err } @@ -8231,20 +8424,20 @@ func (x *s3AppendObjectClient) CloseAndRecv() (*AppendObjectOutput, error) { return m, nil } -func (c *s3Client) ListParts(ctx context.Context, in *ListPartsInput, opts ...grpc.CallOption) (*ListPartsOutput, error) { +func (c *objectStorageServiceClient) ListParts(ctx context.Context, in *ListPartsInput, opts ...grpc.CallOption) (*ListPartsOutput, error) { out := new(ListPartsOutput) - err := c.cc.Invoke(ctx, "/mosn.proto.runtime.v1.S3/ListParts", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/ListParts", in, out, opts...) if err != nil { return nil, err } return out, nil } -// S3Server is the server API for S3 service. -type S3Server interface { +// ObjectStorageServiceServer is the server API for ObjectStorageService service. +type ObjectStorageServiceServer interface { InitClient(context.Context, *InitInput) (*emptypb.Empty, error) - PutObject(S3_PutObjectServer) error - GetObject(*GetObjectInput, S3_GetObjectServer) error + PutObject(ObjectStorageService_PutObjectServer) error + GetObject(*GetObjectInput, ObjectStorageService_GetObjectServer) error DeleteObject(context.Context, *DeleteObjectInput) (*DeleteObjectOutput, error) PutObjectTagging(context.Context, *PutBucketTaggingInput) (*PutBucketTaggingOutput, error) DeleteObjectTagging(context.Context, *DeleteObjectTaggingInput) (*DeleteObjectTaggingOutput, error) @@ -8256,7 +8449,7 @@ type S3Server interface { PutObjectAcl(context.Context, *PutObjectAclInput) (*PutObjectAclOutput, error) RestoreObject(context.Context, *RestoreObjectInput) (*RestoreObjectOutput, error) CreateMultipartUpload(context.Context, *CreateMultipartUploadInput) (*CreateMultipartUploadOutput, error) - UploadPart(S3_UploadPartServer) error + UploadPart(ObjectStorageService_UploadPartServer) error UploadPartCopy(context.Context, *UploadPartCopyInput) (*UploadPartCopyOutput, error) CompleteMultipartUpload(context.Context, *CompleteMultipartUploadInput) (*CompleteMultipartUploadOutput, error) AbortMultipartUpload(context.Context, *AbortMultipartUploadInput) (*AbortMultipartUploadOutput, error) @@ -8267,137 +8460,137 @@ type S3Server interface { SignURL(context.Context, *SignURLInput) (*SignURLOutput, error) UpdateDownLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) UpdateUpLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) - AppendObject(S3_AppendObjectServer) error + AppendObject(ObjectStorageService_AppendObjectServer) error ListParts(context.Context, *ListPartsInput) (*ListPartsOutput, error) } -// UnimplementedS3Server can be embedded to have forward compatible implementations. -type UnimplementedS3Server struct { +// UnimplementedObjectStorageServiceServer can be embedded to have forward compatible implementations. +type UnimplementedObjectStorageServiceServer struct { } -func (*UnimplementedS3Server) InitClient(context.Context, *InitInput) (*emptypb.Empty, error) { +func (*UnimplementedObjectStorageServiceServer) InitClient(context.Context, *InitInput) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method InitClient not implemented") } -func (*UnimplementedS3Server) PutObject(S3_PutObjectServer) error { +func (*UnimplementedObjectStorageServiceServer) PutObject(ObjectStorageService_PutObjectServer) error { return status.Errorf(codes.Unimplemented, "method PutObject not implemented") } -func (*UnimplementedS3Server) GetObject(*GetObjectInput, S3_GetObjectServer) error { +func (*UnimplementedObjectStorageServiceServer) GetObject(*GetObjectInput, ObjectStorageService_GetObjectServer) error { return status.Errorf(codes.Unimplemented, "method GetObject not implemented") } -func (*UnimplementedS3Server) DeleteObject(context.Context, *DeleteObjectInput) (*DeleteObjectOutput, error) { +func (*UnimplementedObjectStorageServiceServer) DeleteObject(context.Context, *DeleteObjectInput) (*DeleteObjectOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteObject not implemented") } -func (*UnimplementedS3Server) PutObjectTagging(context.Context, *PutBucketTaggingInput) (*PutBucketTaggingOutput, error) { +func (*UnimplementedObjectStorageServiceServer) PutObjectTagging(context.Context, *PutBucketTaggingInput) (*PutBucketTaggingOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method PutObjectTagging not implemented") } -func (*UnimplementedS3Server) DeleteObjectTagging(context.Context, *DeleteObjectTaggingInput) (*DeleteObjectTaggingOutput, error) { +func (*UnimplementedObjectStorageServiceServer) DeleteObjectTagging(context.Context, *DeleteObjectTaggingInput) (*DeleteObjectTaggingOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteObjectTagging not implemented") } -func (*UnimplementedS3Server) GetObjectTagging(context.Context, *GetObjectTaggingInput) (*GetObjectTaggingOutput, error) { +func (*UnimplementedObjectStorageServiceServer) GetObjectTagging(context.Context, *GetObjectTaggingInput) (*GetObjectTaggingOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method GetObjectTagging not implemented") } -func (*UnimplementedS3Server) CopyObject(context.Context, *CopyObjectInput) (*CopyObjectOutput, error) { +func (*UnimplementedObjectStorageServiceServer) CopyObject(context.Context, *CopyObjectInput) (*CopyObjectOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method CopyObject not implemented") } -func (*UnimplementedS3Server) DeleteObjects(context.Context, *DeleteObjectsInput) (*DeleteObjectsOutput, error) { +func (*UnimplementedObjectStorageServiceServer) DeleteObjects(context.Context, *DeleteObjectsInput) (*DeleteObjectsOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteObjects not implemented") } -func (*UnimplementedS3Server) ListObjects(context.Context, *ListObjectsInput) (*ListObjectsOutput, error) { +func (*UnimplementedObjectStorageServiceServer) ListObjects(context.Context, *ListObjectsInput) (*ListObjectsOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method ListObjects not implemented") } -func (*UnimplementedS3Server) GetObjectAcl(context.Context, *GetObjectAclInput) (*GetObjectAclOutput, error) { +func (*UnimplementedObjectStorageServiceServer) GetObjectAcl(context.Context, *GetObjectAclInput) (*GetObjectAclOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method GetObjectAcl not implemented") } -func (*UnimplementedS3Server) PutObjectAcl(context.Context, *PutObjectAclInput) (*PutObjectAclOutput, error) { +func (*UnimplementedObjectStorageServiceServer) PutObjectAcl(context.Context, *PutObjectAclInput) (*PutObjectAclOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method PutObjectAcl not implemented") } -func (*UnimplementedS3Server) RestoreObject(context.Context, *RestoreObjectInput) (*RestoreObjectOutput, error) { +func (*UnimplementedObjectStorageServiceServer) RestoreObject(context.Context, *RestoreObjectInput) (*RestoreObjectOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method RestoreObject not implemented") } -func (*UnimplementedS3Server) CreateMultipartUpload(context.Context, *CreateMultipartUploadInput) (*CreateMultipartUploadOutput, error) { +func (*UnimplementedObjectStorageServiceServer) CreateMultipartUpload(context.Context, *CreateMultipartUploadInput) (*CreateMultipartUploadOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateMultipartUpload not implemented") } -func (*UnimplementedS3Server) UploadPart(S3_UploadPartServer) error { +func (*UnimplementedObjectStorageServiceServer) UploadPart(ObjectStorageService_UploadPartServer) error { return status.Errorf(codes.Unimplemented, "method UploadPart not implemented") } -func (*UnimplementedS3Server) UploadPartCopy(context.Context, *UploadPartCopyInput) (*UploadPartCopyOutput, error) { +func (*UnimplementedObjectStorageServiceServer) UploadPartCopy(context.Context, *UploadPartCopyInput) (*UploadPartCopyOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method UploadPartCopy not implemented") } -func (*UnimplementedS3Server) CompleteMultipartUpload(context.Context, *CompleteMultipartUploadInput) (*CompleteMultipartUploadOutput, error) { +func (*UnimplementedObjectStorageServiceServer) CompleteMultipartUpload(context.Context, *CompleteMultipartUploadInput) (*CompleteMultipartUploadOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method CompleteMultipartUpload not implemented") } -func (*UnimplementedS3Server) AbortMultipartUpload(context.Context, *AbortMultipartUploadInput) (*AbortMultipartUploadOutput, error) { +func (*UnimplementedObjectStorageServiceServer) AbortMultipartUpload(context.Context, *AbortMultipartUploadInput) (*AbortMultipartUploadOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method AbortMultipartUpload not implemented") } -func (*UnimplementedS3Server) ListMultipartUploads(context.Context, *ListMultipartUploadsInput) (*ListMultipartUploadsOutput, error) { +func (*UnimplementedObjectStorageServiceServer) ListMultipartUploads(context.Context, *ListMultipartUploadsInput) (*ListMultipartUploadsOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method ListMultipartUploads not implemented") } -func (*UnimplementedS3Server) ListObjectVersions(context.Context, *ListObjectVersionsInput) (*ListObjectVersionsOutput, error) { +func (*UnimplementedObjectStorageServiceServer) ListObjectVersions(context.Context, *ListObjectVersionsInput) (*ListObjectVersionsOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method ListObjectVersions not implemented") } -func (*UnimplementedS3Server) HeadObject(context.Context, *HeadObjectInput) (*HeadObjectOutput, error) { +func (*UnimplementedObjectStorageServiceServer) HeadObject(context.Context, *HeadObjectInput) (*HeadObjectOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method HeadObject not implemented") } -func (*UnimplementedS3Server) IsObjectExist(context.Context, *IsObjectExistInput) (*IsObjectExistOutput, error) { +func (*UnimplementedObjectStorageServiceServer) IsObjectExist(context.Context, *IsObjectExistInput) (*IsObjectExistOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method IsObjectExist not implemented") } -func (*UnimplementedS3Server) SignURL(context.Context, *SignURLInput) (*SignURLOutput, error) { +func (*UnimplementedObjectStorageServiceServer) SignURL(context.Context, *SignURLInput) (*SignURLOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method SignURL not implemented") } -func (*UnimplementedS3Server) UpdateDownLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { +func (*UnimplementedObjectStorageServiceServer) UpdateDownLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateDownLoadBandwidthRateLimit not implemented") } -func (*UnimplementedS3Server) UpdateUpLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { +func (*UnimplementedObjectStorageServiceServer) UpdateUpLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateUpLoadBandwidthRateLimit not implemented") } -func (*UnimplementedS3Server) AppendObject(S3_AppendObjectServer) error { +func (*UnimplementedObjectStorageServiceServer) AppendObject(ObjectStorageService_AppendObjectServer) error { return status.Errorf(codes.Unimplemented, "method AppendObject not implemented") } -func (*UnimplementedS3Server) ListParts(context.Context, *ListPartsInput) (*ListPartsOutput, error) { +func (*UnimplementedObjectStorageServiceServer) ListParts(context.Context, *ListPartsInput) (*ListPartsOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method ListParts not implemented") } -func RegisterS3Server(s *grpc.Server, srv S3Server) { - s.RegisterService(&_S3_serviceDesc, srv) +func RegisterObjectStorageServiceServer(s *grpc.Server, srv ObjectStorageServiceServer) { + s.RegisterService(&_ObjectStorageService_serviceDesc, srv) } -func _S3_InitClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_InitClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(InitInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).InitClient(ctx, in) + return srv.(ObjectStorageServiceServer).InitClient(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/InitClient", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/InitClient", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).InitClient(ctx, req.(*InitInput)) + return srv.(ObjectStorageServiceServer).InitClient(ctx, req.(*InitInput)) } return interceptor(ctx, in, info, handler) } -func _S3_PutObject_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(S3Server).PutObject(&s3PutObjectServer{stream}) +func _ObjectStorageService_PutObject_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(ObjectStorageServiceServer).PutObject(&objectStorageServicePutObjectServer{stream}) } -type S3_PutObjectServer interface { +type ObjectStorageService_PutObjectServer interface { SendAndClose(*PutObjectOutput) error Recv() (*PutObjectInput, error) grpc.ServerStream } -type s3PutObjectServer struct { +type objectStorageServicePutObjectServer struct { grpc.ServerStream } -func (x *s3PutObjectServer) SendAndClose(m *PutObjectOutput) error { +func (x *objectStorageServicePutObjectServer) SendAndClose(m *PutObjectOutput) error { return x.ServerStream.SendMsg(m) } -func (x *s3PutObjectServer) Recv() (*PutObjectInput, error) { +func (x *objectStorageServicePutObjectServer) Recv() (*PutObjectInput, error) { m := new(PutObjectInput) if err := x.ServerStream.RecvMsg(m); err != nil { return nil, err @@ -8405,244 +8598,244 @@ func (x *s3PutObjectServer) Recv() (*PutObjectInput, error) { return m, nil } -func _S3_GetObject_Handler(srv interface{}, stream grpc.ServerStream) error { +func _ObjectStorageService_GetObject_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(GetObjectInput) if err := stream.RecvMsg(m); err != nil { return err } - return srv.(S3Server).GetObject(m, &s3GetObjectServer{stream}) + return srv.(ObjectStorageServiceServer).GetObject(m, &objectStorageServiceGetObjectServer{stream}) } -type S3_GetObjectServer interface { +type ObjectStorageService_GetObjectServer interface { Send(*GetObjectOutput) error grpc.ServerStream } -type s3GetObjectServer struct { +type objectStorageServiceGetObjectServer struct { grpc.ServerStream } -func (x *s3GetObjectServer) Send(m *GetObjectOutput) error { +func (x *objectStorageServiceGetObjectServer) Send(m *GetObjectOutput) error { return x.ServerStream.SendMsg(m) } -func _S3_DeleteObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_DeleteObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteObjectInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).DeleteObject(ctx, in) + return srv.(ObjectStorageServiceServer).DeleteObject(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/DeleteObject", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/DeleteObject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).DeleteObject(ctx, req.(*DeleteObjectInput)) + return srv.(ObjectStorageServiceServer).DeleteObject(ctx, req.(*DeleteObjectInput)) } return interceptor(ctx, in, info, handler) } -func _S3_PutObjectTagging_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_PutObjectTagging_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(PutBucketTaggingInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).PutObjectTagging(ctx, in) + return srv.(ObjectStorageServiceServer).PutObjectTagging(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/PutObjectTagging", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/PutObjectTagging", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).PutObjectTagging(ctx, req.(*PutBucketTaggingInput)) + return srv.(ObjectStorageServiceServer).PutObjectTagging(ctx, req.(*PutBucketTaggingInput)) } return interceptor(ctx, in, info, handler) } -func _S3_DeleteObjectTagging_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_DeleteObjectTagging_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteObjectTaggingInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).DeleteObjectTagging(ctx, in) + return srv.(ObjectStorageServiceServer).DeleteObjectTagging(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/DeleteObjectTagging", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/DeleteObjectTagging", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).DeleteObjectTagging(ctx, req.(*DeleteObjectTaggingInput)) + return srv.(ObjectStorageServiceServer).DeleteObjectTagging(ctx, req.(*DeleteObjectTaggingInput)) } return interceptor(ctx, in, info, handler) } -func _S3_GetObjectTagging_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_GetObjectTagging_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetObjectTaggingInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).GetObjectTagging(ctx, in) + return srv.(ObjectStorageServiceServer).GetObjectTagging(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/GetObjectTagging", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/GetObjectTagging", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).GetObjectTagging(ctx, req.(*GetObjectTaggingInput)) + return srv.(ObjectStorageServiceServer).GetObjectTagging(ctx, req.(*GetObjectTaggingInput)) } return interceptor(ctx, in, info, handler) } -func _S3_CopyObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_CopyObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CopyObjectInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).CopyObject(ctx, in) + return srv.(ObjectStorageServiceServer).CopyObject(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/CopyObject", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/CopyObject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).CopyObject(ctx, req.(*CopyObjectInput)) + return srv.(ObjectStorageServiceServer).CopyObject(ctx, req.(*CopyObjectInput)) } return interceptor(ctx, in, info, handler) } -func _S3_DeleteObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_DeleteObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteObjectsInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).DeleteObjects(ctx, in) + return srv.(ObjectStorageServiceServer).DeleteObjects(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/DeleteObjects", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/DeleteObjects", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).DeleteObjects(ctx, req.(*DeleteObjectsInput)) + return srv.(ObjectStorageServiceServer).DeleteObjects(ctx, req.(*DeleteObjectsInput)) } return interceptor(ctx, in, info, handler) } -func _S3_ListObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_ListObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListObjectsInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).ListObjects(ctx, in) + return srv.(ObjectStorageServiceServer).ListObjects(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/ListObjects", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/ListObjects", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).ListObjects(ctx, req.(*ListObjectsInput)) + return srv.(ObjectStorageServiceServer).ListObjects(ctx, req.(*ListObjectsInput)) } return interceptor(ctx, in, info, handler) } -func _S3_GetObjectAcl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_GetObjectAcl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetObjectAclInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).GetObjectAcl(ctx, in) + return srv.(ObjectStorageServiceServer).GetObjectAcl(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/GetObjectAcl", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/GetObjectAcl", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).GetObjectAcl(ctx, req.(*GetObjectAclInput)) + return srv.(ObjectStorageServiceServer).GetObjectAcl(ctx, req.(*GetObjectAclInput)) } return interceptor(ctx, in, info, handler) } -func _S3_PutObjectAcl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_PutObjectAcl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(PutObjectAclInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).PutObjectAcl(ctx, in) + return srv.(ObjectStorageServiceServer).PutObjectAcl(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/PutObjectAcl", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/PutObjectAcl", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).PutObjectAcl(ctx, req.(*PutObjectAclInput)) + return srv.(ObjectStorageServiceServer).PutObjectAcl(ctx, req.(*PutObjectAclInput)) } return interceptor(ctx, in, info, handler) } -func _S3_RestoreObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_RestoreObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(RestoreObjectInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).RestoreObject(ctx, in) + return srv.(ObjectStorageServiceServer).RestoreObject(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/RestoreObject", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/RestoreObject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).RestoreObject(ctx, req.(*RestoreObjectInput)) + return srv.(ObjectStorageServiceServer).RestoreObject(ctx, req.(*RestoreObjectInput)) } return interceptor(ctx, in, info, handler) } -func _S3_CreateMultipartUpload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_CreateMultipartUpload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateMultipartUploadInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).CreateMultipartUpload(ctx, in) + return srv.(ObjectStorageServiceServer).CreateMultipartUpload(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/CreateMultipartUpload", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/CreateMultipartUpload", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).CreateMultipartUpload(ctx, req.(*CreateMultipartUploadInput)) + return srv.(ObjectStorageServiceServer).CreateMultipartUpload(ctx, req.(*CreateMultipartUploadInput)) } return interceptor(ctx, in, info, handler) } -func _S3_UploadPart_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(S3Server).UploadPart(&s3UploadPartServer{stream}) +func _ObjectStorageService_UploadPart_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(ObjectStorageServiceServer).UploadPart(&objectStorageServiceUploadPartServer{stream}) } -type S3_UploadPartServer interface { +type ObjectStorageService_UploadPartServer interface { SendAndClose(*UploadPartOutput) error Recv() (*UploadPartInput, error) grpc.ServerStream } -type s3UploadPartServer struct { +type objectStorageServiceUploadPartServer struct { grpc.ServerStream } -func (x *s3UploadPartServer) SendAndClose(m *UploadPartOutput) error { +func (x *objectStorageServiceUploadPartServer) SendAndClose(m *UploadPartOutput) error { return x.ServerStream.SendMsg(m) } -func (x *s3UploadPartServer) Recv() (*UploadPartInput, error) { +func (x *objectStorageServiceUploadPartServer) Recv() (*UploadPartInput, error) { m := new(UploadPartInput) if err := x.ServerStream.RecvMsg(m); err != nil { return nil, err @@ -8650,205 +8843,205 @@ func (x *s3UploadPartServer) Recv() (*UploadPartInput, error) { return m, nil } -func _S3_UploadPartCopy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_UploadPartCopy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UploadPartCopyInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).UploadPartCopy(ctx, in) + return srv.(ObjectStorageServiceServer).UploadPartCopy(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/UploadPartCopy", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/UploadPartCopy", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).UploadPartCopy(ctx, req.(*UploadPartCopyInput)) + return srv.(ObjectStorageServiceServer).UploadPartCopy(ctx, req.(*UploadPartCopyInput)) } return interceptor(ctx, in, info, handler) } -func _S3_CompleteMultipartUpload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_CompleteMultipartUpload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CompleteMultipartUploadInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).CompleteMultipartUpload(ctx, in) + return srv.(ObjectStorageServiceServer).CompleteMultipartUpload(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/CompleteMultipartUpload", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/CompleteMultipartUpload", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).CompleteMultipartUpload(ctx, req.(*CompleteMultipartUploadInput)) + return srv.(ObjectStorageServiceServer).CompleteMultipartUpload(ctx, req.(*CompleteMultipartUploadInput)) } return interceptor(ctx, in, info, handler) } -func _S3_AbortMultipartUpload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_AbortMultipartUpload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(AbortMultipartUploadInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).AbortMultipartUpload(ctx, in) + return srv.(ObjectStorageServiceServer).AbortMultipartUpload(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/AbortMultipartUpload", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/AbortMultipartUpload", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).AbortMultipartUpload(ctx, req.(*AbortMultipartUploadInput)) + return srv.(ObjectStorageServiceServer).AbortMultipartUpload(ctx, req.(*AbortMultipartUploadInput)) } return interceptor(ctx, in, info, handler) } -func _S3_ListMultipartUploads_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_ListMultipartUploads_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListMultipartUploadsInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).ListMultipartUploads(ctx, in) + return srv.(ObjectStorageServiceServer).ListMultipartUploads(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/ListMultipartUploads", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/ListMultipartUploads", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).ListMultipartUploads(ctx, req.(*ListMultipartUploadsInput)) + return srv.(ObjectStorageServiceServer).ListMultipartUploads(ctx, req.(*ListMultipartUploadsInput)) } return interceptor(ctx, in, info, handler) } -func _S3_ListObjectVersions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_ListObjectVersions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListObjectVersionsInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).ListObjectVersions(ctx, in) + return srv.(ObjectStorageServiceServer).ListObjectVersions(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/ListObjectVersions", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/ListObjectVersions", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).ListObjectVersions(ctx, req.(*ListObjectVersionsInput)) + return srv.(ObjectStorageServiceServer).ListObjectVersions(ctx, req.(*ListObjectVersionsInput)) } return interceptor(ctx, in, info, handler) } -func _S3_HeadObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_HeadObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(HeadObjectInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).HeadObject(ctx, in) + return srv.(ObjectStorageServiceServer).HeadObject(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/HeadObject", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/HeadObject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).HeadObject(ctx, req.(*HeadObjectInput)) + return srv.(ObjectStorageServiceServer).HeadObject(ctx, req.(*HeadObjectInput)) } return interceptor(ctx, in, info, handler) } -func _S3_IsObjectExist_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_IsObjectExist_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(IsObjectExistInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).IsObjectExist(ctx, in) + return srv.(ObjectStorageServiceServer).IsObjectExist(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/IsObjectExist", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/IsObjectExist", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).IsObjectExist(ctx, req.(*IsObjectExistInput)) + return srv.(ObjectStorageServiceServer).IsObjectExist(ctx, req.(*IsObjectExistInput)) } return interceptor(ctx, in, info, handler) } -func _S3_SignURL_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_SignURL_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(SignURLInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).SignURL(ctx, in) + return srv.(ObjectStorageServiceServer).SignURL(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/SignURL", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/SignURL", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).SignURL(ctx, req.(*SignURLInput)) + return srv.(ObjectStorageServiceServer).SignURL(ctx, req.(*SignURLInput)) } return interceptor(ctx, in, info, handler) } -func _S3_UpdateDownLoadBandwidthRateLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_UpdateDownLoadBandwidthRateLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpdateBandwidthRateLimitInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).UpdateDownLoadBandwidthRateLimit(ctx, in) + return srv.(ObjectStorageServiceServer).UpdateDownLoadBandwidthRateLimit(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/UpdateDownLoadBandwidthRateLimit", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/UpdateDownLoadBandwidthRateLimit", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).UpdateDownLoadBandwidthRateLimit(ctx, req.(*UpdateBandwidthRateLimitInput)) + return srv.(ObjectStorageServiceServer).UpdateDownLoadBandwidthRateLimit(ctx, req.(*UpdateBandwidthRateLimitInput)) } return interceptor(ctx, in, info, handler) } -func _S3_UpdateUpLoadBandwidthRateLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_UpdateUpLoadBandwidthRateLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpdateBandwidthRateLimitInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).UpdateUpLoadBandwidthRateLimit(ctx, in) + return srv.(ObjectStorageServiceServer).UpdateUpLoadBandwidthRateLimit(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/UpdateUpLoadBandwidthRateLimit", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/UpdateUpLoadBandwidthRateLimit", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).UpdateUpLoadBandwidthRateLimit(ctx, req.(*UpdateBandwidthRateLimitInput)) + return srv.(ObjectStorageServiceServer).UpdateUpLoadBandwidthRateLimit(ctx, req.(*UpdateBandwidthRateLimitInput)) } return interceptor(ctx, in, info, handler) } -func _S3_AppendObject_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(S3Server).AppendObject(&s3AppendObjectServer{stream}) +func _ObjectStorageService_AppendObject_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(ObjectStorageServiceServer).AppendObject(&objectStorageServiceAppendObjectServer{stream}) } -type S3_AppendObjectServer interface { +type ObjectStorageService_AppendObjectServer interface { SendAndClose(*AppendObjectOutput) error Recv() (*AppendObjectInput, error) grpc.ServerStream } -type s3AppendObjectServer struct { +type objectStorageServiceAppendObjectServer struct { grpc.ServerStream } -func (x *s3AppendObjectServer) SendAndClose(m *AppendObjectOutput) error { +func (x *objectStorageServiceAppendObjectServer) SendAndClose(m *AppendObjectOutput) error { return x.ServerStream.SendMsg(m) } -func (x *s3AppendObjectServer) Recv() (*AppendObjectInput, error) { +func (x *objectStorageServiceAppendObjectServer) Recv() (*AppendObjectInput, error) { m := new(AppendObjectInput) if err := x.ServerStream.RecvMsg(m); err != nil { return nil, err @@ -8856,142 +9049,142 @@ func (x *s3AppendObjectServer) Recv() (*AppendObjectInput, error) { return m, nil } -func _S3_ListParts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_ListParts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListPartsInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(S3Server).ListParts(ctx, in) + return srv.(ObjectStorageServiceServer).ListParts(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mosn.proto.runtime.v1.S3/ListParts", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/ListParts", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(S3Server).ListParts(ctx, req.(*ListPartsInput)) + return srv.(ObjectStorageServiceServer).ListParts(ctx, req.(*ListPartsInput)) } return interceptor(ctx, in, info, handler) } -var _S3_serviceDesc = grpc.ServiceDesc{ - ServiceName: "mosn.proto.runtime.v1.S3", - HandlerType: (*S3Server)(nil), +var _ObjectStorageService_serviceDesc = grpc.ServiceDesc{ + ServiceName: "spec.proto.extension.v1.ObjectStorageService", + HandlerType: (*ObjectStorageServiceServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "InitClient", - Handler: _S3_InitClient_Handler, + Handler: _ObjectStorageService_InitClient_Handler, }, { MethodName: "DeleteObject", - Handler: _S3_DeleteObject_Handler, + Handler: _ObjectStorageService_DeleteObject_Handler, }, { MethodName: "PutObjectTagging", - Handler: _S3_PutObjectTagging_Handler, + Handler: _ObjectStorageService_PutObjectTagging_Handler, }, { MethodName: "DeleteObjectTagging", - Handler: _S3_DeleteObjectTagging_Handler, + Handler: _ObjectStorageService_DeleteObjectTagging_Handler, }, { MethodName: "GetObjectTagging", - Handler: _S3_GetObjectTagging_Handler, + Handler: _ObjectStorageService_GetObjectTagging_Handler, }, { MethodName: "CopyObject", - Handler: _S3_CopyObject_Handler, + Handler: _ObjectStorageService_CopyObject_Handler, }, { MethodName: "DeleteObjects", - Handler: _S3_DeleteObjects_Handler, + Handler: _ObjectStorageService_DeleteObjects_Handler, }, { MethodName: "ListObjects", - Handler: _S3_ListObjects_Handler, + Handler: _ObjectStorageService_ListObjects_Handler, }, { MethodName: "GetObjectAcl", - Handler: _S3_GetObjectAcl_Handler, + Handler: _ObjectStorageService_GetObjectAcl_Handler, }, { MethodName: "PutObjectAcl", - Handler: _S3_PutObjectAcl_Handler, + Handler: _ObjectStorageService_PutObjectAcl_Handler, }, { MethodName: "RestoreObject", - Handler: _S3_RestoreObject_Handler, + Handler: _ObjectStorageService_RestoreObject_Handler, }, { MethodName: "CreateMultipartUpload", - Handler: _S3_CreateMultipartUpload_Handler, + Handler: _ObjectStorageService_CreateMultipartUpload_Handler, }, { MethodName: "UploadPartCopy", - Handler: _S3_UploadPartCopy_Handler, + Handler: _ObjectStorageService_UploadPartCopy_Handler, }, { MethodName: "CompleteMultipartUpload", - Handler: _S3_CompleteMultipartUpload_Handler, + Handler: _ObjectStorageService_CompleteMultipartUpload_Handler, }, { MethodName: "AbortMultipartUpload", - Handler: _S3_AbortMultipartUpload_Handler, + Handler: _ObjectStorageService_AbortMultipartUpload_Handler, }, { MethodName: "ListMultipartUploads", - Handler: _S3_ListMultipartUploads_Handler, + Handler: _ObjectStorageService_ListMultipartUploads_Handler, }, { MethodName: "ListObjectVersions", - Handler: _S3_ListObjectVersions_Handler, + Handler: _ObjectStorageService_ListObjectVersions_Handler, }, { MethodName: "HeadObject", - Handler: _S3_HeadObject_Handler, + Handler: _ObjectStorageService_HeadObject_Handler, }, { MethodName: "IsObjectExist", - Handler: _S3_IsObjectExist_Handler, + Handler: _ObjectStorageService_IsObjectExist_Handler, }, { MethodName: "SignURL", - Handler: _S3_SignURL_Handler, + Handler: _ObjectStorageService_SignURL_Handler, }, { MethodName: "UpdateDownLoadBandwidthRateLimit", - Handler: _S3_UpdateDownLoadBandwidthRateLimit_Handler, + Handler: _ObjectStorageService_UpdateDownLoadBandwidthRateLimit_Handler, }, { MethodName: "UpdateUpLoadBandwidthRateLimit", - Handler: _S3_UpdateUpLoadBandwidthRateLimit_Handler, + Handler: _ObjectStorageService_UpdateUpLoadBandwidthRateLimit_Handler, }, { MethodName: "ListParts", - Handler: _S3_ListParts_Handler, + Handler: _ObjectStorageService_ListParts_Handler, }, }, Streams: []grpc.StreamDesc{ { StreamName: "PutObject", - Handler: _S3_PutObject_Handler, + Handler: _ObjectStorageService_PutObject_Handler, ClientStreams: true, }, { StreamName: "GetObject", - Handler: _S3_GetObject_Handler, + Handler: _ObjectStorageService_GetObject_Handler, ServerStreams: true, }, { StreamName: "UploadPart", - Handler: _S3_UploadPart_Handler, + Handler: _ObjectStorageService_UploadPart_Handler, ClientStreams: true, }, { StreamName: "AppendObject", - Handler: _S3_AppendObject_Handler, + Handler: _ObjectStorageService_AppendObject_Handler, ClientStreams: true, }, }, - Metadata: "s3.proto", + Metadata: "oss.proto", } diff --git a/spec/proto/extension/v1/s3.proto b/spec/proto/extension/v1/oss.proto similarity index 96% rename from spec/proto/extension/v1/s3.proto rename to spec/proto/extension/v1/oss.proto index bae0e113d9..1213f4f8d5 100644 --- a/spec/proto/extension/v1/s3.proto +++ b/spec/proto/extension/v1/oss.proto @@ -1,12 +1,12 @@ syntax = "proto3"; -package mosn.proto.runtime.v1; +package spec.proto.extension.v1; import "google/protobuf/empty.proto"; option go_package = "mosn.io/layotto/spec/proto/extension/v1;s3"; -service S3 { +service ObjectStorageService{ rpc InitClient(InitInput) returns (google.protobuf.Empty){} rpc PutObject(stream PutObjectInput) returns(PutObjectOutput){} rpc GetObject(GetObjectInput) returns (stream GetObjectOutput){} @@ -69,6 +69,23 @@ message GetObjectInput { } message GetObjectOutput { bytes body = 1; + string cache_control = 2; + string content_disposition = 3; + string content_encoding = 4; + string content_language = 5; + int64 content_length = 6; + string content_range = 7; + string content_type = 8; + bool delete_marker = 9; + string etag = 10; + string expiration = 11; + string expires = 12; + int64 last_modified = 13; + string version_id = 14; + int64 tag_count = 15; + string storage_class = 16; + int64 parts_count = 17; + map metadata = 18; } message PutObjectInput{ From 4aa0a2c1b6de990c4439a6c6227f557b337f075c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 15 Jun 2022 12:12:00 +0800 Subject: [PATCH 028/126] format project --- components/file/aliyun/oss.go | 8 ++++---- components/file/aws/oss.go | 5 ++--- components/file/s3def.go | 23 ++++++++++++++++++++++- pkg/grpc/extension/s3/s3.go | 13 +++++++++---- spec/proto/extension/v1/oss.pb.go | 5 +++-- 5 files changed, 40 insertions(+), 14 deletions(-) diff --git a/components/file/aliyun/oss.go b/components/file/aliyun/oss.go index c9104bd99d..82a4e1a0cf 100644 --- a/components/file/aliyun/oss.go +++ b/components/file/aliyun/oss.go @@ -19,7 +19,6 @@ package aliyun import ( "context" "encoding/json" - "io" "net/http" "github.com/aliyun/aliyun-oss-go-sdk/oss" @@ -82,7 +81,7 @@ func (a *AliyunOSS) InitClient(ctx context.Context, req *file.InitRequest) error return nil } -func (a *AliyunOSS) GetObject(ctx context.Context, req *file.GetObjectInput) (io.ReadCloser, error) { +func (a *AliyunOSS) GetObject(ctx context.Context, req *file.GetObjectInput) (*file.GetObjectOutput, error) { client, err := a.selectClient(map[string]string{}, "") if err != nil { return nil, err @@ -94,7 +93,7 @@ func (a *AliyunOSS) GetObject(ctx context.Context, req *file.GetObjectInput) (io //user can use SignedUrl to get file without ak、sk if req.SignedUrl != "" { body, err := bucket.GetObjectWithURL(req.SignedUrl) - return body, err + return &file.GetObjectOutput{DataStream: body}, err } body, err := bucket.GetObject(req.Key, IfUnmodifiedSince(req.IfUnmodifiedSince), @@ -104,7 +103,8 @@ func (a *AliyunOSS) GetObject(ctx context.Context, req *file.GetObjectInput) (io oss.Range(req.Start, req.End), AcceptEncoding(req.AcceptEncoding), ) - return body, err + + return &file.GetObjectOutput{DataStream: body}, err } func (a *AliyunOSS) PutObject(ctx context.Context, req *file.PutObjectInput) (*file.PutObjectOutput, error) { diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index 8fe8fe8fca..27f71f39de 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -19,7 +19,6 @@ import ( "context" "encoding/json" "errors" - "io" "time" "github.com/aws/aws-sdk-go-v2/aws" @@ -98,7 +97,7 @@ func (a *AwsOss) InitClient(ctx context.Context, req *file.InitRequest) error { return nil } -func (a *AwsOss) GetObject(ctx context.Context, req *file.GetObjectInput) (io.ReadCloser, error) { +func (a *AwsOss) GetObject(ctx context.Context, req *file.GetObjectInput) (*file.GetObjectOutput, error) { input := &s3.GetObjectInput{ Bucket: &req.Bucket, Key: &req.Key, @@ -111,7 +110,7 @@ func (a *AwsOss) GetObject(ctx context.Context, req *file.GetObjectInput) (io.Re if err != nil { return nil, err } - return ob.Body, nil + return &file.GetObjectOutput{DataStream: ob.Body}, nil } func (a *AwsOss) PutObject(ctx context.Context, req *file.PutObjectInput) (*file.PutObjectOutput, error) { diff --git a/components/file/s3def.go b/components/file/s3def.go index 4710f94a58..34e4897c8f 100644 --- a/components/file/s3def.go +++ b/components/file/s3def.go @@ -29,7 +29,7 @@ var ( type Oss interface { InitConfig(context.Context, *FileConfig) error InitClient(context.Context, *InitRequest) error - GetObject(context.Context, *GetObjectInput) (io.ReadCloser, error) + GetObject(context.Context, *GetObjectInput) (*GetObjectOutput, error) PutObject(context.Context, *PutObjectInput) (*PutObjectOutput, error) DeleteObject(context.Context, *DeleteObjectInput) (*DeleteObjectOutput, error) PutObjectTagging(context.Context, *PutBucketTaggingInput) (*PutBucketTaggingOutput, error) @@ -90,6 +90,27 @@ type GetObjectInput struct { SignedUrl string `protobuf:"bytes,24,opt,name=signed_url,json=signedUrl,proto3" json:"signed_url,omitempty"` } +type GetObjectOutput struct { + DataStream io.ReadCloser + CacheControl string `protobuf:"bytes,2,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` + ContentDisposition string `protobuf:"bytes,3,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` + ContentEncoding string `protobuf:"bytes,4,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` + ContentLanguage string `protobuf:"bytes,5,opt,name=content_language,json=contentLanguage,proto3" json:"content_language,omitempty"` + ContentLength int64 `protobuf:"varint,6,opt,name=content_length,json=contentLength,proto3" json:"content_length,omitempty"` + ContentRange string `protobuf:"bytes,7,opt,name=content_range,json=contentRange,proto3" json:"content_range,omitempty"` + ContentType string `protobuf:"bytes,8,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` + DeleteMarker bool `protobuf:"varint,9,opt,name=delete_marker,json=deleteMarker,proto3" json:"delete_marker,omitempty"` + Etag string `protobuf:"bytes,10,opt,name=etag,proto3" json:"etag,omitempty"` + Expiration string `protobuf:"bytes,11,opt,name=expiration,proto3" json:"expiration,omitempty"` + Expires string `protobuf:"bytes,12,opt,name=expires,proto3" json:"expires,omitempty"` + LastModified int64 `protobuf:"varint,13,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` + VersionId string `protobuf:"bytes,14,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + TagCount int64 `protobuf:"varint,15,opt,name=tag_count,json=tagCount,proto3" json:"tag_count,omitempty"` + StorageClass string `protobuf:"bytes,16,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` + PartsCount int64 `protobuf:"varint,17,opt,name=parts_count,json=partsCount,proto3" json:"parts_count,omitempty"` + Metadata map[string]string `protobuf:"bytes,18,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + type PutObjectInput struct { DataStream io.Reader ACL string `protobuf:"bytes,2,opt,name=acl,proto3" json:"acl,omitempty"` diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go index 1b6594790d..60bb0c9409 100644 --- a/pkg/grpc/extension/s3/s3.go +++ b/pkg/grpc/extension/s3/s3.go @@ -101,7 +101,7 @@ func (s *S3Server) GetObject(req *s3.GetObjectInput, stream s3.ObjectStorageServ if err != nil { return status.Errorf(codes.InvalidArgument, "transfer request data fail for GetObject,err: %+v", err) } - data, err := s.ossInstance[req.StoreName].GetObject(stream.Context(), st) + result, err := s.ossInstance[req.StoreName].GetObject(stream.Context(), st) if err != nil { return status.Errorf(codes.Internal, "get file fail,err: %+v", err) } @@ -112,19 +112,24 @@ func (s *S3Server) GetObject(req *s3.GetObjectInput, stream s3.ObjectStorageServ buf = make([]byte, 102400) } defer func() { - data.Close() + result.DataStream.Close() *buffsPtr = buf bytesPool.Put(buffsPtr) }() for { - length, err := data.Read(buf) + length, err := result.DataStream.Read(buf) if err != nil && err != io.EOF { log.DefaultLogger.Warnf("get file fail, err: %+v", err) return status.Errorf(codes.Internal, "get file fail,err: %+v", err) } if err == nil || (err == io.EOF && length != 0) { - resp := &s3.GetObjectOutput{Body: buf[:length]} + resp := &s3.GetObjectOutput{} + err := transferData(result, resp) + if err != nil { + return status.Errorf(codes.InvalidArgument, "transfer request data fail for GetObject,err: %+v", err) + } + resp.Body = buf[:length] if err = stream.Send(resp); err != nil { return status.Errorf(codes.Internal, "send file data fail,err: %+v", err) } diff --git a/spec/proto/extension/v1/oss.pb.go b/spec/proto/extension/v1/oss.pb.go index 76a7f036d1..5fbfec14fc 100644 --- a/spec/proto/extension/v1/oss.pb.go +++ b/spec/proto/extension/v1/oss.pb.go @@ -8,6 +8,9 @@ package s3 import ( context "context" + reflect "reflect" + sync "sync" + proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -15,8 +18,6 @@ import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" - reflect "reflect" - sync "sync" ) const ( From 86e0085c3e4ece67e91216ba3d2890852ca3ae36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 15 Jun 2022 18:00:00 +0800 Subject: [PATCH 029/126] fix demo client --- demo/file/s3/client.go | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/demo/file/s3/client.go b/demo/file/s3/client.go index 641c3df916..dbfcf07ab3 100644 --- a/demo/file/s3/client.go +++ b/demo/file/s3/client.go @@ -38,7 +38,7 @@ func TestGetObjectInput(fileName string) { return } - c := s3.NewS3Client(conn) + c := s3.NewObjectStorageServiceClient(conn) req := &s3.GetObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: fileName} cli, err := c.GetObject(context.Background(), req) if err != nil { @@ -65,7 +65,7 @@ func TestPutObject(fileName string, value string) { fmt.Printf("conn build failed,err:%+v", err) return } - c := s3.NewS3Client(conn) + c := s3.NewObjectStorageServiceClient(conn) req := &s3.PutObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: fileName} stream, err := c.PutObject(context.TODO()) if err != nil { @@ -86,7 +86,7 @@ func TestListObjects() { fmt.Printf("conn build failed,err:%+v", err) return } - c := s3.NewS3Client(conn) + c := s3.NewObjectStorageServiceClient(conn) marker := "" for { req := &s3.ListObjectsInput{StoreName: storeName, Bucket: "antsys-wenxuwan", MaxKeys: 2, Marker: marker} @@ -112,7 +112,7 @@ func TestDeleteObject(fileName string) { fmt.Printf("conn build failed,err:%+v", err) return } - c := s3.NewS3Client(conn) + c := s3.NewObjectStorageServiceClient(conn) req := &s3.DeleteObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: fileName} resp, err := c.DeleteObject(context.Background(), req) if err != nil { @@ -128,7 +128,7 @@ func TestDeleteObjects(fileName1, fileName2 string) { fmt.Printf("conn build failed,err:%+v", err) return } - c := s3.NewS3Client(conn) + c := s3.NewObjectStorageServiceClient(conn) req2 := &s3.DeleteObjectsInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Delete: &s3.Delete{}} object1 := &s3.ObjectIdentifier{Key: fileName1} object2 := &s3.ObjectIdentifier{Key: fileName2} @@ -148,7 +148,7 @@ func TestTagging() { fmt.Printf("conn build failed,err:%+v", err) return } - c := s3.NewS3Client(conn) + c := s3.NewObjectStorageServiceClient(conn) req := &s3.PutBucketTaggingInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "王文学.jpg", Tags: map[string]string{"Abc": "123", "Def": "456"}} _, err = c.PutObjectTagging(context.Background(), req) if err != nil { @@ -188,7 +188,7 @@ func TestAcl() { fmt.Printf("conn build failed,err:%+v", err) return } - c := s3.NewS3Client(conn) + c := s3.NewObjectStorageServiceClient(conn) req := &s3.GetObjectAclInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "王文学.jpg"} resp, err := c.GetObjectAcl(context.Background(), req) if err != nil { @@ -213,7 +213,7 @@ func TestCopyObject() { fmt.Printf("conn build failed,err:%+v", err) return } - c := s3.NewS3Client(conn) + c := s3.NewObjectStorageServiceClient(conn) req := &s3.CopyObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "王文学.jpg.copy", CopySource: &s3.CopySource{CopySourceKey: "王文学.jpg"}} resp, err := c.CopyObject(context.Background(), req) if err != nil { @@ -230,7 +230,7 @@ func TestPart() { fmt.Printf("conn build failed,err:%+v", err) return } - c := s3.NewS3Client(conn) + c := s3.NewObjectStorageServiceClient(conn) req := &s3.CreateMultipartUploadInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "multicopy.jpg"} resp, err := c.CreateMultipartUpload(context.Background(), req) if err != nil { @@ -338,7 +338,7 @@ func TestListVersion() { fmt.Printf("conn build failed,err:%+v", err) return } - c := s3.NewS3Client(conn) + c := s3.NewObjectStorageServiceClient(conn) req := &s3.ListObjectVersionsInput{StoreName: storeName, Bucket: "antsys-wenxuwan"} resp, err := c.ListObjectVersions(context.Background(), req) if err != nil { @@ -355,7 +355,7 @@ func TestRestore() { fmt.Printf("conn build failed,err:%+v", err) return } - c := s3.NewS3Client(conn) + c := s3.NewObjectStorageServiceClient(conn) req := &s3.RestoreObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "client"} resp, err := c.RestoreObject(context.Background(), req) if err != nil { @@ -372,7 +372,7 @@ func TestObjectExist() { fmt.Printf("conn build failed,err:%+v", err) return } - c := s3.NewS3Client(conn) + c := s3.NewObjectStorageServiceClient(conn) req := &s3.IsObjectExistInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "client"} resp, err := c.IsObjectExist(context.Background(), req) if err != nil { @@ -389,7 +389,7 @@ func main() { fmt.Printf("conn build failed,err:%+v", err) return } - c := s3.NewS3Client(conn) + c := s3.NewObjectStorageServiceClient(conn) req := &s3.InitInput{StoreName: storeName} _, err = c.InitClient(context.Background(), req) if err != nil { From 94c801c503898bb073f7eae11154c89e95ddf2e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 15 Jun 2022 18:09:51 +0800 Subject: [PATCH 030/126] fix mongo sequencer ut --- components/file/aliyun/oss_test.go | 1 + components/file/aws/oss_test.go | 1 + components/pkg/mock/mongo_sequencer_mock.go | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 components/file/aliyun/oss_test.go create mode 100644 components/file/aws/oss_test.go diff --git a/components/file/aliyun/oss_test.go b/components/file/aliyun/oss_test.go new file mode 100644 index 0000000000..62a2332897 --- /dev/null +++ b/components/file/aliyun/oss_test.go @@ -0,0 +1 @@ +package aliyun diff --git a/components/file/aws/oss_test.go b/components/file/aws/oss_test.go new file mode 100644 index 0000000000..a1f9c0e3be --- /dev/null +++ b/components/file/aws/oss_test.go @@ -0,0 +1 @@ +package aws diff --git a/components/pkg/mock/mongo_sequencer_mock.go b/components/pkg/mock/mongo_sequencer_mock.go index be316935b2..cf8aeecea6 100644 --- a/components/pkg/mock/mongo_sequencer_mock.go +++ b/components/pkg/mock/mongo_sequencer_mock.go @@ -184,7 +184,7 @@ func (d *MockMongoSequencerSingleResult) Decode(v interface{}) error { ref := reflect.ValueOf(v) if ref.Kind() == reflect.Ptr { elem := ref.Elem() - Id := elem.FieldByName("ID") + Id := elem.FieldByName("Id") *(*string)(unsafe.Pointer(Id.Addr().Pointer())) = id v := elem.FieldByName("Sequencer_value") From e7e11d3ab6ec67459a842f3270f17e31e7faf235 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 15 Jun 2022 18:11:03 +0800 Subject: [PATCH 031/126] add file licensed --- components/file/aliyun/oss_test.go | 16 ++++++++++++++++ components/file/aws/oss_test.go | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/components/file/aliyun/oss_test.go b/components/file/aliyun/oss_test.go index 62a2332897..bc0559e84a 100644 --- a/components/file/aliyun/oss_test.go +++ b/components/file/aliyun/oss_test.go @@ -1 +1,17 @@ +/* +* 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 aliyun diff --git a/components/file/aws/oss_test.go b/components/file/aws/oss_test.go index a1f9c0e3be..49c1838f5e 100644 --- a/components/file/aws/oss_test.go +++ b/components/file/aws/oss_test.go @@ -1 +1,17 @@ +/* +* 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 aws From 93bf63c96773c84db7dc69c51178476674b0c3a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Thu, 16 Jun 2022 17:27:30 +0800 Subject: [PATCH 032/126] add Notes for pb file and fix wrong message --- components/file/aliyun/oss.go | 2 +- components/file/aws/oss.go | 4 +- components/file/s3def.go | 6 +- pkg/grpc/extension/s3/s3.go | 8 +- spec/proto/extension/v1/oss.pb.go | 4512 +++++++++++------------- spec/proto/extension/v1/oss.proto | 527 ++- spec/proto/extension/v1/oss_grpc.pb.go | 1166 ++++++ 7 files changed, 3596 insertions(+), 2629 deletions(-) create mode 100644 spec/proto/extension/v1/oss_grpc.pb.go diff --git a/components/file/aliyun/oss.go b/components/file/aliyun/oss.go index 82a4e1a0cf..b509417d48 100644 --- a/components/file/aliyun/oss.go +++ b/components/file/aliyun/oss.go @@ -179,7 +179,7 @@ func (a *AliyunOSS) DeleteObjects(ctx context.Context, req *file.DeleteObjectsIn return out, err } -func (a *AliyunOSS) PutObjectTagging(ctx context.Context, req *file.PutBucketTaggingInput) (*file.PutBucketTaggingOutput, error) { +func (a *AliyunOSS) PutObjectTagging(ctx context.Context, req *file.PutObjectTaggingInput) (*file.PutObjectTaggingOutput, error) { cli, err := a.selectClient(map[string]string{}, endpointKey) if err != nil { return nil, err diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index 27f71f39de..812702424a 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -146,7 +146,7 @@ func (a *AwsOss) DeleteObject(ctx context.Context, req *file.DeleteObjectInput) return &file.DeleteObjectOutput{DeleteMarker: resp.DeleteMarker, RequestCharged: string(resp.RequestCharged), VersionId: *resp.VersionId}, err } -func (a *AwsOss) PutObjectTagging(ctx context.Context, req *file.PutBucketTaggingInput) (*file.PutBucketTaggingOutput, error) { +func (a *AwsOss) PutObjectTagging(ctx context.Context, req *file.PutObjectTaggingInput) (*file.PutObjectTaggingOutput, error) { client, err := a.selectClient(map[string]string{}, endpointKey) if err != nil { return nil, err @@ -163,7 +163,7 @@ func (a *AwsOss) PutObjectTagging(ctx context.Context, req *file.PutBucketTaggin input.Tagging.TagSet = append(input.Tagging.TagSet, types.Tag{Key: &k, Value: &v}) } _, err = client.PutObjectTagging(ctx, input) - return &file.PutBucketTaggingOutput{}, err + return &file.PutObjectTaggingOutput{}, err } func (a *AwsOss) DeleteObjectTagging(ctx context.Context, req *file.DeleteObjectTaggingInput) (*file.DeleteObjectTaggingOutput, error) { client, err := a.selectClient(map[string]string{}, endpointKey) diff --git a/components/file/s3def.go b/components/file/s3def.go index 34e4897c8f..240f3d05d7 100644 --- a/components/file/s3def.go +++ b/components/file/s3def.go @@ -32,7 +32,7 @@ type Oss interface { GetObject(context.Context, *GetObjectInput) (*GetObjectOutput, error) PutObject(context.Context, *PutObjectInput) (*PutObjectOutput, error) DeleteObject(context.Context, *DeleteObjectInput) (*DeleteObjectOutput, error) - PutObjectTagging(context.Context, *PutBucketTaggingInput) (*PutBucketTaggingOutput, error) + PutObjectTagging(context.Context, *PutObjectTaggingInput) (*PutObjectTaggingOutput, error) DeleteObjectTagging(context.Context, *DeleteObjectTaggingInput) (*DeleteObjectTaggingOutput, error) GetObjectTagging(context.Context, *GetObjectTaggingInput) (*GetObjectTaggingOutput, error) CopyObject(context.Context, *CopyObjectInput) (*CopyObjectOutput, error) @@ -143,13 +143,13 @@ type DeleteObjectOutput struct { VersionId string `protobuf:"bytes,3,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } -type PutBucketTaggingInput struct { +type PutObjectTaggingInput struct { Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` Tags map[string]string `protobuf:"bytes,4,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` VersionId string `protobuf:"bytes,5,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } -type PutBucketTaggingOutput struct { +type PutObjectTaggingOutput struct { } type DeleteObjectTaggingInput struct { diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go index 60bb0c9409..c83f2a1cc1 100644 --- a/pkg/grpc/extension/s3/s3.go +++ b/pkg/grpc/extension/s3/s3.go @@ -225,21 +225,21 @@ func (s *S3Server) DeleteObject(ctx context.Context, req *s3.DeleteObjectInput) } return output, nil } -func (s *S3Server) PutObjectTagging(ctx context.Context, req *s3.PutBucketTaggingInput) (*s3.PutBucketTaggingOutput, error) { +func (s *S3Server) PutObjectTagging(ctx context.Context, req *s3.PutObjectTaggingInput) (*s3.PutObjectTaggingOutput, error) { if s.ossInstance[req.StoreName] == nil { return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } - st := &l8s3.PutBucketTaggingInput{} + st := &l8s3.PutObjectTaggingInput{} err := transferData(req, st) if err != nil { return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for PutObjectTagging,err: %+v", err) } - var resp *l8s3.PutBucketTaggingOutput + var resp *l8s3.PutObjectTaggingOutput if resp, err = s.ossInstance[req.StoreName].PutObjectTagging(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) } - output := &s3.PutBucketTaggingOutput{} + output := &s3.PutObjectTaggingOutput{} err = transferData(resp, output) if err != nil { return nil, status.Errorf(codes.Internal, "transfer response data fail for PutObjectTagging,err: %+v", err) diff --git a/spec/proto/extension/v1/oss.pb.go b/spec/proto/extension/v1/oss.pb.go index 5fbfec14fc..04d828fc58 100644 --- a/spec/proto/extension/v1/oss.pb.go +++ b/spec/proto/extension/v1/oss.pb.go @@ -1,3 +1,7 @@ +//The file defined base on s3 protocol, to get an in-depth walkthrough of this file, see: +//https://docs.aws.amazon.com/s3/index.html +//https://github.com/aws/aws-sdk-go-v2 + // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.23.0 @@ -7,17 +11,12 @@ package s3 import ( - context "context" - reflect "reflect" - sync "sync" - proto "github.com/golang/protobuf/proto" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" + reflect "reflect" + sync "sync" ) const ( @@ -91,30 +90,67 @@ type GetObjectInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,3,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - IfMatch string `protobuf:"bytes,4,opt,name=if_match,json=ifMatch,proto3" json:"if_match,omitempty"` - IfModifiedSince int64 `protobuf:"varint,5,opt,name=if_modified_since,json=ifModifiedSince,proto3" json:"if_modified_since,omitempty"` - IfNoneMatch string `protobuf:"bytes,6,opt,name=if_none_match,json=ifNoneMatch,proto3" json:"if_none_match,omitempty"` - IfUnmodifiedSince int64 `protobuf:"varint,7,opt,name=if_unmodified_since,json=ifUnmodifiedSince,proto3" json:"if_unmodified_since,omitempty"` - Key string `protobuf:"bytes,8,opt,name=key,proto3" json:"key,omitempty"` - PartNumber int64 `protobuf:"varint,9,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` - Start int64 `protobuf:"varint,10,opt,name=start,proto3" json:"start,omitempty"` - End int64 `protobuf:"varint,11,opt,name=end,proto3" json:"end,omitempty"` - RequestPayer string `protobuf:"bytes,12,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - ResponseCacheControl string `protobuf:"bytes,13,opt,name=response_cache_control,json=responseCacheControl,proto3" json:"response_cache_control,omitempty"` + 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"` + // Key of the object to get + // 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"` + // Return the object only if its entity tag (ETag) is the same as the one specified + IfMatch string `protobuf:"bytes,5,opt,name=if_match,json=ifMatch,proto3" json:"if_match,omitempty"` + // Return the object only if it has been modified since the specified time + IfModifiedSince int64 `protobuf:"varint,6,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,7,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,8,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' GET request for the part specified. + // Useful for downloading just a part of an object. + PartNumber int64 `protobuf:"varint,9,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + // Downloads the specified range bytes of an object + // start is used to specify the location where the file starts + Start int64 `protobuf:"varint,10,opt,name=start,proto3" json:"start,omitempty"` + // end is used to specify the location where the file end + End int64 `protobuf:"varint,11,opt,name=end,proto3" json:"end,omitempty"` + // Confirms that the requester knows that they will be charged for the request. + // Bucket owners need not specify this parameter in their requests. For information + // about downloading objects from Requester Pays buckets, see Downloading Objects + // in Requester Pays Buckets + // (https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html) + RequestPayer string `protobuf:"bytes,12,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + // Sets the Cache-Control header of the response. + ResponseCacheControl string `protobuf:"bytes,13,opt,name=response_cache_control,json=responseCacheControl,proto3" json:"response_cache_control,omitempty"` + // Sets the Content-Disposition header of the response ResponseContentDisposition string `protobuf:"bytes,14,opt,name=response_content_disposition,json=responseContentDisposition,proto3" json:"response_content_disposition,omitempty"` - ResponseContentEncoding string `protobuf:"bytes,15,opt,name=response_content_encoding,json=responseContentEncoding,proto3" json:"response_content_encoding,omitempty"` - ResponseContentLanguage string `protobuf:"bytes,16,opt,name=response_content_language,json=responseContentLanguage,proto3" json:"response_content_language,omitempty"` - ResponseContentType string `protobuf:"bytes,17,opt,name=response_content_type,json=responseContentType,proto3" json:"response_content_type,omitempty"` - ResponseExpires string `protobuf:"bytes,18,opt,name=response_expires,json=responseExpires,proto3" json:"response_expires,omitempty"` - SseCustomerAlgorithm string `protobuf:"bytes,19,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - SseCustomerKey string `protobuf:"bytes,20,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` - SseCustomerKeyMd5 string `protobuf:"bytes,21,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - VersionId string `protobuf:"bytes,22,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` - AcceptEncoding string `protobuf:"bytes,23,opt,name=accept_encoding,json=acceptEncoding,proto3" json:"accept_encoding,omitempty"` - SignedUrl string `protobuf:"bytes,24,opt,name=signed_url,json=signedUrl,proto3" json:"signed_url,omitempty"` + // Sets the Content-Encoding header of the response + ResponseContentEncoding string `protobuf:"bytes,15,opt,name=response_content_encoding,json=responseContentEncoding,proto3" json:"response_content_encoding,omitempty"` + // Sets the Content-Language header of the response + ResponseContentLanguage string `protobuf:"bytes,16,opt,name=response_content_language,json=responseContentLanguage,proto3" json:"response_content_language,omitempty"` + // Sets the Content-Type header of the response + ResponseContentType string `protobuf:"bytes,17,opt,name=response_content_type,json=responseContentType,proto3" json:"response_content_type,omitempty"` + // Sets the Expires header of the response + ResponseExpires string `protobuf:"bytes,18,opt,name=response_expires,json=responseExpires,proto3" json:"response_expires,omitempty"` + // Specifies the algorithm to use to when decrypting the object (for example,AES256) + SseCustomerAlgorithm string `protobuf:"bytes,19,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + // Specifies the customer-provided encryption key for Amazon S3 used to encrypt the + // data. This value is used to decrypt the object when recovering it and must match + // the one used when storing the data. The key must be appropriate for use with the + // algorithm specified in the x-amz-server-side-encryption-customer-algorithm header + SseCustomerKey string `protobuf:"bytes,20,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 + // Amazon S3 uses this header for a message integrity check to ensure that the + // encryption key was transmitted without error. + SseCustomerKeyMd5 string `protobuf:"bytes,21,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,22,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + // Specify Accept-Encoding, aws not supported now + AcceptEncoding string `protobuf:"bytes,23,opt,name=accept_encoding,json=acceptEncoding,proto3" json:"accept_encoding,omitempty"` + // Specify the signed url of object, user can get object with signed url without ak、sk + SignedUrl string `protobuf:"bytes,24,opt,name=signed_url,json=signedUrl,proto3" json:"signed_url,omitempty"` } func (x *GetObjectInput) Reset() { @@ -163,6 +199,13 @@ func (x *GetObjectInput) GetBucket() string { return "" } +func (x *GetObjectInput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + func (x *GetObjectInput) GetExpectedBucketOwner() string { if x != nil { return x.ExpectedBucketOwner @@ -198,13 +241,6 @@ func (x *GetObjectInput) GetIfUnmodifiedSince() int64 { return 0 } -func (x *GetObjectInput) GetKey() string { - if x != nil { - return x.Key - } - return "" -} - func (x *GetObjectInput) GetPartNumber() int64 { if x != nil { return x.PartNumber @@ -322,24 +358,52 @@ type GetObjectOutput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Body []byte `protobuf:"bytes,1,opt,name=body,proto3" json:"body,omitempty"` - CacheControl string `protobuf:"bytes,2,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` - ContentDisposition string `protobuf:"bytes,3,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` - ContentEncoding string `protobuf:"bytes,4,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` - ContentLanguage string `protobuf:"bytes,5,opt,name=content_language,json=contentLanguage,proto3" json:"content_language,omitempty"` - ContentLength int64 `protobuf:"varint,6,opt,name=content_length,json=contentLength,proto3" json:"content_length,omitempty"` - ContentRange string `protobuf:"bytes,7,opt,name=content_range,json=contentRange,proto3" json:"content_range,omitempty"` - ContentType string `protobuf:"bytes,8,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` - DeleteMarker bool `protobuf:"varint,9,opt,name=delete_marker,json=deleteMarker,proto3" json:"delete_marker,omitempty"` - Etag string `protobuf:"bytes,10,opt,name=etag,proto3" json:"etag,omitempty"` - Expiration string `protobuf:"bytes,11,opt,name=expiration,proto3" json:"expiration,omitempty"` - Expires string `protobuf:"bytes,12,opt,name=expires,proto3" json:"expires,omitempty"` - LastModified int64 `protobuf:"varint,13,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` - VersionId string `protobuf:"bytes,14,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` - TagCount int64 `protobuf:"varint,15,opt,name=tag_count,json=tagCount,proto3" json:"tag_count,omitempty"` - StorageClass string `protobuf:"bytes,16,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` - PartsCount int64 `protobuf:"varint,17,opt,name=parts_count,json=partsCount,proto3" json:"parts_count,omitempty"` - Metadata map[string]string `protobuf:"bytes,18,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Object data. + Body []byte `protobuf:"bytes,1,opt,name=body,proto3" json:"body,omitempty"` + // Specifies caching behavior along the request/reply chain. + CacheControl string `protobuf:"bytes,2,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` + // Specifies presentational information for the object. + ContentDisposition string `protobuf:"bytes,3,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,4,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` + // The language the content is in. + ContentLanguage string `protobuf:"bytes,5,opt,name=content_language,json=contentLanguage,proto3" json:"content_language,omitempty"` + // Size of the body in bytes. + ContentLength int64 `protobuf:"varint,6,opt,name=content_length,json=contentLength,proto3" json:"content_length,omitempty"` + // The portion of the object returned in the response. + ContentRange string `protobuf:"bytes,7,opt,name=content_range,json=contentRange,proto3" json:"content_range,omitempty"` + // A standard MIME type describing the format of the object data. + ContentType string `protobuf:"bytes,8,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` + // Specifies whether the object retrieved was (true) or was not (false) a Delete + // Marker. If false, this response header does not appear in the response. + DeleteMarker bool `protobuf:"varint,9,opt,name=delete_marker,json=deleteMarker,proto3" json:"delete_marker,omitempty"` + // An entity tag (ETag) is an opaque identifier assigned by a web server to a + // specific version of a resource found at a URL. + Etag string `protobuf:"bytes,10,opt,name=etag,proto3" json:"etag,omitempty"` + // If the object expiration is configured (see PUT Bucket lifecycle), the response + // includes this header. It includes the expiry-date and rule-id key-value pairs + // providing object expiration information. The value of the rule-id is + // URL-encoded. + Expiration string `protobuf:"bytes,11,opt,name=expiration,proto3" json:"expiration,omitempty"` + // The date and time at which the object is no longer cacheable. + Expires string `protobuf:"bytes,12,opt,name=expires,proto3" json:"expires,omitempty"` + // Creation date of the object. + LastModified int64 `protobuf:"varint,13,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` + // Version of the object. + VersionId string `protobuf:"bytes,14,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + // The number of tags, if any, on the object. + TagCount int64 `protobuf:"varint,15,opt,name=tag_count,json=tagCount,proto3" json:"tag_count,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,16,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` + // The count of parts this object has. This value is only returned if you specify + // partNumber in your request and the object was uploaded as a multipart upload. + PartsCount int64 `protobuf:"varint,17,opt,name=parts_count,json=partsCount,proto3" json:"parts_count,omitempty"` + // A map of metadata to store with the object in S3. + // Map keys will be normalized to lower-case. + Metadata map[string]string `protobuf:"bytes,18,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *GetObjectOutput) Reset() { @@ -505,19 +569,46 @@ type PutObjectInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Acl string `protobuf:"bytes,2,opt,name=acl,proto3" json:"acl,omitempty"` - Body []byte `protobuf:"bytes,3,opt,name=body,proto3" json:"body,omitempty"` - Bucket string `protobuf:"bytes,4,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,5,opt,name=key,proto3" json:"key,omitempty"` - BucketKeyEnabled bool `protobuf:"varint,6,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - CacheControl string `protobuf:"bytes,7,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` - ContentDisposition string `protobuf:"bytes,8,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` - ContentEncoding string `protobuf:"bytes,9,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` - Expires int64 `protobuf:"varint,10,opt,name=expires,proto3" json:"expires,omitempty"` - ServerSideEncryption string `protobuf:"bytes,11,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` - SignedUrl string `protobuf:"bytes,12,opt,name=signed_url,json=signedUrl,proto3" json:"signed_url,omitempty"` - 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"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // Object data. + Body []byte `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"` + // The bucket name to which the PUT action was initiated + // This member is required. + Bucket string `protobuf:"bytes,3,opt,name=bucket,proto3" json:"bucket,omitempty"` + // Object key for which the PUT action was initiated. + // This member is required. + Key string `protobuf:"bytes,4,opt,name=key,proto3" json:"key,omitempty"` + // The canned ACL to apply to the object,different oss provider have different acl type + Acl string `protobuf:"bytes,5,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,6,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + // Can be used to specify caching behavior along the request/reply chain. + CacheControl string `protobuf:"bytes,7,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` + // Specifies presentational information for the object. For more information, see + // http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.5.1 + // (http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.5.1). + ContentDisposition string `protobuf:"bytes,8,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. For more information, see + // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11 + // (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11). + ContentEncoding string `protobuf:"bytes,9,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` + // The date and time at which the object is no longer cacheable. For more + // information, see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 + // (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21). + Expires int64 `protobuf:"varint,10,opt,name=expires,proto3" json:"expires,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"` + // Specify the signed url of object, user can put object with signed url without ak、sk + SignedUrl string `protobuf:"bytes,12,opt,name=signed_url,json=signedUrl,proto3" json:"signed_url,omitempty"` + // A map of metadata to store with the object in S3. + 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"` } func (x *PutObjectInput) Reset() { @@ -559,13 +650,6 @@ func (x *PutObjectInput) GetStoreName() string { return "" } -func (x *PutObjectInput) GetAcl() string { - if x != nil { - return x.Acl - } - return "" -} - func (x *PutObjectInput) GetBody() []byte { if x != nil { return x.Body @@ -587,6 +671,13 @@ func (x *PutObjectInput) GetKey() string { return "" } +func (x *PutObjectInput) GetAcl() string { + if x != nil { + return x.Acl + } + return "" +} + func (x *PutObjectInput) GetBucketKeyEnabled() bool { if x != nil { return x.BucketKeyEnabled @@ -648,8 +739,17 @@ type PutObjectOutput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - BucketKeyEnabled bool `protobuf:"varint,1,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - Etag string `protobuf:"bytes,2,opt,name=etag,proto3" json:"etag,omitempty"` + // Indicates whether the uploaded object 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 the expiration is configured for the object + Expiration string `protobuf:"bytes,3,opt,name=expiration,proto3" json:"expiration,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"` + // Version of the object. + VersionId string `protobuf:"bytes,5,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } func (x *PutObjectOutput) Reset() { @@ -698,16 +798,48 @@ func (x *PutObjectOutput) GetEtag() string { return "" } +func (x *PutObjectOutput) GetExpiration() string { + if x != nil { + return x.Expiration + } + return "" +} + +func (x *PutObjectOutput) GetRequestCharged() string { + if x != nil { + return x.RequestCharged + } + return "" +} + +func (x *PutObjectOutput) GetVersionId() string { + if x != nil { + return x.VersionId + } + return "" +} + type DeleteObjectInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // The bucket name to which the DEL action was initiated + // This member is required. + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + // Object key for which the DEL action was initiated. + // This member is required. + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + // Confirms that the requester knows that they will be charged for the request. + // Bucket owners need not specify this parameter in their requests. For information + // about downloading objects from Requester Pays buckets, see Downloading Objects + // in Requester Pays Buckets + // (https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html) + // in the Amazon S3 User Guide. RequestPayer string `protobuf:"bytes,4,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - VersionId string `protobuf:"bytes,5,opt,name=version_id,json=versionId,proto3" json:"version_id,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 *DeleteObjectInput) Reset() { @@ -782,9 +914,15 @@ type DeleteObjectOutput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - DeleteMarker bool `protobuf:"varint,1,opt,name=delete_marker,json=deleteMarker,proto3" json:"delete_marker,omitempty"` + // Specifies whether the versioned object that was permanently deleted was (true) + // or was not (false) a delete marker. + DeleteMarker bool `protobuf:"varint,1,opt,name=delete_marker,json=deleteMarker,proto3" json:"delete_marker,omitempty"` + // If present, indicates that the requester was successfully charged for the + // request. RequestCharged string `protobuf:"bytes,2,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` - VersionId string `protobuf:"bytes,3,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + // Returns the version ID of the delete marker created as a result of the DELETE + // operation. + VersionId string `protobuf:"bytes,3,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } func (x *DeleteObjectOutput) Reset() { @@ -840,20 +978,26 @@ func (x *DeleteObjectOutput) GetVersionId() string { return "" } -type PutBucketTaggingInput struct { +type PutObjectTaggingInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - Tags map[string]string `protobuf:"bytes,4,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - VersionId string `protobuf:"bytes,5,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` -} - -func (x *PutBucketTaggingInput) Reset() { - *x = PutBucketTaggingInput{} + 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"` + // Container for the TagSet and Tag elements + Tags map[string]string `protobuf:"bytes,4,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // The versionId of the object that the tag-set will be added to. + VersionId string `protobuf:"bytes,5,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` +} + +func (x *PutObjectTaggingInput) Reset() { + *x = PutObjectTaggingInput{} if protoimpl.UnsafeEnabled { mi := &file_oss_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -861,13 +1005,13 @@ func (x *PutBucketTaggingInput) Reset() { } } -func (x *PutBucketTaggingInput) String() string { +func (x *PutObjectTaggingInput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PutBucketTaggingInput) ProtoMessage() {} +func (*PutObjectTaggingInput) ProtoMessage() {} -func (x *PutBucketTaggingInput) ProtoReflect() protoreflect.Message { +func (x *PutObjectTaggingInput) ProtoReflect() protoreflect.Message { mi := &file_oss_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -879,54 +1023,59 @@ func (x *PutBucketTaggingInput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PutBucketTaggingInput.ProtoReflect.Descriptor instead. -func (*PutBucketTaggingInput) Descriptor() ([]byte, []int) { +// Deprecated: Use PutObjectTaggingInput.ProtoReflect.Descriptor instead. +func (*PutObjectTaggingInput) Descriptor() ([]byte, []int) { return file_oss_proto_rawDescGZIP(), []int{7} } -func (x *PutBucketTaggingInput) GetStoreName() string { +func (x *PutObjectTaggingInput) GetStoreName() string { if x != nil { return x.StoreName } return "" } -func (x *PutBucketTaggingInput) GetBucket() string { +func (x *PutObjectTaggingInput) GetBucket() string { if x != nil { return x.Bucket } return "" } -func (x *PutBucketTaggingInput) GetKey() string { +func (x *PutObjectTaggingInput) GetKey() string { if x != nil { return x.Key } return "" } -func (x *PutBucketTaggingInput) GetTags() map[string]string { +func (x *PutObjectTaggingInput) GetTags() map[string]string { if x != nil { return x.Tags } return nil } -func (x *PutBucketTaggingInput) GetVersionId() string { +func (x *PutObjectTaggingInput) GetVersionId() string { if x != nil { return x.VersionId } return "" } -type PutBucketTaggingOutput struct { +type PutObjectTaggingOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + // The versionId of the object the tag-set was added to. + VersionId string `protobuf:"bytes,1,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + // Metadata pertaining to the operation's result. + ResultMetadata map[string]string `protobuf:"bytes,2,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 *PutBucketTaggingOutput) Reset() { - *x = PutBucketTaggingOutput{} +func (x *PutObjectTaggingOutput) Reset() { + *x = PutObjectTaggingOutput{} if protoimpl.UnsafeEnabled { mi := &file_oss_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -934,13 +1083,13 @@ func (x *PutBucketTaggingOutput) Reset() { } } -func (x *PutBucketTaggingOutput) String() string { +func (x *PutObjectTaggingOutput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PutBucketTaggingOutput) ProtoMessage() {} +func (*PutObjectTaggingOutput) ProtoMessage() {} -func (x *PutBucketTaggingOutput) ProtoReflect() protoreflect.Message { +func (x *PutObjectTaggingOutput) ProtoReflect() protoreflect.Message { mi := &file_oss_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -952,19 +1101,42 @@ func (x *PutBucketTaggingOutput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PutBucketTaggingOutput.ProtoReflect.Descriptor instead. -func (*PutBucketTaggingOutput) Descriptor() ([]byte, []int) { +// Deprecated: Use PutObjectTaggingOutput.ProtoReflect.Descriptor instead. +func (*PutObjectTaggingOutput) Descriptor() ([]byte, []int) { return file_oss_proto_rawDescGZIP(), []int{8} } +func (x *PutObjectTaggingOutput) GetVersionId() string { + if x != nil { + return x.VersionId + } + return "" +} + +func (x *PutObjectTaggingOutput) GetResultMetadata() map[string]string { + if x != nil { + return x.ResultMetadata + } + return nil +} + type DeleteObjectTaggingInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + // The bucket name containing the objects from which to remove the tags. + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + // The key that identifies the object in the bucket from which to remove all tags. + // This member is required. + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + // The versionId of the object that the tag-set will be removed from. + VersionId string `protobuf:"bytes,4,opt,name=version_id,json=versionId,proto3" json:"version_id,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,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` } func (x *DeleteObjectTaggingInput) Reset() { @@ -1020,12 +1192,29 @@ func (x *DeleteObjectTaggingInput) GetKey() string { return "" } +func (x *DeleteObjectTaggingInput) GetVersionId() string { + if x != nil { + return x.VersionId + } + return "" +} + +func (x *DeleteObjectTaggingInput) GetExpectedBucketOwner() string { + if x != nil { + return x.ExpectedBucketOwner + } + return "" +} + type DeleteObjectTaggingOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // The versionId of the object the tag-set was removed from. VersionId string `protobuf:"bytes,1,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + // Metadata pertaining to the operation's result. + ResultMetadata map[string]string `protobuf:"bytes,2,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 *DeleteObjectTaggingOutput) Reset() { @@ -1067,14 +1256,33 @@ func (x *DeleteObjectTaggingOutput) GetVersionId() string { return "" } +func (x *DeleteObjectTaggingOutput) GetResultMetadata() map[string]string { + if x != nil { + return x.ResultMetadata + } + return nil +} + type GetObjectTaggingInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + // The bucket name containing the object for which to get the tagging information. + // This member is required. + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + // Object key for which to get the tagging information. + // This member is required. + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + // The versionId of the object for which to get the tagging information. + VersionId string `protobuf:"bytes,4,opt,name=version_id,json=versionId,proto3" json:"version_id,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,5,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,6,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` } func (x *GetObjectTaggingInput) Reset() { @@ -1130,12 +1338,39 @@ func (x *GetObjectTaggingInput) GetKey() string { return "" } +func (x *GetObjectTaggingInput) GetVersionId() string { + if x != nil { + return x.VersionId + } + return "" +} + +func (x *GetObjectTaggingInput) GetExpectedBucketOwner() string { + if x != nil { + return x.ExpectedBucketOwner + } + return "" +} + +func (x *GetObjectTaggingInput) GetRequestPayer() string { + if x != nil { + return x.RequestPayer + } + return "" +} + type GetObjectTaggingOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // Contains the tag set. + // This member is required. Tags map[string]string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // The versionId of the object for which you got the tagging information. + VersionId string `protobuf:"bytes,2,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + // Metadata pertaining to the operation's result. + ResultMetadata map[string]string `protobuf:"bytes,3,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 *GetObjectTaggingOutput) Reset() { @@ -1177,13 +1412,30 @@ func (x *GetObjectTaggingOutput) GetTags() map[string]string { return nil } +func (x *GetObjectTaggingOutput) GetVersionId() string { + if x != nil { + return x.VersionId + } + return "" +} + +func (x *GetObjectTaggingOutput) GetResultMetadata() map[string]string { + if x != nil { + return x.ResultMetadata + } + return nil +} + type CopySource struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CopySourceBucket string `protobuf:"bytes,1,opt,name=copy_source_bucket,json=copySourceBucket,proto3" json:"copy_source_bucket,omitempty"` - CopySourceKey string `protobuf:"bytes,2,opt,name=copy_source_key,json=copySourceKey,proto3" json:"copy_source_key,omitempty"` + // source object bucket name + CopySourceBucket string `protobuf:"bytes,1,opt,name=copy_source_bucket,json=copySourceBucket,proto3" json:"copy_source_bucket,omitempty"` + // source object name + CopySourceKey string `protobuf:"bytes,2,opt,name=copy_source_key,json=copySourceKey,proto3" json:"copy_source_key,omitempty"` + // source object version CopySourceVersionId string `protobuf:"bytes,3,opt,name=copy_source_version_id,json=copySourceVersionId,proto3" json:"copy_source_version_id,omitempty"` } @@ -1245,12 +1497,20 @@ type CopyObjectInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // The name of the destination bucket. When using this action with an access point + // This member is required. + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + // The key of the destination object. + // This member is required. Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` CopySource *CopySource `protobuf:"bytes,4,opt,name=copy_source,json=copySource,proto3" json:"copy_source,omitempty"` - Tagging string `protobuf:"bytes,5,opt,name=tagging,proto3" json:"tagging,omitempty"` - Expires int64 `protobuf:"varint,6,opt,name=expires,proto3" json:"expires,omitempty"` + // The tag-set for the object destination object this value must be used in + // conjunction with the TaggingDirective. The tag-set must be encoded as URL Query + // parameters. + Tagging string `protobuf:"bytes,5,opt,name=tagging,proto3" json:"tagging,omitempty"` + // The date and time at which the object is no longer cacheable. + Expires int64 `protobuf:"varint,6,opt,name=expires,proto3" json:"expires,omitempty"` // Specifies whether the metadata is copied from the source object or replaced with metadata provided in the request. MetadataDirective string `protobuf:"bytes,7,opt,name=metadata_directive,json=metadataDirective,proto3" json:"metadata_directive,omitempty"` // A map of metadata to store with the object in S3. @@ -1350,8 +1610,11 @@ type CopyObjectResult struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` - LastModified int64 `protobuf:"varint,2,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` + // Returns the ETag of the new object. The ETag reflects only changes to the + // contents of an object, not its metadata. + Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` + // Creation date of the object. + LastModified int64 `protobuf:"varint,2,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` } func (x *CopyObjectResult) Reset() { @@ -1405,7 +1668,12 @@ type CopyObjectOutput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // Container for all response elements. CopyObjectResult *CopyObjectResult `protobuf:"bytes,1,opt,name=copy_object_result,json=copyObjectResult,proto3" json:"copy_object_result,omitempty"` + // Version ID of the newly created copy. + VersionId string `protobuf:"bytes,2,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + // If the object expiration is configured, the response includes this header. + Expiration string `protobuf:"bytes,3,opt,name=expiration,proto3" json:"expiration,omitempty"` } func (x *CopyObjectOutput) Reset() { @@ -1447,13 +1715,29 @@ func (x *CopyObjectOutput) GetCopyObjectResult() *CopyObjectResult { return nil } +func (x *CopyObjectOutput) GetVersionId() string { + if x != nil { + return x.VersionId + } + return "" +} + +func (x *CopyObjectOutput) GetExpiration() string { + if x != nil { + return x.Expiration + } + return "" +} + type Delete struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Objects []*ObjectIdentifier `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` - Quiet bool `protobuf:"varint,2,opt,name=quiet,proto3" json:"quiet,omitempty"` + // Element to enable quiet mode for the request. When you add this element, you + // must set its value to true. + Quiet bool `protobuf:"varint,2,opt,name=quiet,proto3" json:"quiet,omitempty"` } func (x *Delete) Reset() { @@ -1507,7 +1791,10 @@ type ObjectIdentifier struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // Key name of the object. + // This member is required. + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // VersionId for the specific version of the object to delete. VersionId string `protobuf:"bytes,2,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } @@ -1633,10 +1920,18 @@ type DeletedObject struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - DeleteMarker bool `protobuf:"varint,1,opt,name=delete_marker,json=deleteMarker,proto3" json:"delete_marker,omitempty"` + // Specifies whether the versioned object that was permanently deleted was (true) + // or was not (false) a delete marker. In a simple DELETE, this header indicates + // whether (true) or not (false) a delete marker was created. + DeleteMarker bool `protobuf:"varint,1,opt,name=delete_marker,json=deleteMarker,proto3" json:"delete_marker,omitempty"` + // The version ID of the delete marker created as a result of the DELETE operation. + // If you delete a specific object version, the value returned by this header is + // the version ID of the object version deleted. DeleteMarkerVersionId string `protobuf:"bytes,2,opt,name=delete_marker_version_id,json=deleteMarkerVersionId,proto3" json:"delete_marker_version_id,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - VersionId string `protobuf:"bytes,4,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + // The name of the deleted object. + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + // The version ID of the deleted object. + VersionId string `protobuf:"bytes,4,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } func (x *DeletedObject) Reset() { @@ -1751,15 +2046,34 @@ type ListObjectsInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` - EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + // A delimiter is a character you use to group keys. + 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; + // however, XML 1.0 parser cannot parse some characters, such as characters with an + // ASCII value from 0 to 10. For characters that are not supported in XML 1.0, you + // can add this parameter to request that Amazon S3 encode the keys in the + // response. + EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_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,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - Marker string `protobuf:"bytes,6,opt,name=marker,proto3" json:"marker,omitempty"` - MaxKeys int32 `protobuf:"varint,7,opt,name=maxKeys,proto3" json:"maxKeys,omitempty"` - Prefix string `protobuf:"bytes,8,opt,name=prefix,proto3" json:"prefix,omitempty"` - RequestPayer string `protobuf:"bytes,9,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + // Marker is where you want Amazon S3 to start listing from. Amazon S3 starts + // listing after this specified key. Marker can be any key in the bucket. + Marker string `protobuf:"bytes,6,opt,name=marker,proto3" json:"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. + MaxKeys int32 `protobuf:"varint,7,opt,name=maxKeys,proto3" json:"maxKeys,omitempty"` + // Limits the response to keys that begin with the specified prefix. + Prefix string `protobuf:"bytes,8,opt,name=prefix,proto3" json:"prefix,omitempty"` + // Confirms that the requester knows that she or he will be charged for the list + // objects request. Bucket owners need not specify this parameter in their + // requests. + RequestPayer string `protobuf:"bytes,9,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` } func (x *ListObjectsInput) Reset() { @@ -1864,14 +2178,30 @@ type ListObjectsOutput struct { CommonPrefixes []string `protobuf:"bytes,1,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` Contents []*Object `protobuf:"bytes,2,rep,name=contents,proto3" json:"contents,omitempty"` - Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` - EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` - IsTruncated bool `protobuf:"varint,5,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` - Marker string `protobuf:"bytes,6,opt,name=marker,proto3" json:"marker,omitempty"` - MaxKeys int32 `protobuf:"varint,7,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` - Name string `protobuf:"bytes,8,opt,name=name,proto3" json:"name,omitempty"` - NextMarker string `protobuf:"bytes,9,opt,name=next_marker,json=nextMarker,proto3" json:"next_marker,omitempty"` - Prefix string `protobuf:"bytes,10,opt,name=prefix,proto3" json:"prefix,omitempty"` + // Causes keys that contain the same string between the prefix and the first + // occurrence of the delimiter to be rolled up into a single result element in the + // CommonPrefixes collection. These rolled-up keys are not returned elsewhere in + // the response. Each rolled-up result counts as only one return against the + // MaxKeys value. + 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"` + // 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"` + // Indicates where in the bucket listing begins. Marker is included in the response + // if it was sent with the request. + Marker string `protobuf:"bytes,6,opt,name=marker,proto3" json:"marker,omitempty"` + // The maximum number of keys returned in the response body. + MaxKeys int32 `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 response is truncated (the IsTruncated element value in the response is + // true), you can use the key name in this field as marker in the subsequent + // request to get next set of objects. + NextMarker string `protobuf:"bytes,9,opt,name=next_marker,json=nextMarker,proto3" json:"next_marker,omitempty"` + // Keys that begin with the indicated prefix. + Prefix string `protobuf:"bytes,10,opt,name=prefix,proto3" json:"prefix,omitempty"` } func (x *ListObjectsOutput) Reset() { @@ -2036,11 +2366,18 @@ type Object struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - LastModified int64 `protobuf:"varint,3,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` - Owner *Owner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` - Size int64 `protobuf:"varint,5,opt,name=size,proto3" json:"size,omitempty"` + // The entity tag is a hash of the object + Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` + // The name that you assign to an object. You use the object key to retrieve the + // object. + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + // Creation date of the object. + LastModified int64 `protobuf:"varint,3,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` + // The owner of the object + Owner *Owner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` + // Size in bytes of the object + Size int64 `protobuf:"varint,5,opt,name=size,proto3" json:"size,omitempty"` + // The class of storage used to store the object. StorageClass string `protobuf:"bytes,6,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` } @@ -2125,9 +2462,11 @@ type Grantee struct { DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` EmailAddress string `protobuf:"bytes,2,opt,name=email_address,json=emailAddress,proto3" json:"email_address,omitempty"` - Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` - Type string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"` - Uri string `protobuf:"bytes,5,opt,name=uri,proto3" json:"uri,omitempty"` + // The canonical user ID of the grantee. + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` + Type string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"` + // URI of the grantee group. + Uri string `protobuf:"bytes,5,opt,name=uri,proto3" json:"uri,omitempty"` } func (x *Grantee) Reset() { @@ -2197,13 +2536,15 @@ func (x *Grantee) GetUri() string { return "" } +// Container for grant information. type Grant struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Grantee *Grantee `protobuf:"bytes,1,opt,name=grantee,proto3" json:"grantee,omitempty"` - Permission string `protobuf:"bytes,2,opt,name=permission,proto3" json:"permission,omitempty"` + Grantee *Grantee `protobuf:"bytes,1,opt,name=grantee,proto3" json:"grantee,omitempty"` + // Specifies the permission given to the grantee. + Permission string `protobuf:"bytes,2,opt,name=permission,proto3" json:"permission,omitempty"` } func (x *Grant) Reset() { @@ -2260,6 +2601,8 @@ type GetObjectAclInput struct { StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` 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,4,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } func (x *GetObjectAclInput) Reset() { @@ -2315,14 +2658,23 @@ func (x *GetObjectAclInput) GetKey() string { return "" } +func (x *GetObjectAclInput) GetVersionId() string { + if x != nil { + return x.VersionId + } + return "" +} + type GetObjectAclOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Grants []*Grant `protobuf:"bytes,1,rep,name=grants,proto3" json:"grants,omitempty"` - Owner *Owner `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,omitempty"` - RequestCharged string `protobuf:"bytes,3,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + Grants []*Grant `protobuf:"bytes,1,rep,name=grants,proto3" json:"grants,omitempty"` + Owner *Owner `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,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"` } func (x *GetObjectAclOutput) Reset() { @@ -2386,7 +2738,10 @@ type PutObjectAclInput struct { StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - Acl string `protobuf:"bytes,4,opt,name=acl,proto3" json:"acl,omitempty"` + // The canned ACL to apply to the object + Acl string `protobuf:"bytes,4,opt,name=acl,proto3" json:"acl,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 *PutObjectAclInput) Reset() { @@ -2449,6 +2804,13 @@ func (x *PutObjectAclInput) GetAcl() string { return "" } +func (x *PutObjectAclInput) GetVersionId() string { + if x != nil { + return x.VersionId + } + return "" +} + type PutObjectAclOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2504,6 +2866,8 @@ type RestoreObjectInput struct { StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` 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"` } func (x *RestoreObjectInput) Reset() { @@ -2559,12 +2923,23 @@ func (x *RestoreObjectInput) GetKey() string { return "" } +func (x *RestoreObjectInput) GetVersionId() string { + if x != nil { + return x.VersionId + } + return "" +} + type RestoreObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RequestCharged string `protobuf:"bytes,1,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,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"` + // 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"` } @@ -2619,16 +2994,21 @@ type CreateMultipartUploadInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - Acl string `protobuf:"bytes,4,opt,name=acl,proto3" json:"acl,omitempty"` - BucketKeyEnabled bool `protobuf:"varint,5,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - CacheControl string `protobuf:"bytes,6,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` - ContentDisposition string `protobuf:"bytes,7,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` - ContentEncoding string `protobuf:"bytes,8,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` - ContentLanguage string `protobuf:"bytes,9,opt,name=content_language,json=contentLanguage,proto3" json:"content_language,omitempty"` - ContentType string `protobuf:"bytes,10,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + 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"` + BucketKeyEnabled bool `protobuf:"varint,5,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + CacheControl string `protobuf:"bytes,6,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` + ContentDisposition string `protobuf:"bytes,7,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` + ContentEncoding string `protobuf:"bytes,8,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` + ContentLanguage string `protobuf:"bytes,9,opt,name=content_language,json=contentLanguage,proto3" json:"content_language,omitempty"` + 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"` Expires int64 `protobuf:"varint,12,opt,name=expires,proto3" json:"expires,omitempty"` GrantFullControl string `protobuf:"bytes,13,opt,name=grant_full_control,json=grantFullControl,proto3" json:"grant_full_control,omitempty"` @@ -2647,8 +3027,9 @@ type CreateMultipartUploadInput struct { SseKmsKeyId string `protobuf:"bytes,26,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` ServerSideEncryption string `protobuf:"bytes,27,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` StorageClass string `protobuf:"bytes,28,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` - Tagging string `protobuf:"bytes,29,opt,name=tagging,proto3" json:"tagging,omitempty"` - WebsiteRedirectLocation string `protobuf:"bytes,30,opt,name=website_redirect_location,json=websiteRedirectLocation,proto3" json:"website_redirect_location,omitempty"` + // The tag-set for the object. The tag-set must be encoded as URL Query parameters. + Tagging string `protobuf:"bytes,29,opt,name=tagging,proto3" json:"tagging,omitempty"` + WebsiteRedirectLocation string `protobuf:"bytes,30,opt,name=website_redirect_location,json=websiteRedirectLocation,proto3" json:"website_redirect_location,omitempty"` } func (x *CreateMultipartUploadInput) Reset() { @@ -2909,7 +3290,8 @@ type CreateMultipartUploadOutput struct { SseKmsEncryptionContext string `protobuf:"bytes,9,opt,name=sse_kms_encryption_context,json=sseKmsEncryptionContext,proto3" json:"sse_kms_encryption_context,omitempty"` SseKmsKeyId string `protobuf:"bytes,10,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` ServerSideEncryption string `protobuf:"bytes,11,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` - UploadId string `protobuf:"bytes,12,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,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 *CreateMultipartUploadOutput) Reset() { @@ -3033,19 +3415,27 @@ type UploadPartInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - Body []byte `protobuf:"bytes,4,opt,name=body,proto3" json:"body,omitempty"` - ContentLength int64 `protobuf:"varint,5,opt,name=content_length,json=contentLength,proto3" json:"content_length,omitempty"` - ContentMd5 string `protobuf:"bytes,6,opt,name=content_md5,json=contentMd5,proto3" json:"content_md5,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,7,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + 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"` + ContentMd5 string `protobuf:"bytes,6,opt,name=content_md5,json=contentMd5,proto3" json:"content_md5,omitempty"` + 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"` RequestPayer string `protobuf:"bytes,9,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` SseCustomerAlgorithm string `protobuf:"bytes,10,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` SseCustomerKey string `protobuf:"bytes,11,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` SseCustomerKeyMd5 string `protobuf:"bytes,12,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - UploadId string `protobuf:"bytes,13,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,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 *UploadPartInput) Reset() { @@ -3176,7 +3566,8 @@ type UploadPartOutput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - BucketKeyEnabled bool `protobuf:"varint,1,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,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"` RequestCharged string `protobuf:"bytes,3,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` SseCustomerAlgorithm string `protobuf:"bytes,4,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` @@ -3271,14 +3662,20 @@ type UploadPartCopyInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - CopySource *CopySource `protobuf:"bytes,4,opt,name=copy_source,json=copySource,proto3" json:"copy_source,omitempty"` - PartNumber int32 `protobuf:"varint,5,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` - UploadId string `protobuf:"bytes,6,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` - StartPosition int64 `protobuf:"varint,7,opt,name=start_position,json=startPosition,proto3" json:"start_position,omitempty"` - PartSize int64 `protobuf:"varint,8,opt,name=part_size,json=partSize,proto3" json:"part_size,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + 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"` + PartSize int64 `protobuf:"varint,8,opt,name=part_size,json=partSize,proto3" json:"part_size,omitempty"` } func (x *UploadPartCopyInput) Reset() { @@ -3374,6 +3771,7 @@ type CopyPartResult struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // Entity tag of the object. Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` LastModified int64 `protobuf:"varint,2,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` } @@ -3587,6 +3985,7 @@ type CompletedMultipartUpload struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // Array of CompletedPart data types. Parts []*CompletedPart `protobuf:"bytes,1,rep,name=parts,proto3" json:"parts,omitempty"` } @@ -3634,13 +4033,16 @@ type CompleteMultipartUploadInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - UploadId string `protobuf:"bytes,4,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` - RequestPayer string `protobuf:"bytes,5,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,6,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - MultipartUpload *CompletedMultipartUpload `protobuf:"bytes,7,opt,name=multipart_upload,json=multipartUpload,proto3" json:"multipart_upload,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + 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"` + RequestPayer string `protobuf:"bytes,5,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + 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 *CompleteMultipartUploadInput) Reset() { @@ -3729,16 +4131,23 @@ type CompleteMultipartUploadOutput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - BucketKeyEnabled bool `protobuf:"varint,3,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - Etag string `protobuf:"bytes,4,opt,name=etag,proto3" json:"etag,omitempty"` - Expiration string `protobuf:"bytes,5,opt,name=expiration,proto3" json:"expiration,omitempty"` - Location string `protobuf:"bytes,6,opt,name=location,proto3" json:"location,omitempty"` + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + BucketKeyEnabled bool `protobuf:"varint,3,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + 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"` SseKmsKeyId string `protobuf:"bytes,8,opt,name=sse_kms_keyId,json=sseKmsKeyId,proto3" json:"sse_kms_keyId,omitempty"` ServerSideEncryption string `protobuf:"bytes,9,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` - VersionId string `protobuf:"bytes,10,opt,name=version_id,json=versionId,proto3" json:"version_id,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 *CompleteMultipartUploadOutput) Reset() { @@ -3853,7 +4262,9 @@ type AbortMultipartUploadInput struct { Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` ExpectedBucketOwner string `protobuf:"bytes,4,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` RequestPayer string `protobuf:"bytes,5,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - UploadId string `protobuf:"bytes,6,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,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 *AbortMultipartUploadInput) Reset() { @@ -3935,6 +4346,8 @@ type AbortMultipartUploadOutput struct { 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"` } @@ -3982,15 +4395,39 @@ type ListMultipartUploadsInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + 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"` EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` ExpectedBucketOwner string `protobuf:"bytes,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` - MaxUploads int64 `protobuf:"varint,7,opt,name=max_uploads,json=maxUploads,proto3" json:"max_uploads,omitempty"` - Prefix string `protobuf:"bytes,8,opt,name=prefix,proto3" json:"prefix,omitempty"` - UploadIdMarker string `protobuf:"bytes,9,opt,name=upload_id_marker,json=uploadIdMarker,proto3" json:"upload_id_marker,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 *ListMultipartUploadsInput) Reset() { @@ -4235,18 +4672,34 @@ type ListMultipartUploadsOutput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - CommonPrefixes []string `protobuf:"bytes,2,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` - Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` - EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` - IsTruncated bool `protobuf:"varint,5,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` - KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` - MaxUploads int32 `protobuf:"varint,7,opt,name=max_uploads,json=maxUploads,proto3" json:"max_uploads,omitempty"` - NextKeyMarker string `protobuf:"bytes,8,opt,name=next_key_marker,json=nextKeyMarker,proto3" json:"next_key_marker,omitempty"` - NextUploadIdMarker string `protobuf:"bytes,9,opt,name=next_upload_id_marker,json=nextUploadIdMarker,proto3" json:"next_upload_id_marker,omitempty"` - Prefix string `protobuf:"bytes,10,opt,name=prefix,proto3" json:"prefix,omitempty"` - UploadIdMarker string `protobuf:"bytes,11,opt,name=upload_id_marker,json=uploadIdMarker,proto3" json:"upload_id_marker,omitempty"` - Uploads []*MultipartUpload `protobuf:"bytes,12,rep,name=uploads,proto3" json:"uploads,omitempty"` + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + CommonPrefixes []string `protobuf:"bytes,2,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` + Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` + 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 *ListMultipartUploadsOutput) Reset() { @@ -4370,15 +4823,32 @@ type ListObjectVersionsInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + 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"` EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` ExpectedBucketOwner string `protobuf:"bytes,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` - MaxKeys int64 `protobuf:"varint,7,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` - Prefix string `protobuf:"bytes,8,opt,name=prefix,proto3" json:"prefix,omitempty"` - VersionIdMarker string `protobuf:"bytes,9,opt,name=version_id_marker,json=versionIdMarker,proto3" json:"version_id_marker,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 *ListObjectVersionsInput) Reset() { @@ -4481,11 +4951,15 @@ type DeleteMarkerEntry struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - IsLatest bool `protobuf:"varint,1,opt,name=is_latest,json=isLatest,proto3" json:"is_latest,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,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"` + 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 `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` - VersionId string `protobuf:"bytes,5,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + // Version ID of an object. + VersionId string `protobuf:"bytes,5,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } func (x *DeleteMarkerEntry) Reset() { @@ -4560,7 +5034,9 @@ type ObjectVersion struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` + 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"` Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` LastModified int64 `protobuf:"varint,4,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` @@ -4675,7 +5151,8 @@ type ListObjectVersionsOutput struct { NextVersionIdMarker string `protobuf:"bytes,10,opt,name=next_version_id_marker,json=nextVersionIdMarker,proto3" json:"next_version_id_marker,omitempty"` Prefix string `protobuf:"bytes,11,opt,name=prefix,proto3" json:"prefix,omitempty"` VersionIdMarker string `protobuf:"bytes,12,opt,name=version_id_marker,json=versionIdMarker,proto3" json:"version_id_marker,omitempty"` - Versions []*ObjectVersion `protobuf:"bytes,13,rep,name=versions,proto3" json:"versions,omitempty"` + // Container for version information. + Versions []*ObjectVersion `protobuf:"bytes,13,rep,name=versions,proto3" json:"versions,omitempty"` } func (x *ListObjectVersionsOutput) Reset() { @@ -4806,15 +5283,19 @@ type HeadObjectInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - ChecksumMode string `protobuf:"bytes,4,opt,name=checksum_mode,json=checksumMode,proto3" json:"checksum_mode,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - IfMatch string `protobuf:"bytes,6,opt,name=if_match,json=ifMatch,proto3" json:"if_match,omitempty"` - IfModifiedSince int64 `protobuf:"varint,7,opt,name=if_modified_since,json=ifModifiedSince,proto3" json:"if_modified_since,omitempty"` - IfNoneMatch string `protobuf:"bytes,8,opt,name=if_none_match,json=ifNoneMatch,proto3" json:"if_none_match,omitempty"` - IfUnmodifiedSince int64 `protobuf:"varint,9,opt,name=if_unmodified_since,json=ifUnmodifiedSince,proto3" json:"if_unmodified_since,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + ChecksumMode string `protobuf:"bytes,4,opt,name=checksum_mode,json=checksumMode,proto3" json:"checksum_mode,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + IfMatch string `protobuf:"bytes,6,opt,name=if_match,json=ifMatch,proto3" json:"if_match,omitempty"` + IfModifiedSince int64 `protobuf:"varint,7,opt,name=if_modified_since,json=ifModifiedSince,proto3" json:"if_modified_since,omitempty"` + IfNoneMatch string `protobuf:"bytes,8,opt,name=if_none_match,json=ifNoneMatch,proto3" json:"if_none_match,omitempty"` + 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"` RequestPayer string `protobuf:"bytes,11,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` SseCustomerAlgorithm string `protobuf:"bytes,12,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` @@ -5025,6 +5506,7 @@ type IsObjectExistInput struct { StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + VersionId string `protobuf:"bytes,4,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } func (x *IsObjectExistInput) Reset() { @@ -5080,6 +5562,13 @@ func (x *IsObjectExistInput) GetKey() string { return "" } +func (x *IsObjectExistInput) GetVersionId() string { + if x != nil { + return x.VersionId + } + return "" +} + type IsObjectExistOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5132,11 +5621,13 @@ type SignURLInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - Method string `protobuf:"bytes,4,opt,name=method,proto3" json:"method,omitempty"` - ExpiredInSec int64 `protobuf:"varint,5,opt,name=expired_in_sec,json=expiredInSec,proto3" json:"expired_in_sec,omitempty"` + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + 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 *SignURLInput) Reset() { @@ -5703,13 +6194,23 @@ type ListPartsOutput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - UploadId string `protobuf:"bytes,3,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` - NextPartNumberMarker string `protobuf:"bytes,4,opt,name=next_part_number_marker,json=nextPartNumberMarker,proto3" json:"next_part_number_marker,omitempty"` - MaxParts int64 `protobuf:"varint,5,opt,name=max_parts,json=maxParts,proto3" json:"max_parts,omitempty"` - IsTruncated bool `protobuf:"varint,6,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` - Parts []*Part `protobuf:"bytes,7,rep,name=parts,proto3" json:"parts,omitempty"` + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + 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() { @@ -5816,21 +6317,21 @@ var file_oss_proto_rawDesc = []byte{ 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, 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, 0x03, 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, 0x04, 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, 0x05, 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, - 0x06, 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, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x11, 0x69, 0x66, 0x55, 0x6e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x53, 0x69, 0x6e, - 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, + 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, 0x18, 0x05, 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, 0x06, 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, 0x07, 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, 0x08, 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, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, @@ -5923,12 +6424,12 @@ var file_oss_proto_rawDesc = []byte{ 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9d, 0x04, 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, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x62, - 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, - 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x62, 0x75, 0x63, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x16, 0x0a, + 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x05, + 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, 0x06, 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, @@ -5954,1078 +6455,1147 @@ var file_oss_proto_rawDesc = []byte{ 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, 0x22, 0x53, 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, 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, 0x86, 0x02, 0x0a, 0x15, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, + 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, 0x86, 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, + 0x4c, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 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, 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, 0xe8, 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, + 0x6c, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x02, 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, 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, 0x4c, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, - 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, 0x50, - 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 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, 0x18, 0x0a, 0x16, - 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x63, 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, 0x22, 0x3a, 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, 0x22, 0x60, 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, 0x22, 0xa0, 0x01, 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, 0x4d, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 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, 0x47, 0x65, 0x74, + 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, 0xee, 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, 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, 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, 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, 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, 0x94, 0x03, 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, 0x44, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 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, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0a, 0x63, - 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x67, - 0x67, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 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, 0x52, 0x0a, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 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, 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, 0x6b, 0x0a, 0x10, 0x43, 0x6f, - 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x57, - 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, 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, 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, 0x22, 0x63, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x12, 0x43, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 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, 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, 0xa9, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, + 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, 0xf0, 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, 0x4d, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 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, 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, 0x6c, + 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x03, 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, 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, 0x94, 0x03, 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, + 0x44, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 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, 0x43, + 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x70, 0x79, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 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, 0x52, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 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, 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, 0xaa, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x57, 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, 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, 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, 0x63, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x43, 0x0a, + 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 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, 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, 0xa9, 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, 0x37, 0x0a, 0x06, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 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, 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, 0x57, 0x0a, 0x13, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x12, 0x40, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, + 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, 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, - 0x37, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1f, 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, 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, 0x57, - 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 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, 0xdf, 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, 0x3b, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 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, 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, 0xdf, 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, 0x3b, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 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, 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, + 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, 0xc2, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, + 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0x87, 0x01, 0x0a, 0x07, 0x47, 0x72, 0x61, + 0x6e, 0x74, 0x65, 0x65, 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, 0xc2, 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, 0x34, 0x0a, - 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x73, + 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, + 0x72, 0x69, 0x22, 0x63, 0x0a, 0x05, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x07, 0x67, + 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 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, 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, 0x87, 0x01, 0x0a, - 0x07, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 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, 0x23, 0x0a, 0x0d, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x22, 0x63, 0x0a, 0x05, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, - 0x3a, 0x0a, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 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, 0x47, 0x72, 0x61, 0x6e, 0x74, - 0x65, 0x65, 0x52, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5c, 0x0a, 0x11, 0x47, - 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x22, 0xab, 0x01, 0x0a, 0x12, 0x47, 0x65, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x12, 0x36, 0x0a, 0x06, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1e, 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, 0x47, 0x72, 0x61, 0x6e, 0x74, - 0x52, 0x06, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0x6e, 0x0a, 0x11, 0x50, 0x75, 0x74, 0x4f, 0x62, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x52, 0x07, + 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x7b, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x22, 0x3d, 0x0a, 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 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, 0x5d, 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, 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, 0xf1, 0x0a, 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, + 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, 0xab, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x36, 0x0a, 0x06, 0x67, + 0x72, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 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, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x06, 0x67, 0x72, 0x61, + 0x6e, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0x8d, 0x01, 0x0a, 0x11, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 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, 0x3d, 0x0a, 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 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, + 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, + 0xf1, 0x0a, 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, + 0x5e, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x11, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x41, 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, 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, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x1d, 0x20, 0x01, 0x28, + 0x09, 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, 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, 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, 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, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x70, + 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, 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, 0x5e, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 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, 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, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, - 0x67, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 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, 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, + 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, - 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, 0xa6, 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, 0x44, 0x0a, - 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 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, 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, 0xb7, 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, + 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, 0x51, 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, 0x27, 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, 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, 0x58, 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, 0x3c, 0x0a, 0x05, - 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x70, + 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, 0xa6, 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, 0x44, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 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, 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, 0xb7, 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, 0x51, 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, 0x27, 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, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, - 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x22, 0xbb, 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, 0x5c, 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, 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, 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, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 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, 0x58, 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, 0x3c, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 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, + 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, + 0x61, 0x72, 0x74, 0x73, 0x22, 0xbb, 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, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 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, 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, 0xfb, 0x01, 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, 0x40, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, - 0x69, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 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, 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, 0x34, 0x0a, 0x05, - 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0xe4, 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, 0x42, 0x0a, 0x07, 0x75, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 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, 0xbc, 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, 0x34, 0x0a, - 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0x85, 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, 0x34, 0x0a, 0x05, - 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0xaf, 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, 0x51, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, - 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 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, 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, 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, 0x42, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 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, 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, 0xbd, 0x01, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x64, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x66, 0x0a, 0x0f, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 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, 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, 0x5d, 0x0a, 0x12, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, + 0x77, 0x6e, 0x65, 0x72, 0x12, 0x5c, 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, 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, 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, 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, + 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, 0xfb, 0x01, 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, 0x40, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, 0x72, 0x18, + 0x02, 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, + 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, + 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, 0xe4, + 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, 0x42, 0x0a, 0x07, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x03, + 0x28, 0x0b, 0x32, 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, 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, 0xbc, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0x85, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, + 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, 0xaf, 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, 0x51, 0x0a, 0x0e, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, + 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, 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, 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, 0x42, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, + 0x20, 0x03, 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, 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, 0xbd, 0x01, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x66, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, + 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, 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, 0xcc, 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, 0x48, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, + 0x0f, 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, + 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, 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, 0xcc, 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, 0x48, - 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0f, 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, 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, 0x84, 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, 0x33, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 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, 0x50, - 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x32, 0xdb, 0x17, 0x0a, 0x14, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x12, 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, 0x49, 0x6e, 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, - 0x62, 0x0a, 0x09, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x28, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, + 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, 0x84, 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, 0x33, + 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 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, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, + 0x72, 0x74, 0x73, 0x32, 0xdb, 0x17, 0x0a, 0x14, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x0a, + 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 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, 0x49, 0x6e, 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, 0x62, 0x0a, 0x09, 0x50, 0x75, 0x74, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 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, - 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, - 0x00, 0x28, 0x01, 0x12, 0x62, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x12, 0x27, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x28, 0x2e, 0x73, 0x70, 0x65, 0x63, + 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x62, 0x0a, 0x09, + 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x69, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0x00, 0x12, 0x75, 0x0a, 0x10, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x1a, 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, 0x47, 0x65, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x30, 0x01, + 0x12, 0x69, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x10, 0x50, + 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 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, 0x7e, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, 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, 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, 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, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, + 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x50, 0x75, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, - 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x13, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 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, 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, 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, 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, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 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, 0x63, 0x0a, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 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, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x2b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 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, 0x63, 0x0a, 0x0a, 0x43, 0x6f, 0x70, + 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x43, 0x6f, 0x70, 0x79, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, + 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x0b, + 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 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, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x12, 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, 0x4c, 0x69, 0x73, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x0c, 0x47, - 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x12, 0x2a, 0x2e, 0x73, 0x70, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x41, 0x63, 0x6c, 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, 0x47, + 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, + 0x69, 0x0a, 0x0c, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, - 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, + 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x84, 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, 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, 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, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x0c, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 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, 0x50, 0x75, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, - 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, - 0x84, 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, 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, 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, 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, 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, 0x65, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x61, 0x72, 0x74, 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, 0x55, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x61, 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, - 0x0e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, + 0x31, 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, + 0x65, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, - 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x8a, - 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, 0x35, 0x2e, 0x73, 0x70, 0x65, + 0x72, 0x74, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x0e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, + 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x8a, 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, 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, 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, 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, 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, 0x81, 0x01, 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 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, 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, 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, 0x81, 0x01, 0x0a, 0x14, - 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 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, 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, 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, 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, - 0x81, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, - 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 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, 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, 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, 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, 0x7b, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 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, 0x63, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x49, 0x73, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x07, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x12, 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, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x1a, 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, 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, 0x81, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, + 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x73, 0x12, 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, 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, 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, - 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, - 0x74, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x4c, 0x6f, 0x61, - 0x64, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 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, 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, 0x72, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, - 0x70, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, - 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x36, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 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, 0x7b, 0x0a, 0x12, + 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 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, 0x4c, 0x69, 0x73, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 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, 0x63, 0x0a, 0x0a, 0x48, 0x65, 0x61, + 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 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, 0x6b, 0x0a, 0x0c, 0x41, 0x70, 0x70, - 0x65, 0x6e, 0x64, 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, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 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, - 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x60, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, - 0x72, 0x74, 0x73, 0x12, 0x27, 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, 0x4c, 0x69, - 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x28, 0x2e, 0x73, + 0x31, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x48, 0x65, 0x61, 0x64, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, + 0x0a, 0x0d, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, + 0x78, 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x07, + 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x12, 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, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 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, 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, 0x72, + 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x70, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, + 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 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, 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, 0x6b, 0x0a, 0x0c, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 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, 0x41, 0x70, 0x70, + 0x65, 0x6e, 0x64, 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, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, + 0x60, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x12, 0x27, 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, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, + 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, + 0x00, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -7040,7 +7610,7 @@ func file_oss_proto_rawDescGZIP() []byte { return file_oss_proto_rawDescData } -var file_oss_proto_msgTypes = make([]protoimpl.MessageInfo, 76) +var file_oss_proto_msgTypes = make([]protoimpl.MessageInfo, 79) var file_oss_proto_goTypes = []interface{}{ (*InitInput)(nil), // 0: spec.proto.extension.v1.InitInput (*GetObjectInput)(nil), // 1: spec.proto.extension.v1.GetObjectInput @@ -7049,8 +7619,8 @@ var file_oss_proto_goTypes = []interface{}{ (*PutObjectOutput)(nil), // 4: spec.proto.extension.v1.PutObjectOutput (*DeleteObjectInput)(nil), // 5: spec.proto.extension.v1.DeleteObjectInput (*DeleteObjectOutput)(nil), // 6: spec.proto.extension.v1.DeleteObjectOutput - (*PutBucketTaggingInput)(nil), // 7: spec.proto.extension.v1.PutBucketTaggingInput - (*PutBucketTaggingOutput)(nil), // 8: spec.proto.extension.v1.PutBucketTaggingOutput + (*PutObjectTaggingInput)(nil), // 7: spec.proto.extension.v1.PutObjectTaggingInput + (*PutObjectTaggingOutput)(nil), // 8: spec.proto.extension.v1.PutObjectTaggingOutput (*DeleteObjectTaggingInput)(nil), // 9: spec.proto.extension.v1.DeleteObjectTaggingInput (*DeleteObjectTaggingOutput)(nil), // 10: spec.proto.extension.v1.DeleteObjectTaggingOutput (*GetObjectTaggingInput)(nil), // 11: spec.proto.extension.v1.GetObjectTaggingInput @@ -7112,105 +7682,111 @@ var file_oss_proto_goTypes = []interface{}{ nil, // 67: spec.proto.extension.v1.InitInput.MetadataEntry nil, // 68: spec.proto.extension.v1.GetObjectOutput.MetadataEntry nil, // 69: spec.proto.extension.v1.PutObjectInput.MetaEntry - nil, // 70: spec.proto.extension.v1.PutBucketTaggingInput.TagsEntry - nil, // 71: spec.proto.extension.v1.GetObjectTaggingOutput.TagsEntry - nil, // 72: spec.proto.extension.v1.CopyObjectInput.MetadataEntry - nil, // 73: spec.proto.extension.v1.CreateMultipartUploadInput.MetaDataEntry - nil, // 74: spec.proto.extension.v1.HeadObjectOutput.ResultMetadataEntry - nil, // 75: spec.proto.extension.v1.AppendObjectInput.TagsEntry - (*emptypb.Empty)(nil), // 76: google.protobuf.Empty + nil, // 70: spec.proto.extension.v1.PutObjectTaggingInput.TagsEntry + nil, // 71: spec.proto.extension.v1.PutObjectTaggingOutput.ResultMetadataEntry + nil, // 72: spec.proto.extension.v1.DeleteObjectTaggingOutput.ResultMetadataEntry + nil, // 73: spec.proto.extension.v1.GetObjectTaggingOutput.TagsEntry + nil, // 74: spec.proto.extension.v1.GetObjectTaggingOutput.ResultMetadataEntry + nil, // 75: spec.proto.extension.v1.CopyObjectInput.MetadataEntry + nil, // 76: spec.proto.extension.v1.CreateMultipartUploadInput.MetaDataEntry + nil, // 77: spec.proto.extension.v1.HeadObjectOutput.ResultMetadataEntry + nil, // 78: spec.proto.extension.v1.AppendObjectInput.TagsEntry + (*emptypb.Empty)(nil), // 79: google.protobuf.Empty } var file_oss_proto_depIdxs = []int32{ 67, // 0: spec.proto.extension.v1.InitInput.metadata:type_name -> spec.proto.extension.v1.InitInput.MetadataEntry 68, // 1: spec.proto.extension.v1.GetObjectOutput.metadata:type_name -> spec.proto.extension.v1.GetObjectOutput.MetadataEntry 69, // 2: spec.proto.extension.v1.PutObjectInput.meta:type_name -> spec.proto.extension.v1.PutObjectInput.MetaEntry - 70, // 3: spec.proto.extension.v1.PutBucketTaggingInput.tags:type_name -> spec.proto.extension.v1.PutBucketTaggingInput.TagsEntry - 71, // 4: spec.proto.extension.v1.GetObjectTaggingOutput.tags:type_name -> spec.proto.extension.v1.GetObjectTaggingOutput.TagsEntry - 13, // 5: spec.proto.extension.v1.CopyObjectInput.copy_source:type_name -> spec.proto.extension.v1.CopySource - 72, // 6: spec.proto.extension.v1.CopyObjectInput.metadata:type_name -> spec.proto.extension.v1.CopyObjectInput.MetadataEntry - 15, // 7: spec.proto.extension.v1.CopyObjectOutput.copy_object_result:type_name -> spec.proto.extension.v1.CopyObjectResult - 18, // 8: spec.proto.extension.v1.Delete.objects:type_name -> spec.proto.extension.v1.ObjectIdentifier - 17, // 9: spec.proto.extension.v1.DeleteObjectsInput.delete:type_name -> spec.proto.extension.v1.Delete - 20, // 10: spec.proto.extension.v1.DeleteObjectsOutput.deleted:type_name -> spec.proto.extension.v1.DeletedObject - 25, // 11: spec.proto.extension.v1.ListObjectsOutput.contents:type_name -> spec.proto.extension.v1.Object - 24, // 12: spec.proto.extension.v1.Object.owner:type_name -> spec.proto.extension.v1.Owner - 26, // 13: spec.proto.extension.v1.Grant.grantee:type_name -> spec.proto.extension.v1.Grantee - 27, // 14: spec.proto.extension.v1.GetObjectAclOutput.grants:type_name -> spec.proto.extension.v1.Grant - 24, // 15: spec.proto.extension.v1.GetObjectAclOutput.owner:type_name -> spec.proto.extension.v1.Owner - 73, // 16: spec.proto.extension.v1.CreateMultipartUploadInput.meta_data:type_name -> spec.proto.extension.v1.CreateMultipartUploadInput.MetaDataEntry - 13, // 17: spec.proto.extension.v1.UploadPartCopyInput.copy_source:type_name -> spec.proto.extension.v1.CopySource - 39, // 18: spec.proto.extension.v1.UploadPartCopyOutput.copy_part_result:type_name -> spec.proto.extension.v1.CopyPartResult - 41, // 19: spec.proto.extension.v1.CompletedMultipartUpload.parts:type_name -> spec.proto.extension.v1.CompletedPart - 42, // 20: spec.proto.extension.v1.CompleteMultipartUploadInput.multipart_upload:type_name -> spec.proto.extension.v1.CompletedMultipartUpload - 48, // 21: spec.proto.extension.v1.MultipartUpload.initiator:type_name -> spec.proto.extension.v1.Initiator - 24, // 22: spec.proto.extension.v1.MultipartUpload.owner:type_name -> spec.proto.extension.v1.Owner - 49, // 23: spec.proto.extension.v1.ListMultipartUploadsOutput.uploads:type_name -> spec.proto.extension.v1.MultipartUpload - 24, // 24: spec.proto.extension.v1.DeleteMarkerEntry.owner:type_name -> spec.proto.extension.v1.Owner - 24, // 25: spec.proto.extension.v1.ObjectVersion.owner:type_name -> spec.proto.extension.v1.Owner - 52, // 26: spec.proto.extension.v1.ListObjectVersionsOutput.delete_markers:type_name -> spec.proto.extension.v1.DeleteMarkerEntry - 53, // 27: spec.proto.extension.v1.ListObjectVersionsOutput.versions:type_name -> spec.proto.extension.v1.ObjectVersion - 74, // 28: spec.proto.extension.v1.HeadObjectOutput.result_metadata:type_name -> spec.proto.extension.v1.HeadObjectOutput.ResultMetadataEntry - 75, // 29: spec.proto.extension.v1.AppendObjectInput.tags:type_name -> spec.proto.extension.v1.AppendObjectInput.TagsEntry - 65, // 30: spec.proto.extension.v1.ListPartsOutput.parts:type_name -> spec.proto.extension.v1.Part - 0, // 31: spec.proto.extension.v1.ObjectStorageService.InitClient:input_type -> spec.proto.extension.v1.InitInput - 3, // 32: spec.proto.extension.v1.ObjectStorageService.PutObject:input_type -> spec.proto.extension.v1.PutObjectInput - 1, // 33: spec.proto.extension.v1.ObjectStorageService.GetObject:input_type -> spec.proto.extension.v1.GetObjectInput - 5, // 34: spec.proto.extension.v1.ObjectStorageService.DeleteObject:input_type -> spec.proto.extension.v1.DeleteObjectInput - 7, // 35: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:input_type -> spec.proto.extension.v1.PutBucketTaggingInput - 9, // 36: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:input_type -> spec.proto.extension.v1.DeleteObjectTaggingInput - 11, // 37: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:input_type -> spec.proto.extension.v1.GetObjectTaggingInput - 14, // 38: spec.proto.extension.v1.ObjectStorageService.CopyObject:input_type -> spec.proto.extension.v1.CopyObjectInput - 19, // 39: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:input_type -> spec.proto.extension.v1.DeleteObjectsInput - 22, // 40: spec.proto.extension.v1.ObjectStorageService.ListObjects:input_type -> spec.proto.extension.v1.ListObjectsInput - 28, // 41: spec.proto.extension.v1.ObjectStorageService.GetObjectAcl:input_type -> spec.proto.extension.v1.GetObjectAclInput - 30, // 42: spec.proto.extension.v1.ObjectStorageService.PutObjectAcl:input_type -> spec.proto.extension.v1.PutObjectAclInput - 32, // 43: spec.proto.extension.v1.ObjectStorageService.RestoreObject:input_type -> spec.proto.extension.v1.RestoreObjectInput - 34, // 44: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:input_type -> spec.proto.extension.v1.CreateMultipartUploadInput - 36, // 45: spec.proto.extension.v1.ObjectStorageService.UploadPart:input_type -> spec.proto.extension.v1.UploadPartInput - 38, // 46: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:input_type -> spec.proto.extension.v1.UploadPartCopyInput - 43, // 47: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:input_type -> spec.proto.extension.v1.CompleteMultipartUploadInput - 45, // 48: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:input_type -> spec.proto.extension.v1.AbortMultipartUploadInput - 47, // 49: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:input_type -> spec.proto.extension.v1.ListMultipartUploadsInput - 51, // 50: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:input_type -> spec.proto.extension.v1.ListObjectVersionsInput - 55, // 51: spec.proto.extension.v1.ObjectStorageService.HeadObject:input_type -> spec.proto.extension.v1.HeadObjectInput - 57, // 52: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:input_type -> spec.proto.extension.v1.IsObjectExistInput - 59, // 53: spec.proto.extension.v1.ObjectStorageService.SignURL:input_type -> spec.proto.extension.v1.SignURLInput - 61, // 54: spec.proto.extension.v1.ObjectStorageService.UpdateDownLoadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput - 61, // 55: spec.proto.extension.v1.ObjectStorageService.UpdateUpLoadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput - 62, // 56: spec.proto.extension.v1.ObjectStorageService.AppendObject:input_type -> spec.proto.extension.v1.AppendObjectInput - 64, // 57: spec.proto.extension.v1.ObjectStorageService.ListParts:input_type -> spec.proto.extension.v1.ListPartsInput - 76, // 58: spec.proto.extension.v1.ObjectStorageService.InitClient:output_type -> google.protobuf.Empty - 4, // 59: spec.proto.extension.v1.ObjectStorageService.PutObject:output_type -> spec.proto.extension.v1.PutObjectOutput - 2, // 60: spec.proto.extension.v1.ObjectStorageService.GetObject:output_type -> spec.proto.extension.v1.GetObjectOutput - 6, // 61: spec.proto.extension.v1.ObjectStorageService.DeleteObject:output_type -> spec.proto.extension.v1.DeleteObjectOutput - 8, // 62: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:output_type -> spec.proto.extension.v1.PutBucketTaggingOutput - 10, // 63: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:output_type -> spec.proto.extension.v1.DeleteObjectTaggingOutput - 12, // 64: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:output_type -> spec.proto.extension.v1.GetObjectTaggingOutput - 16, // 65: spec.proto.extension.v1.ObjectStorageService.CopyObject:output_type -> spec.proto.extension.v1.CopyObjectOutput - 21, // 66: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:output_type -> spec.proto.extension.v1.DeleteObjectsOutput - 23, // 67: spec.proto.extension.v1.ObjectStorageService.ListObjects:output_type -> spec.proto.extension.v1.ListObjectsOutput - 29, // 68: spec.proto.extension.v1.ObjectStorageService.GetObjectAcl:output_type -> spec.proto.extension.v1.GetObjectAclOutput - 31, // 69: spec.proto.extension.v1.ObjectStorageService.PutObjectAcl:output_type -> spec.proto.extension.v1.PutObjectAclOutput - 33, // 70: spec.proto.extension.v1.ObjectStorageService.RestoreObject:output_type -> spec.proto.extension.v1.RestoreObjectOutput - 35, // 71: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:output_type -> spec.proto.extension.v1.CreateMultipartUploadOutput - 37, // 72: spec.proto.extension.v1.ObjectStorageService.UploadPart:output_type -> spec.proto.extension.v1.UploadPartOutput - 40, // 73: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:output_type -> spec.proto.extension.v1.UploadPartCopyOutput - 44, // 74: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:output_type -> spec.proto.extension.v1.CompleteMultipartUploadOutput - 46, // 75: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:output_type -> spec.proto.extension.v1.AbortMultipartUploadOutput - 50, // 76: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:output_type -> spec.proto.extension.v1.ListMultipartUploadsOutput - 54, // 77: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:output_type -> spec.proto.extension.v1.ListObjectVersionsOutput - 56, // 78: spec.proto.extension.v1.ObjectStorageService.HeadObject:output_type -> spec.proto.extension.v1.HeadObjectOutput - 58, // 79: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:output_type -> spec.proto.extension.v1.IsObjectExistOutput - 60, // 80: spec.proto.extension.v1.ObjectStorageService.SignURL:output_type -> spec.proto.extension.v1.SignURLOutput - 76, // 81: spec.proto.extension.v1.ObjectStorageService.UpdateDownLoadBandwidthRateLimit:output_type -> google.protobuf.Empty - 76, // 82: spec.proto.extension.v1.ObjectStorageService.UpdateUpLoadBandwidthRateLimit:output_type -> google.protobuf.Empty - 63, // 83: spec.proto.extension.v1.ObjectStorageService.AppendObject:output_type -> spec.proto.extension.v1.AppendObjectOutput - 66, // 84: spec.proto.extension.v1.ObjectStorageService.ListParts:output_type -> spec.proto.extension.v1.ListPartsOutput - 58, // [58:85] is the sub-list for method output_type - 31, // [31:58] is the sub-list for method input_type - 31, // [31:31] is the sub-list for extension type_name - 31, // [31:31] is the sub-list for extension extendee - 0, // [0:31] is the sub-list for field type_name + 70, // 3: spec.proto.extension.v1.PutObjectTaggingInput.tags:type_name -> spec.proto.extension.v1.PutObjectTaggingInput.TagsEntry + 71, // 4: spec.proto.extension.v1.PutObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.PutObjectTaggingOutput.ResultMetadataEntry + 72, // 5: spec.proto.extension.v1.DeleteObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.DeleteObjectTaggingOutput.ResultMetadataEntry + 73, // 6: spec.proto.extension.v1.GetObjectTaggingOutput.tags:type_name -> spec.proto.extension.v1.GetObjectTaggingOutput.TagsEntry + 74, // 7: spec.proto.extension.v1.GetObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.GetObjectTaggingOutput.ResultMetadataEntry + 13, // 8: spec.proto.extension.v1.CopyObjectInput.copy_source:type_name -> spec.proto.extension.v1.CopySource + 75, // 9: spec.proto.extension.v1.CopyObjectInput.metadata:type_name -> spec.proto.extension.v1.CopyObjectInput.MetadataEntry + 15, // 10: spec.proto.extension.v1.CopyObjectOutput.copy_object_result:type_name -> spec.proto.extension.v1.CopyObjectResult + 18, // 11: spec.proto.extension.v1.Delete.objects:type_name -> spec.proto.extension.v1.ObjectIdentifier + 17, // 12: spec.proto.extension.v1.DeleteObjectsInput.delete:type_name -> spec.proto.extension.v1.Delete + 20, // 13: spec.proto.extension.v1.DeleteObjectsOutput.deleted:type_name -> spec.proto.extension.v1.DeletedObject + 25, // 14: spec.proto.extension.v1.ListObjectsOutput.contents:type_name -> spec.proto.extension.v1.Object + 24, // 15: spec.proto.extension.v1.Object.owner:type_name -> spec.proto.extension.v1.Owner + 26, // 16: spec.proto.extension.v1.Grant.grantee:type_name -> spec.proto.extension.v1.Grantee + 27, // 17: spec.proto.extension.v1.GetObjectAclOutput.grants:type_name -> spec.proto.extension.v1.Grant + 24, // 18: spec.proto.extension.v1.GetObjectAclOutput.owner:type_name -> spec.proto.extension.v1.Owner + 76, // 19: spec.proto.extension.v1.CreateMultipartUploadInput.meta_data:type_name -> spec.proto.extension.v1.CreateMultipartUploadInput.MetaDataEntry + 13, // 20: spec.proto.extension.v1.UploadPartCopyInput.copy_source:type_name -> spec.proto.extension.v1.CopySource + 39, // 21: spec.proto.extension.v1.UploadPartCopyOutput.copy_part_result:type_name -> spec.proto.extension.v1.CopyPartResult + 41, // 22: spec.proto.extension.v1.CompletedMultipartUpload.parts:type_name -> spec.proto.extension.v1.CompletedPart + 42, // 23: spec.proto.extension.v1.CompleteMultipartUploadInput.multipart_upload:type_name -> spec.proto.extension.v1.CompletedMultipartUpload + 48, // 24: spec.proto.extension.v1.MultipartUpload.initiator:type_name -> spec.proto.extension.v1.Initiator + 24, // 25: spec.proto.extension.v1.MultipartUpload.owner:type_name -> spec.proto.extension.v1.Owner + 49, // 26: spec.proto.extension.v1.ListMultipartUploadsOutput.uploads:type_name -> spec.proto.extension.v1.MultipartUpload + 24, // 27: spec.proto.extension.v1.DeleteMarkerEntry.owner:type_name -> spec.proto.extension.v1.Owner + 24, // 28: spec.proto.extension.v1.ObjectVersion.owner:type_name -> spec.proto.extension.v1.Owner + 52, // 29: spec.proto.extension.v1.ListObjectVersionsOutput.delete_markers:type_name -> spec.proto.extension.v1.DeleteMarkerEntry + 53, // 30: spec.proto.extension.v1.ListObjectVersionsOutput.versions:type_name -> spec.proto.extension.v1.ObjectVersion + 77, // 31: spec.proto.extension.v1.HeadObjectOutput.result_metadata:type_name -> spec.proto.extension.v1.HeadObjectOutput.ResultMetadataEntry + 78, // 32: spec.proto.extension.v1.AppendObjectInput.tags:type_name -> spec.proto.extension.v1.AppendObjectInput.TagsEntry + 65, // 33: spec.proto.extension.v1.ListPartsOutput.parts:type_name -> spec.proto.extension.v1.Part + 0, // 34: spec.proto.extension.v1.ObjectStorageService.InitClient:input_type -> spec.proto.extension.v1.InitInput + 3, // 35: spec.proto.extension.v1.ObjectStorageService.PutObject:input_type -> spec.proto.extension.v1.PutObjectInput + 1, // 36: spec.proto.extension.v1.ObjectStorageService.GetObject:input_type -> spec.proto.extension.v1.GetObjectInput + 5, // 37: spec.proto.extension.v1.ObjectStorageService.DeleteObject:input_type -> spec.proto.extension.v1.DeleteObjectInput + 7, // 38: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:input_type -> spec.proto.extension.v1.PutObjectTaggingInput + 9, // 39: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:input_type -> spec.proto.extension.v1.DeleteObjectTaggingInput + 11, // 40: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:input_type -> spec.proto.extension.v1.GetObjectTaggingInput + 14, // 41: spec.proto.extension.v1.ObjectStorageService.CopyObject:input_type -> spec.proto.extension.v1.CopyObjectInput + 19, // 42: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:input_type -> spec.proto.extension.v1.DeleteObjectsInput + 22, // 43: spec.proto.extension.v1.ObjectStorageService.ListObjects:input_type -> spec.proto.extension.v1.ListObjectsInput + 28, // 44: spec.proto.extension.v1.ObjectStorageService.GetObjectAcl:input_type -> spec.proto.extension.v1.GetObjectAclInput + 30, // 45: spec.proto.extension.v1.ObjectStorageService.PutObjectAcl:input_type -> spec.proto.extension.v1.PutObjectAclInput + 32, // 46: spec.proto.extension.v1.ObjectStorageService.RestoreObject:input_type -> spec.proto.extension.v1.RestoreObjectInput + 34, // 47: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:input_type -> spec.proto.extension.v1.CreateMultipartUploadInput + 36, // 48: spec.proto.extension.v1.ObjectStorageService.UploadPart:input_type -> spec.proto.extension.v1.UploadPartInput + 38, // 49: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:input_type -> spec.proto.extension.v1.UploadPartCopyInput + 43, // 50: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:input_type -> spec.proto.extension.v1.CompleteMultipartUploadInput + 45, // 51: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:input_type -> spec.proto.extension.v1.AbortMultipartUploadInput + 47, // 52: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:input_type -> spec.proto.extension.v1.ListMultipartUploadsInput + 51, // 53: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:input_type -> spec.proto.extension.v1.ListObjectVersionsInput + 55, // 54: spec.proto.extension.v1.ObjectStorageService.HeadObject:input_type -> spec.proto.extension.v1.HeadObjectInput + 57, // 55: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:input_type -> spec.proto.extension.v1.IsObjectExistInput + 59, // 56: spec.proto.extension.v1.ObjectStorageService.SignURL:input_type -> spec.proto.extension.v1.SignURLInput + 61, // 57: spec.proto.extension.v1.ObjectStorageService.UpdateDownLoadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput + 61, // 58: spec.proto.extension.v1.ObjectStorageService.UpdateUpLoadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput + 62, // 59: spec.proto.extension.v1.ObjectStorageService.AppendObject:input_type -> spec.proto.extension.v1.AppendObjectInput + 64, // 60: spec.proto.extension.v1.ObjectStorageService.ListParts:input_type -> spec.proto.extension.v1.ListPartsInput + 79, // 61: spec.proto.extension.v1.ObjectStorageService.InitClient:output_type -> google.protobuf.Empty + 4, // 62: spec.proto.extension.v1.ObjectStorageService.PutObject:output_type -> spec.proto.extension.v1.PutObjectOutput + 2, // 63: spec.proto.extension.v1.ObjectStorageService.GetObject:output_type -> spec.proto.extension.v1.GetObjectOutput + 6, // 64: spec.proto.extension.v1.ObjectStorageService.DeleteObject:output_type -> spec.proto.extension.v1.DeleteObjectOutput + 8, // 65: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:output_type -> spec.proto.extension.v1.PutObjectTaggingOutput + 10, // 66: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:output_type -> spec.proto.extension.v1.DeleteObjectTaggingOutput + 12, // 67: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:output_type -> spec.proto.extension.v1.GetObjectTaggingOutput + 16, // 68: spec.proto.extension.v1.ObjectStorageService.CopyObject:output_type -> spec.proto.extension.v1.CopyObjectOutput + 21, // 69: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:output_type -> spec.proto.extension.v1.DeleteObjectsOutput + 23, // 70: spec.proto.extension.v1.ObjectStorageService.ListObjects:output_type -> spec.proto.extension.v1.ListObjectsOutput + 29, // 71: spec.proto.extension.v1.ObjectStorageService.GetObjectAcl:output_type -> spec.proto.extension.v1.GetObjectAclOutput + 31, // 72: spec.proto.extension.v1.ObjectStorageService.PutObjectAcl:output_type -> spec.proto.extension.v1.PutObjectAclOutput + 33, // 73: spec.proto.extension.v1.ObjectStorageService.RestoreObject:output_type -> spec.proto.extension.v1.RestoreObjectOutput + 35, // 74: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:output_type -> spec.proto.extension.v1.CreateMultipartUploadOutput + 37, // 75: spec.proto.extension.v1.ObjectStorageService.UploadPart:output_type -> spec.proto.extension.v1.UploadPartOutput + 40, // 76: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:output_type -> spec.proto.extension.v1.UploadPartCopyOutput + 44, // 77: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:output_type -> spec.proto.extension.v1.CompleteMultipartUploadOutput + 46, // 78: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:output_type -> spec.proto.extension.v1.AbortMultipartUploadOutput + 50, // 79: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:output_type -> spec.proto.extension.v1.ListMultipartUploadsOutput + 54, // 80: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:output_type -> spec.proto.extension.v1.ListObjectVersionsOutput + 56, // 81: spec.proto.extension.v1.ObjectStorageService.HeadObject:output_type -> spec.proto.extension.v1.HeadObjectOutput + 58, // 82: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:output_type -> spec.proto.extension.v1.IsObjectExistOutput + 60, // 83: spec.proto.extension.v1.ObjectStorageService.SignURL:output_type -> spec.proto.extension.v1.SignURLOutput + 79, // 84: spec.proto.extension.v1.ObjectStorageService.UpdateDownLoadBandwidthRateLimit:output_type -> google.protobuf.Empty + 79, // 85: spec.proto.extension.v1.ObjectStorageService.UpdateUpLoadBandwidthRateLimit:output_type -> google.protobuf.Empty + 63, // 86: spec.proto.extension.v1.ObjectStorageService.AppendObject:output_type -> spec.proto.extension.v1.AppendObjectOutput + 66, // 87: spec.proto.extension.v1.ObjectStorageService.ListParts:output_type -> spec.proto.extension.v1.ListPartsOutput + 61, // [61:88] is the sub-list for method output_type + 34, // [34:61] 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 } func init() { file_oss_proto_init() } @@ -7304,7 +7880,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutBucketTaggingInput); i { + switch v := v.(*PutObjectTaggingInput); i { case 0: return &v.state case 1: @@ -7316,7 +7892,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutBucketTaggingOutput); i { + switch v := v.(*PutObjectTaggingOutput); i { case 0: return &v.state case 1: @@ -8030,7 +8606,7 @@ func file_oss_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_oss_proto_rawDesc, NumEnums: 0, - NumMessages: 76, + NumMessages: 79, NumExtensions: 0, NumServices: 1, }, @@ -8043,1149 +8619,3 @@ func file_oss_proto_init() { file_oss_proto_goTypes = nil file_oss_proto_depIdxs = nil } - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// ObjectStorageServiceClient is the client API for ObjectStorageService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type ObjectStorageServiceClient interface { - InitClient(ctx context.Context, in *InitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) - PutObject(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_PutObjectClient, error) - GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (ObjectStorageService_GetObjectClient, error) - DeleteObject(ctx context.Context, in *DeleteObjectInput, opts ...grpc.CallOption) (*DeleteObjectOutput, error) - PutObjectTagging(ctx context.Context, in *PutBucketTaggingInput, opts ...grpc.CallOption) (*PutBucketTaggingOutput, error) - DeleteObjectTagging(ctx context.Context, in *DeleteObjectTaggingInput, opts ...grpc.CallOption) (*DeleteObjectTaggingOutput, error) - GetObjectTagging(ctx context.Context, in *GetObjectTaggingInput, opts ...grpc.CallOption) (*GetObjectTaggingOutput, error) - CopyObject(ctx context.Context, in *CopyObjectInput, opts ...grpc.CallOption) (*CopyObjectOutput, error) - DeleteObjects(ctx context.Context, in *DeleteObjectsInput, opts ...grpc.CallOption) (*DeleteObjectsOutput, error) - ListObjects(ctx context.Context, in *ListObjectsInput, opts ...grpc.CallOption) (*ListObjectsOutput, error) - GetObjectAcl(ctx context.Context, in *GetObjectAclInput, opts ...grpc.CallOption) (*GetObjectAclOutput, error) - PutObjectAcl(ctx context.Context, in *PutObjectAclInput, opts ...grpc.CallOption) (*PutObjectAclOutput, error) - RestoreObject(ctx context.Context, in *RestoreObjectInput, opts ...grpc.CallOption) (*RestoreObjectOutput, error) - CreateMultipartUpload(ctx context.Context, in *CreateMultipartUploadInput, opts ...grpc.CallOption) (*CreateMultipartUploadOutput, error) - UploadPart(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_UploadPartClient, error) - UploadPartCopy(ctx context.Context, in *UploadPartCopyInput, opts ...grpc.CallOption) (*UploadPartCopyOutput, error) - CompleteMultipartUpload(ctx context.Context, in *CompleteMultipartUploadInput, opts ...grpc.CallOption) (*CompleteMultipartUploadOutput, error) - AbortMultipartUpload(ctx context.Context, in *AbortMultipartUploadInput, opts ...grpc.CallOption) (*AbortMultipartUploadOutput, error) - ListMultipartUploads(ctx context.Context, in *ListMultipartUploadsInput, opts ...grpc.CallOption) (*ListMultipartUploadsOutput, error) - ListObjectVersions(ctx context.Context, in *ListObjectVersionsInput, opts ...grpc.CallOption) (*ListObjectVersionsOutput, error) - HeadObject(ctx context.Context, in *HeadObjectInput, opts ...grpc.CallOption) (*HeadObjectOutput, error) - IsObjectExist(ctx context.Context, in *IsObjectExistInput, opts ...grpc.CallOption) (*IsObjectExistOutput, error) - SignURL(ctx context.Context, in *SignURLInput, opts ...grpc.CallOption) (*SignURLOutput, error) - UpdateDownLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) - UpdateUpLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) - AppendObject(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_AppendObjectClient, error) - ListParts(ctx context.Context, in *ListPartsInput, opts ...grpc.CallOption) (*ListPartsOutput, error) -} - -type objectStorageServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewObjectStorageServiceClient(cc grpc.ClientConnInterface) ObjectStorageServiceClient { - return &objectStorageServiceClient{cc} -} - -func (c *objectStorageServiceClient) InitClient(ctx context.Context, in *InitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/InitClient", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) PutObject(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_PutObjectClient, error) { - stream, err := c.cc.NewStream(ctx, &_ObjectStorageService_serviceDesc.Streams[0], "/spec.proto.extension.v1.ObjectStorageService/PutObject", opts...) - if err != nil { - return nil, err - } - x := &objectStorageServicePutObjectClient{stream} - return x, nil -} - -type ObjectStorageService_PutObjectClient interface { - Send(*PutObjectInput) error - CloseAndRecv() (*PutObjectOutput, error) - grpc.ClientStream -} - -type objectStorageServicePutObjectClient struct { - grpc.ClientStream -} - -func (x *objectStorageServicePutObjectClient) Send(m *PutObjectInput) error { - return x.ClientStream.SendMsg(m) -} - -func (x *objectStorageServicePutObjectClient) CloseAndRecv() (*PutObjectOutput, error) { - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - m := new(PutObjectOutput) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *objectStorageServiceClient) GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (ObjectStorageService_GetObjectClient, error) { - stream, err := c.cc.NewStream(ctx, &_ObjectStorageService_serviceDesc.Streams[1], "/spec.proto.extension.v1.ObjectStorageService/GetObject", opts...) - if err != nil { - return nil, err - } - x := &objectStorageServiceGetObjectClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type ObjectStorageService_GetObjectClient interface { - Recv() (*GetObjectOutput, error) - grpc.ClientStream -} - -type objectStorageServiceGetObjectClient struct { - grpc.ClientStream -} - -func (x *objectStorageServiceGetObjectClient) Recv() (*GetObjectOutput, error) { - m := new(GetObjectOutput) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *objectStorageServiceClient) DeleteObject(ctx context.Context, in *DeleteObjectInput, opts ...grpc.CallOption) (*DeleteObjectOutput, error) { - out := new(DeleteObjectOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/DeleteObject", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) PutObjectTagging(ctx context.Context, in *PutBucketTaggingInput, opts ...grpc.CallOption) (*PutBucketTaggingOutput, error) { - out := new(PutBucketTaggingOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/PutObjectTagging", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) DeleteObjectTagging(ctx context.Context, in *DeleteObjectTaggingInput, opts ...grpc.CallOption) (*DeleteObjectTaggingOutput, error) { - out := new(DeleteObjectTaggingOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/DeleteObjectTagging", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) GetObjectTagging(ctx context.Context, in *GetObjectTaggingInput, opts ...grpc.CallOption) (*GetObjectTaggingOutput, error) { - out := new(GetObjectTaggingOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/GetObjectTagging", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) CopyObject(ctx context.Context, in *CopyObjectInput, opts ...grpc.CallOption) (*CopyObjectOutput, error) { - out := new(CopyObjectOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/CopyObject", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) DeleteObjects(ctx context.Context, in *DeleteObjectsInput, opts ...grpc.CallOption) (*DeleteObjectsOutput, error) { - out := new(DeleteObjectsOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/DeleteObjects", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) ListObjects(ctx context.Context, in *ListObjectsInput, opts ...grpc.CallOption) (*ListObjectsOutput, error) { - out := new(ListObjectsOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/ListObjects", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) GetObjectAcl(ctx context.Context, in *GetObjectAclInput, opts ...grpc.CallOption) (*GetObjectAclOutput, error) { - out := new(GetObjectAclOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/GetObjectAcl", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) PutObjectAcl(ctx context.Context, in *PutObjectAclInput, opts ...grpc.CallOption) (*PutObjectAclOutput, error) { - out := new(PutObjectAclOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/PutObjectAcl", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) RestoreObject(ctx context.Context, in *RestoreObjectInput, opts ...grpc.CallOption) (*RestoreObjectOutput, error) { - out := new(RestoreObjectOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/RestoreObject", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) CreateMultipartUpload(ctx context.Context, in *CreateMultipartUploadInput, opts ...grpc.CallOption) (*CreateMultipartUploadOutput, error) { - out := new(CreateMultipartUploadOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/CreateMultipartUpload", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) UploadPart(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_UploadPartClient, error) { - stream, err := c.cc.NewStream(ctx, &_ObjectStorageService_serviceDesc.Streams[2], "/spec.proto.extension.v1.ObjectStorageService/UploadPart", opts...) - if err != nil { - return nil, err - } - x := &objectStorageServiceUploadPartClient{stream} - return x, nil -} - -type ObjectStorageService_UploadPartClient interface { - Send(*UploadPartInput) error - CloseAndRecv() (*UploadPartOutput, error) - grpc.ClientStream -} - -type objectStorageServiceUploadPartClient struct { - grpc.ClientStream -} - -func (x *objectStorageServiceUploadPartClient) Send(m *UploadPartInput) error { - return x.ClientStream.SendMsg(m) -} - -func (x *objectStorageServiceUploadPartClient) CloseAndRecv() (*UploadPartOutput, error) { - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - m := new(UploadPartOutput) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *objectStorageServiceClient) UploadPartCopy(ctx context.Context, in *UploadPartCopyInput, opts ...grpc.CallOption) (*UploadPartCopyOutput, error) { - out := new(UploadPartCopyOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/UploadPartCopy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) CompleteMultipartUpload(ctx context.Context, in *CompleteMultipartUploadInput, opts ...grpc.CallOption) (*CompleteMultipartUploadOutput, error) { - out := new(CompleteMultipartUploadOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/CompleteMultipartUpload", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) AbortMultipartUpload(ctx context.Context, in *AbortMultipartUploadInput, opts ...grpc.CallOption) (*AbortMultipartUploadOutput, error) { - out := new(AbortMultipartUploadOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/AbortMultipartUpload", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) ListMultipartUploads(ctx context.Context, in *ListMultipartUploadsInput, opts ...grpc.CallOption) (*ListMultipartUploadsOutput, error) { - out := new(ListMultipartUploadsOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/ListMultipartUploads", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) ListObjectVersions(ctx context.Context, in *ListObjectVersionsInput, opts ...grpc.CallOption) (*ListObjectVersionsOutput, error) { - out := new(ListObjectVersionsOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/ListObjectVersions", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) HeadObject(ctx context.Context, in *HeadObjectInput, opts ...grpc.CallOption) (*HeadObjectOutput, error) { - out := new(HeadObjectOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/HeadObject", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) IsObjectExist(ctx context.Context, in *IsObjectExistInput, opts ...grpc.CallOption) (*IsObjectExistOutput, error) { - out := new(IsObjectExistOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/IsObjectExist", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) SignURL(ctx context.Context, in *SignURLInput, opts ...grpc.CallOption) (*SignURLOutput, error) { - out := new(SignURLOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/SignURL", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) UpdateDownLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/UpdateDownLoadBandwidthRateLimit", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) UpdateUpLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/UpdateUpLoadBandwidthRateLimit", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) AppendObject(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_AppendObjectClient, error) { - stream, err := c.cc.NewStream(ctx, &_ObjectStorageService_serviceDesc.Streams[3], "/spec.proto.extension.v1.ObjectStorageService/AppendObject", opts...) - if err != nil { - return nil, err - } - x := &objectStorageServiceAppendObjectClient{stream} - return x, nil -} - -type ObjectStorageService_AppendObjectClient interface { - Send(*AppendObjectInput) error - CloseAndRecv() (*AppendObjectOutput, error) - grpc.ClientStream -} - -type objectStorageServiceAppendObjectClient struct { - grpc.ClientStream -} - -func (x *objectStorageServiceAppendObjectClient) Send(m *AppendObjectInput) error { - return x.ClientStream.SendMsg(m) -} - -func (x *objectStorageServiceAppendObjectClient) CloseAndRecv() (*AppendObjectOutput, error) { - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - m := new(AppendObjectOutput) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *objectStorageServiceClient) ListParts(ctx context.Context, in *ListPartsInput, opts ...grpc.CallOption) (*ListPartsOutput, error) { - out := new(ListPartsOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/ListParts", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// ObjectStorageServiceServer is the server API for ObjectStorageService service. -type ObjectStorageServiceServer interface { - InitClient(context.Context, *InitInput) (*emptypb.Empty, error) - PutObject(ObjectStorageService_PutObjectServer) error - GetObject(*GetObjectInput, ObjectStorageService_GetObjectServer) error - DeleteObject(context.Context, *DeleteObjectInput) (*DeleteObjectOutput, error) - PutObjectTagging(context.Context, *PutBucketTaggingInput) (*PutBucketTaggingOutput, error) - DeleteObjectTagging(context.Context, *DeleteObjectTaggingInput) (*DeleteObjectTaggingOutput, error) - GetObjectTagging(context.Context, *GetObjectTaggingInput) (*GetObjectTaggingOutput, error) - CopyObject(context.Context, *CopyObjectInput) (*CopyObjectOutput, error) - DeleteObjects(context.Context, *DeleteObjectsInput) (*DeleteObjectsOutput, error) - ListObjects(context.Context, *ListObjectsInput) (*ListObjectsOutput, error) - GetObjectAcl(context.Context, *GetObjectAclInput) (*GetObjectAclOutput, error) - PutObjectAcl(context.Context, *PutObjectAclInput) (*PutObjectAclOutput, error) - RestoreObject(context.Context, *RestoreObjectInput) (*RestoreObjectOutput, error) - CreateMultipartUpload(context.Context, *CreateMultipartUploadInput) (*CreateMultipartUploadOutput, error) - UploadPart(ObjectStorageService_UploadPartServer) error - UploadPartCopy(context.Context, *UploadPartCopyInput) (*UploadPartCopyOutput, error) - CompleteMultipartUpload(context.Context, *CompleteMultipartUploadInput) (*CompleteMultipartUploadOutput, error) - AbortMultipartUpload(context.Context, *AbortMultipartUploadInput) (*AbortMultipartUploadOutput, error) - ListMultipartUploads(context.Context, *ListMultipartUploadsInput) (*ListMultipartUploadsOutput, error) - ListObjectVersions(context.Context, *ListObjectVersionsInput) (*ListObjectVersionsOutput, error) - HeadObject(context.Context, *HeadObjectInput) (*HeadObjectOutput, error) - IsObjectExist(context.Context, *IsObjectExistInput) (*IsObjectExistOutput, error) - SignURL(context.Context, *SignURLInput) (*SignURLOutput, error) - UpdateDownLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) - UpdateUpLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) - AppendObject(ObjectStorageService_AppendObjectServer) error - ListParts(context.Context, *ListPartsInput) (*ListPartsOutput, error) -} - -// UnimplementedObjectStorageServiceServer can be embedded to have forward compatible implementations. -type UnimplementedObjectStorageServiceServer struct { -} - -func (*UnimplementedObjectStorageServiceServer) InitClient(context.Context, *InitInput) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method InitClient not implemented") -} -func (*UnimplementedObjectStorageServiceServer) PutObject(ObjectStorageService_PutObjectServer) error { - return status.Errorf(codes.Unimplemented, "method PutObject not implemented") -} -func (*UnimplementedObjectStorageServiceServer) GetObject(*GetObjectInput, ObjectStorageService_GetObjectServer) error { - return status.Errorf(codes.Unimplemented, "method GetObject not implemented") -} -func (*UnimplementedObjectStorageServiceServer) DeleteObject(context.Context, *DeleteObjectInput) (*DeleteObjectOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteObject not implemented") -} -func (*UnimplementedObjectStorageServiceServer) PutObjectTagging(context.Context, *PutBucketTaggingInput) (*PutBucketTaggingOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method PutObjectTagging not implemented") -} -func (*UnimplementedObjectStorageServiceServer) DeleteObjectTagging(context.Context, *DeleteObjectTaggingInput) (*DeleteObjectTaggingOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteObjectTagging not implemented") -} -func (*UnimplementedObjectStorageServiceServer) GetObjectTagging(context.Context, *GetObjectTaggingInput) (*GetObjectTaggingOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetObjectTagging not implemented") -} -func (*UnimplementedObjectStorageServiceServer) CopyObject(context.Context, *CopyObjectInput) (*CopyObjectOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method CopyObject not implemented") -} -func (*UnimplementedObjectStorageServiceServer) DeleteObjects(context.Context, *DeleteObjectsInput) (*DeleteObjectsOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteObjects not implemented") -} -func (*UnimplementedObjectStorageServiceServer) ListObjects(context.Context, *ListObjectsInput) (*ListObjectsOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListObjects not implemented") -} -func (*UnimplementedObjectStorageServiceServer) GetObjectAcl(context.Context, *GetObjectAclInput) (*GetObjectAclOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetObjectAcl not implemented") -} -func (*UnimplementedObjectStorageServiceServer) PutObjectAcl(context.Context, *PutObjectAclInput) (*PutObjectAclOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method PutObjectAcl not implemented") -} -func (*UnimplementedObjectStorageServiceServer) RestoreObject(context.Context, *RestoreObjectInput) (*RestoreObjectOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method RestoreObject not implemented") -} -func (*UnimplementedObjectStorageServiceServer) CreateMultipartUpload(context.Context, *CreateMultipartUploadInput) (*CreateMultipartUploadOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateMultipartUpload not implemented") -} -func (*UnimplementedObjectStorageServiceServer) UploadPart(ObjectStorageService_UploadPartServer) error { - return status.Errorf(codes.Unimplemented, "method UploadPart not implemented") -} -func (*UnimplementedObjectStorageServiceServer) UploadPartCopy(context.Context, *UploadPartCopyInput) (*UploadPartCopyOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method UploadPartCopy not implemented") -} -func (*UnimplementedObjectStorageServiceServer) CompleteMultipartUpload(context.Context, *CompleteMultipartUploadInput) (*CompleteMultipartUploadOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method CompleteMultipartUpload not implemented") -} -func (*UnimplementedObjectStorageServiceServer) AbortMultipartUpload(context.Context, *AbortMultipartUploadInput) (*AbortMultipartUploadOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method AbortMultipartUpload not implemented") -} -func (*UnimplementedObjectStorageServiceServer) ListMultipartUploads(context.Context, *ListMultipartUploadsInput) (*ListMultipartUploadsOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListMultipartUploads not implemented") -} -func (*UnimplementedObjectStorageServiceServer) ListObjectVersions(context.Context, *ListObjectVersionsInput) (*ListObjectVersionsOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListObjectVersions not implemented") -} -func (*UnimplementedObjectStorageServiceServer) HeadObject(context.Context, *HeadObjectInput) (*HeadObjectOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method HeadObject not implemented") -} -func (*UnimplementedObjectStorageServiceServer) IsObjectExist(context.Context, *IsObjectExistInput) (*IsObjectExistOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method IsObjectExist not implemented") -} -func (*UnimplementedObjectStorageServiceServer) SignURL(context.Context, *SignURLInput) (*SignURLOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method SignURL not implemented") -} -func (*UnimplementedObjectStorageServiceServer) UpdateDownLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateDownLoadBandwidthRateLimit not implemented") -} -func (*UnimplementedObjectStorageServiceServer) UpdateUpLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateUpLoadBandwidthRateLimit not implemented") -} -func (*UnimplementedObjectStorageServiceServer) AppendObject(ObjectStorageService_AppendObjectServer) error { - return status.Errorf(codes.Unimplemented, "method AppendObject not implemented") -} -func (*UnimplementedObjectStorageServiceServer) ListParts(context.Context, *ListPartsInput) (*ListPartsOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListParts not implemented") -} - -func RegisterObjectStorageServiceServer(s *grpc.Server, srv ObjectStorageServiceServer) { - s.RegisterService(&_ObjectStorageService_serviceDesc, srv) -} - -func _ObjectStorageService_InitClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(InitInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).InitClient(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/InitClient", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).InitClient(ctx, req.(*InitInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_PutObject_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(ObjectStorageServiceServer).PutObject(&objectStorageServicePutObjectServer{stream}) -} - -type ObjectStorageService_PutObjectServer interface { - SendAndClose(*PutObjectOutput) error - Recv() (*PutObjectInput, error) - grpc.ServerStream -} - -type objectStorageServicePutObjectServer struct { - grpc.ServerStream -} - -func (x *objectStorageServicePutObjectServer) SendAndClose(m *PutObjectOutput) error { - return x.ServerStream.SendMsg(m) -} - -func (x *objectStorageServicePutObjectServer) Recv() (*PutObjectInput, error) { - m := new(PutObjectInput) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func _ObjectStorageService_GetObject_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(GetObjectInput) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(ObjectStorageServiceServer).GetObject(m, &objectStorageServiceGetObjectServer{stream}) -} - -type ObjectStorageService_GetObjectServer interface { - Send(*GetObjectOutput) error - grpc.ServerStream -} - -type objectStorageServiceGetObjectServer struct { - grpc.ServerStream -} - -func (x *objectStorageServiceGetObjectServer) Send(m *GetObjectOutput) error { - return x.ServerStream.SendMsg(m) -} - -func _ObjectStorageService_DeleteObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteObjectInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).DeleteObject(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/DeleteObject", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).DeleteObject(ctx, req.(*DeleteObjectInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_PutObjectTagging_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PutBucketTaggingInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).PutObjectTagging(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/PutObjectTagging", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).PutObjectTagging(ctx, req.(*PutBucketTaggingInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_DeleteObjectTagging_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteObjectTaggingInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).DeleteObjectTagging(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/DeleteObjectTagging", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).DeleteObjectTagging(ctx, req.(*DeleteObjectTaggingInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_GetObjectTagging_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetObjectTaggingInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).GetObjectTagging(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/GetObjectTagging", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).GetObjectTagging(ctx, req.(*GetObjectTaggingInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_CopyObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CopyObjectInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).CopyObject(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/CopyObject", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).CopyObject(ctx, req.(*CopyObjectInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_DeleteObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteObjectsInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).DeleteObjects(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/DeleteObjects", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).DeleteObjects(ctx, req.(*DeleteObjectsInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_ListObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListObjectsInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).ListObjects(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/ListObjects", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).ListObjects(ctx, req.(*ListObjectsInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_GetObjectAcl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetObjectAclInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).GetObjectAcl(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/GetObjectAcl", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).GetObjectAcl(ctx, req.(*GetObjectAclInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_PutObjectAcl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PutObjectAclInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).PutObjectAcl(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/PutObjectAcl", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).PutObjectAcl(ctx, req.(*PutObjectAclInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_RestoreObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RestoreObjectInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).RestoreObject(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/RestoreObject", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).RestoreObject(ctx, req.(*RestoreObjectInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_CreateMultipartUpload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateMultipartUploadInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).CreateMultipartUpload(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/CreateMultipartUpload", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).CreateMultipartUpload(ctx, req.(*CreateMultipartUploadInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_UploadPart_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(ObjectStorageServiceServer).UploadPart(&objectStorageServiceUploadPartServer{stream}) -} - -type ObjectStorageService_UploadPartServer interface { - SendAndClose(*UploadPartOutput) error - Recv() (*UploadPartInput, error) - grpc.ServerStream -} - -type objectStorageServiceUploadPartServer struct { - grpc.ServerStream -} - -func (x *objectStorageServiceUploadPartServer) SendAndClose(m *UploadPartOutput) error { - return x.ServerStream.SendMsg(m) -} - -func (x *objectStorageServiceUploadPartServer) Recv() (*UploadPartInput, error) { - m := new(UploadPartInput) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func _ObjectStorageService_UploadPartCopy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UploadPartCopyInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).UploadPartCopy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/UploadPartCopy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).UploadPartCopy(ctx, req.(*UploadPartCopyInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_CompleteMultipartUpload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CompleteMultipartUploadInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).CompleteMultipartUpload(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/CompleteMultipartUpload", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).CompleteMultipartUpload(ctx, req.(*CompleteMultipartUploadInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_AbortMultipartUpload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(AbortMultipartUploadInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).AbortMultipartUpload(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/AbortMultipartUpload", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).AbortMultipartUpload(ctx, req.(*AbortMultipartUploadInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_ListMultipartUploads_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListMultipartUploadsInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).ListMultipartUploads(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/ListMultipartUploads", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).ListMultipartUploads(ctx, req.(*ListMultipartUploadsInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_ListObjectVersions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListObjectVersionsInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).ListObjectVersions(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/ListObjectVersions", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).ListObjectVersions(ctx, req.(*ListObjectVersionsInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_HeadObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(HeadObjectInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).HeadObject(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/HeadObject", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).HeadObject(ctx, req.(*HeadObjectInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_IsObjectExist_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(IsObjectExistInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).IsObjectExist(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/IsObjectExist", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).IsObjectExist(ctx, req.(*IsObjectExistInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_SignURL_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SignURLInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).SignURL(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/SignURL", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).SignURL(ctx, req.(*SignURLInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_UpdateDownLoadBandwidthRateLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateBandwidthRateLimitInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).UpdateDownLoadBandwidthRateLimit(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/UpdateDownLoadBandwidthRateLimit", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).UpdateDownLoadBandwidthRateLimit(ctx, req.(*UpdateBandwidthRateLimitInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_UpdateUpLoadBandwidthRateLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateBandwidthRateLimitInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).UpdateUpLoadBandwidthRateLimit(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/UpdateUpLoadBandwidthRateLimit", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).UpdateUpLoadBandwidthRateLimit(ctx, req.(*UpdateBandwidthRateLimitInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_AppendObject_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(ObjectStorageServiceServer).AppendObject(&objectStorageServiceAppendObjectServer{stream}) -} - -type ObjectStorageService_AppendObjectServer interface { - SendAndClose(*AppendObjectOutput) error - Recv() (*AppendObjectInput, error) - grpc.ServerStream -} - -type objectStorageServiceAppendObjectServer struct { - grpc.ServerStream -} - -func (x *objectStorageServiceAppendObjectServer) SendAndClose(m *AppendObjectOutput) error { - return x.ServerStream.SendMsg(m) -} - -func (x *objectStorageServiceAppendObjectServer) Recv() (*AppendObjectInput, error) { - m := new(AppendObjectInput) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func _ObjectStorageService_ListParts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListPartsInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).ListParts(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/ListParts", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).ListParts(ctx, req.(*ListPartsInput)) - } - return interceptor(ctx, in, info, handler) -} - -var _ObjectStorageService_serviceDesc = grpc.ServiceDesc{ - ServiceName: "spec.proto.extension.v1.ObjectStorageService", - HandlerType: (*ObjectStorageServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "InitClient", - Handler: _ObjectStorageService_InitClient_Handler, - }, - { - MethodName: "DeleteObject", - Handler: _ObjectStorageService_DeleteObject_Handler, - }, - { - MethodName: "PutObjectTagging", - Handler: _ObjectStorageService_PutObjectTagging_Handler, - }, - { - MethodName: "DeleteObjectTagging", - Handler: _ObjectStorageService_DeleteObjectTagging_Handler, - }, - { - MethodName: "GetObjectTagging", - Handler: _ObjectStorageService_GetObjectTagging_Handler, - }, - { - MethodName: "CopyObject", - Handler: _ObjectStorageService_CopyObject_Handler, - }, - { - MethodName: "DeleteObjects", - Handler: _ObjectStorageService_DeleteObjects_Handler, - }, - { - MethodName: "ListObjects", - Handler: _ObjectStorageService_ListObjects_Handler, - }, - { - MethodName: "GetObjectAcl", - Handler: _ObjectStorageService_GetObjectAcl_Handler, - }, - { - MethodName: "PutObjectAcl", - Handler: _ObjectStorageService_PutObjectAcl_Handler, - }, - { - MethodName: "RestoreObject", - Handler: _ObjectStorageService_RestoreObject_Handler, - }, - { - MethodName: "CreateMultipartUpload", - Handler: _ObjectStorageService_CreateMultipartUpload_Handler, - }, - { - MethodName: "UploadPartCopy", - Handler: _ObjectStorageService_UploadPartCopy_Handler, - }, - { - MethodName: "CompleteMultipartUpload", - Handler: _ObjectStorageService_CompleteMultipartUpload_Handler, - }, - { - MethodName: "AbortMultipartUpload", - Handler: _ObjectStorageService_AbortMultipartUpload_Handler, - }, - { - MethodName: "ListMultipartUploads", - Handler: _ObjectStorageService_ListMultipartUploads_Handler, - }, - { - MethodName: "ListObjectVersions", - Handler: _ObjectStorageService_ListObjectVersions_Handler, - }, - { - MethodName: "HeadObject", - Handler: _ObjectStorageService_HeadObject_Handler, - }, - { - MethodName: "IsObjectExist", - Handler: _ObjectStorageService_IsObjectExist_Handler, - }, - { - MethodName: "SignURL", - Handler: _ObjectStorageService_SignURL_Handler, - }, - { - MethodName: "UpdateDownLoadBandwidthRateLimit", - Handler: _ObjectStorageService_UpdateDownLoadBandwidthRateLimit_Handler, - }, - { - MethodName: "UpdateUpLoadBandwidthRateLimit", - Handler: _ObjectStorageService_UpdateUpLoadBandwidthRateLimit_Handler, - }, - { - MethodName: "ListParts", - Handler: _ObjectStorageService_ListParts_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "PutObject", - Handler: _ObjectStorageService_PutObject_Handler, - ClientStreams: true, - }, - { - StreamName: "GetObject", - Handler: _ObjectStorageService_GetObject_Handler, - ServerStreams: true, - }, - { - StreamName: "UploadPart", - Handler: _ObjectStorageService_UploadPart_Handler, - ClientStreams: true, - }, - { - StreamName: "AppendObject", - Handler: _ObjectStorageService_AppendObject_Handler, - ClientStreams: true, - }, - }, - Metadata: "oss.proto", -} diff --git a/spec/proto/extension/v1/oss.proto b/spec/proto/extension/v1/oss.proto index 1213f4f8d5..f98c4a73b5 100644 --- a/spec/proto/extension/v1/oss.proto +++ b/spec/proto/extension/v1/oss.proto @@ -1,3 +1,6 @@ +//The file defined base on s3 protocol, to get an in-depth walkthrough of this file, see: +//https://docs.aws.amazon.com/s3/index.html +//https://github.com/aws/aws-sdk-go-v2 syntax = "proto3"; package spec.proto.extension.v1; @@ -7,160 +10,328 @@ import "google/protobuf/empty.proto"; option go_package = "mosn.io/layotto/spec/proto/extension/v1;s3"; service ObjectStorageService{ - rpc InitClient(InitInput) returns (google.protobuf.Empty){} - rpc PutObject(stream PutObjectInput) returns(PutObjectOutput){} - rpc GetObject(GetObjectInput) returns (stream GetObjectOutput){} - rpc DeleteObject(DeleteObjectInput) returns (DeleteObjectOutput){} - rpc PutObjectTagging(PutBucketTaggingInput) returns (PutBucketTaggingOutput){} - rpc DeleteObjectTagging(DeleteObjectTaggingInput) returns(DeleteObjectTaggingOutput){} - rpc GetObjectTagging(GetObjectTaggingInput) returns(GetObjectTaggingOutput){} - rpc CopyObject(CopyObjectInput) returns(CopyObjectOutput){} - rpc DeleteObjects(DeleteObjectsInput) returns(DeleteObjectsOutput){} - rpc ListObjects(ListObjectsInput) returns(ListObjectsOutput){} - rpc GetObjectAcl(GetObjectAclInput) returns(GetObjectAclOutput){} - rpc PutObjectAcl(PutObjectAclInput) returns(PutObjectAclOutput){} - rpc RestoreObject(RestoreObjectInput) returns(RestoreObjectOutput){} - rpc CreateMultipartUpload(CreateMultipartUploadInput) returns(CreateMultipartUploadOutput){} - rpc UploadPart(stream UploadPartInput) returns(UploadPartOutput){} - rpc UploadPartCopy(UploadPartCopyInput) returns(UploadPartCopyOutput){} - rpc CompleteMultipartUpload(CompleteMultipartUploadInput) returns(CompleteMultipartUploadOutput){} - rpc AbortMultipartUpload(AbortMultipartUploadInput) returns(AbortMultipartUploadOutput){} - rpc ListMultipartUploads(ListMultipartUploadsInput) returns(ListMultipartUploadsOutput){} - rpc ListObjectVersions(ListObjectVersionsInput) returns(ListObjectVersionsOutput){} - rpc HeadObject(HeadObjectInput) returns(HeadObjectOutput){} - rpc IsObjectExist(IsObjectExistInput) returns(IsObjectExistOutput){} - rpc SignURL(SignURLInput) returns(SignURLOutput){} - rpc UpdateDownLoadBandwidthRateLimit(UpdateBandwidthRateLimitInput) returns(google.protobuf.Empty){} - rpc UpdateUpLoadBandwidthRateLimit(UpdateBandwidthRateLimitInput) returns(google.protobuf.Empty){} - rpc AppendObject(stream AppendObjectInput) returns(AppendObjectOutput){} - rpc ListParts(ListPartsInput) returns(ListPartsOutput){} + rpc InitClient(InitInput) returns (google.protobuf.Empty){} + rpc PutObject(stream PutObjectInput) returns(PutObjectOutput){} + rpc GetObject(GetObjectInput) returns (stream GetObjectOutput){} + rpc DeleteObject(DeleteObjectInput) returns (DeleteObjectOutput){} + rpc PutObjectTagging(PutObjectTaggingInput) returns (PutObjectTaggingOutput){} + rpc DeleteObjectTagging(DeleteObjectTaggingInput) returns(DeleteObjectTaggingOutput){} + rpc GetObjectTagging(GetObjectTaggingInput) returns(GetObjectTaggingOutput){} + rpc CopyObject(CopyObjectInput) returns(CopyObjectOutput){} + rpc DeleteObjects(DeleteObjectsInput) returns(DeleteObjectsOutput){} + rpc ListObjects(ListObjectsInput) returns(ListObjectsOutput){} + rpc GetObjectAcl(GetObjectAclInput) returns(GetObjectAclOutput){} + rpc PutObjectAcl(PutObjectAclInput) returns(PutObjectAclOutput){} + rpc RestoreObject(RestoreObjectInput) returns(RestoreObjectOutput){} + rpc CreateMultipartUpload(CreateMultipartUploadInput) returns(CreateMultipartUploadOutput){} + rpc UploadPart(stream UploadPartInput) returns(UploadPartOutput){} + rpc UploadPartCopy(UploadPartCopyInput) returns(UploadPartCopyOutput){} + rpc CompleteMultipartUpload(CompleteMultipartUploadInput) returns(CompleteMultipartUploadOutput){} + rpc AbortMultipartUpload(AbortMultipartUploadInput) returns(AbortMultipartUploadOutput){} + rpc ListMultipartUploads(ListMultipartUploadsInput) returns(ListMultipartUploadsOutput){} + rpc ListObjectVersions(ListObjectVersionsInput) returns(ListObjectVersionsOutput){} + rpc HeadObject(HeadObjectInput) returns(HeadObjectOutput){} + rpc IsObjectExist(IsObjectExistInput) returns(IsObjectExistOutput){} + rpc SignURL(SignURLInput) returns(SignURLOutput){} + rpc UpdateDownLoadBandwidthRateLimit(UpdateBandwidthRateLimitInput) returns(google.protobuf.Empty){} + rpc UpdateUpLoadBandwidthRateLimit(UpdateBandwidthRateLimitInput) returns(google.protobuf.Empty){} + rpc AppendObject(stream AppendObjectInput) returns(AppendObjectOutput){} + rpc ListParts(ListPartsInput) returns(ListPartsOutput){} } message InitInput { - string store_name = 1; - map metadata = 2; + string store_name = 1; + map metadata = 2; } message GetObjectInput { - string store_name = 1; - string bucket = 2; - string expected_bucket_owner = 3; - string if_match = 4; - int64 if_modified_since = 5; - string if_none_match = 6; - int64 if_unmodified_since = 7; - string key = 8; - int64 part_number = 9; - int64 start = 10; - int64 end = 11; - string request_payer = 12; - string response_cache_control = 13; - string response_content_disposition = 14; - string response_content_encoding = 15; - string response_content_language = 16; - string response_content_type = 17; - string response_expires = 18; - string sse_customer_algorithm = 19; - string sse_customer_key = 20; - string sse_customer_key_md5 = 21; - string version_id = 22; - string accept_encoding = 23; - string signed_url = 24; + string store_name = 1; + // The bucket name containing the object + // This member is required + string bucket = 2; + // Key of the object to get + // This member is required + string key = 3; + // The account ID of the expected bucket owner + string expected_bucket_owner = 4; + // Return the object only if its entity tag (ETag) is the same as the one specified + string if_match = 5; + // Return the object only if it has been modified since the specified time + int64 if_modified_since = 6; + // Return the object only if its entity tag (ETag) is different from the one specified + string if_none_match = 7; + // Return the object only if it has not been modified since the specified time + int64 if_unmodified_since = 8; + // Part number of the object being read. This is a positive integer between 1 and + // 10,000. Effectively performs a 'ranged' GET request for the part specified. + // Useful for downloading just a part of an object. + int64 part_number = 9; + // Downloads the specified range bytes of an object + // start is used to specify the location where the file starts + int64 start = 10; + // end is used to specify the location where the file end + int64 end = 11; + // Confirms that the requester knows that they will be charged for the request. + // Bucket owners need not specify this parameter in their requests. For information + // about downloading objects from Requester Pays buckets, see Downloading Objects + // in Requester Pays Buckets + // (https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html) + string request_payer = 12; + // Sets the Cache-Control header of the response. + string response_cache_control = 13; + // Sets the Content-Disposition header of the response + string response_content_disposition = 14; + // Sets the Content-Encoding header of the response + string response_content_encoding = 15; + // Sets the Content-Language header of the response + string response_content_language = 16; + // Sets the Content-Type header of the response + string response_content_type = 17; + // Sets the Expires header of the response + string response_expires = 18; + // Specifies the algorithm to use to when decrypting the object (for example,AES256) + string sse_customer_algorithm = 19; + // Specifies the customer-provided encryption key for Amazon S3 used to encrypt the + // data. This value is used to decrypt the object when recovering it and must match + // the one used when storing the data. The key must be appropriate for use with the + // algorithm specified in the x-amz-server-side-encryption-customer-algorithm header + string sse_customer_key = 20; + // Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321 + // Amazon S3 uses this header for a message integrity check to ensure that the + // encryption key was transmitted without error. + string sse_customer_key_md5 = 21; + // VersionId used to reference a specific version of the object + string version_id = 22; + // Specify Accept-Encoding, aws not supported now + string accept_encoding = 23; + // Specify the signed url of object, user can get object with signed url without ak、sk + string signed_url = 24; } message GetObjectOutput { - bytes body = 1; - string cache_control = 2; - string content_disposition = 3; - string content_encoding = 4; - string content_language = 5; - int64 content_length = 6; - string content_range = 7; - string content_type = 8; - bool delete_marker = 9; - string etag = 10; - string expiration = 11; - string expires = 12; - int64 last_modified = 13; - string version_id = 14; - int64 tag_count = 15; - string storage_class = 16; - int64 parts_count = 17; - map metadata = 18; + // Object data. + bytes body = 1; + // Specifies caching behavior along the request/reply chain. + string cache_control = 2; + // Specifies presentational information for the object. + string content_disposition = 3; + // 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. + string content_encoding = 4; + // The language the content is in. + string content_language = 5; + // Size of the body in bytes. + int64 content_length = 6; + // The portion of the object returned in the response. + string content_range = 7; + // A standard MIME type describing the format of the object data. + string content_type = 8; + // Specifies whether the object retrieved was (true) or was not (false) a Delete + // Marker. If false, this response header does not appear in the response. + bool delete_marker = 9; + // An entity tag (ETag) is an opaque identifier assigned by a web server to a + // specific version of a resource found at a URL. + string etag = 10; + // If the object expiration is configured (see PUT Bucket lifecycle), the response + // includes this header. It includes the expiry-date and rule-id key-value pairs + // providing object expiration information. The value of the rule-id is + // URL-encoded. + string expiration = 11; + // The date and time at which the object is no longer cacheable. + string expires = 12; + // Creation date of the object. + int64 last_modified = 13; + // Version of the object. + string version_id = 14; + // The number of tags, if any, on the object. + int64 tag_count = 15; + // Provides storage class information of the object. Amazon S3 returns this header + // for all objects except for S3 Standard storage class objects. + string storage_class = 16; + // The count of parts this object has. This value is only returned if you specify + // partNumber in your request and the object was uploaded as a multipart upload. + int64 parts_count = 17; + // A map of metadata to store with the object in S3. + // Map keys will be normalized to lower-case. + map metadata = 18; } message PutObjectInput{ string store_name = 1; - string acl = 2; - bytes body = 3; - string bucket = 4; - string key = 5; + // Object data. + bytes body = 2; + // The bucket name to which the PUT action was initiated + // This member is required. + string bucket = 3; + // Object key for which the PUT action was initiated. + // This member is required. + string key = 4; + // The canned ACL to apply to the object,different oss provider have different acl type + string acl = 5; + // 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. bool bucket_key_enabled = 6; + // Can be used to specify caching behavior along the request/reply chain. string cache_control = 7; + // Specifies presentational information for the object. For more information, see + // http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.5.1 + // (http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.5.1). string content_disposition = 8; + // 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. For more information, see + // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11 + // (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11). string content_encoding = 9; + // The date and time at which the object is no longer cacheable. For more + // information, see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 + // (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21). int64 expires = 10; + // The server-side encryption algorithm used when storing this object in Amazon S3 + // (for example, AES256, aws:kms). string server_side_encryption = 11; + // Specify the signed url of object, user can put object with signed url without ak、sk string signed_url = 12; + // A map of metadata to store with the object in S3. map meta = 13; } message PutObjectOutput{ + // Indicates whether the uploaded object uses an S3 Bucket Key for server-side + // encryption with Amazon Web Services KMS (SSE-KMS). bool bucket_key_enabled = 1; + // Entity tag for the uploaded object. string etag = 2; + // If the expiration is configured for the object + string expiration = 3; + // If present, indicates that the requester was successfully charged for the request. + string request_charged = 4; + // Version of the object. + string version_id = 5; } message DeleteObjectInput{ string store_name = 1; + // The bucket name to which the DEL action was initiated + // This member is required. string bucket = 2; + // Object key for which the DEL action was initiated. + // This member is required. string key = 3; + // Confirms that the requester knows that they will be charged for the request. + // Bucket owners need not specify this parameter in their requests. For information + // about downloading objects from Requester Pays buckets, see Downloading Objects + // in Requester Pays Buckets + // (https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html) + // in the Amazon S3 User Guide. string request_payer = 4; + // VersionId used to reference a specific version of the object. string version_id = 5; } message DeleteObjectOutput{ + // Specifies whether the versioned object that was permanently deleted was (true) + // or was not (false) a delete marker. bool delete_marker = 1; + // If present, indicates that the requester was successfully charged for the + // request. string request_charged = 2; + // Returns the version ID of the delete marker created as a result of the DELETE + // operation. string version_id = 3; } -message PutBucketTaggingInput{ +message PutObjectTaggingInput{ string store_name = 1; + // The bucket name containing the object + // This member is required. string bucket = 2; + // Name of the object key. + // This member is required. string key = 3; + // Container for the TagSet and Tag elements map tags = 4; + // The versionId of the object that the tag-set will be added to. string version_id = 5; } -message PutBucketTaggingOutput{ - +message PutObjectTaggingOutput{ + // The versionId of the object the tag-set was added to. + string version_id = 1; + // Metadata pertaining to the operation's result. + map result_metadata = 2; } message DeleteObjectTaggingInput{ string store_name = 1; + // The bucket name containing the objects from which to remove the tags. string bucket = 2; + // The key that identifies the object in the bucket from which to remove all tags. + // This member is required. string key = 3; + // The versionId of the object that the tag-set will be removed from. + string version_id = 4; + // 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). + string expected_bucket_owner = 5; } message DeleteObjectTaggingOutput{ + // The versionId of the object the tag-set was removed from. string version_id = 1; + // Metadata pertaining to the operation's result. + map result_metadata = 2; } message GetObjectTaggingInput{ string store_name = 1; + // The bucket name containing the object for which to get the tagging information. + // This member is required. string bucket = 2; + // Object key for which to get the tagging information. + // This member is required. string key = 3; + // The versionId of the object for which to get the tagging information. + string version_id = 4; + // 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). + string expected_bucket_owner = 5; + // Confirms that the requester knows that they will be charged for the request. + string request_payer = 6; } message GetObjectTaggingOutput{ + // Contains the tag set. + // This member is required. map tags = 1; + // The versionId of the object for which you got the tagging information. + string version_id = 2; + // Metadata pertaining to the operation's result. + map result_metadata = 3; } message CopySource{ + // source object bucket name string copy_source_bucket = 1; + // source object name string copy_source_key = 2; + // source object version string copy_source_version_id = 3; } message CopyObjectInput{ string store_name = 1; + // The name of the destination bucket. When using this action with an access point + // This member is required. string bucket = 2; + // The key of the destination object. + // This member is required. string key = 3; CopySource copy_source = 4; + // The tag-set for the object destination object this value must be used in + // conjunction with the TaggingDirective. The tag-set must be encoded as URL Query + // parameters. string tagging = 5; + // The date and time at which the object is no longer cacheable. int64 expires = 6; // Specifies whether the metadata is copied from the source object or replaced with metadata provided in the request. string metadata_directive = 7; @@ -168,20 +339,33 @@ message CopyObjectInput{ map metadata = 8; } message CopyObjectResult{ + // Returns the ETag of the new object. The ETag reflects only changes to the + // contents of an object, not its metadata. string etag = 1; + // Creation date of the object. int64 last_modified = 2; } message CopyObjectOutput{ + // Container for all response elements. CopyObjectResult copy_object_result = 1; + // Version ID of the newly created copy. + string version_id = 2; + // If the object expiration is configured, the response includes this header. + string expiration = 3; } message Delete{ repeated ObjectIdentifier objects = 1; + // Element to enable quiet mode for the request. When you add this element, you + // must set its value to true. bool quiet = 2; } message ObjectIdentifier{ + // Key name of the object. + // This member is required. string key = 1; + // VersionId for the specific version of the object to delete. string version_id = 2; } message DeleteObjectsInput{ @@ -191,9 +375,17 @@ message DeleteObjectsInput{ string request_payer = 4; } message DeletedObject{ + // Specifies whether the versioned object that was permanently deleted was (true) + // or was not (false) a delete marker. In a simple DELETE, this header indicates + // whether (true) or not (false) a delete marker was created. bool delete_marker = 1; + // The version ID of the delete marker created as a result of the DELETE operation. + // If you delete a specific object version, the value returned by this header is + // the version ID of the object version deleted. string delete_marker_version_id = 2; + // The name of the deleted object. string key = 3; + // The version ID of the deleted object. string version_id = 4; } message DeleteObjectsOutput{ @@ -203,24 +395,59 @@ message DeleteObjectsOutput{ message ListObjectsInput{ string store_name = 1; string bucket = 2; + // A delimiter is a character you use to group keys. string delimiter = 3; + // 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; + // however, XML 1.0 parser cannot parse some characters, such as characters with an + // ASCII value from 0 to 10. For characters that are not supported in XML 1.0, you + // can add this parameter to request that Amazon S3 encode the keys in the + // response. string encoding_type = 4; + // 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). string expected_bucket_owner = 5; + // Marker is where you want Amazon S3 to start listing from. Amazon S3 starts + // listing after this specified key. Marker can be any key in the bucket. string marker = 6; + // 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. int32 maxKeys = 7; + // Limits the response to keys that begin with the specified prefix. string prefix = 8; + // Confirms that the requester knows that she or he will be charged for the list + // objects request. Bucket owners need not specify this parameter in their + // requests. string request_payer = 9; } message ListObjectsOutput{ repeated string common_prefixes = 1; repeated Object contents = 2; + // Causes keys that contain the same string between the prefix and the first + // occurrence of the delimiter to be rolled up into a single result element in the + // CommonPrefixes collection. These rolled-up keys are not returned elsewhere in + // the response. Each rolled-up result counts as only one return against the + // MaxKeys value. string delimiter = 3; + // Encoding type used by Amazon S3 to encode object keys in the response. string encoding_type = 4; + // A flag that indicates whether Amazon S3 returned all of the results that + // satisfied the search criteria. bool is_truncated = 5; + // Indicates where in the bucket listing begins. Marker is included in the response + // if it was sent with the request. string marker = 6; + // The maximum number of keys returned in the response body. int32 max_keys = 7; + // The bucket name. string name = 8; + // When response is truncated (the IsTruncated element value in the response is + // true), you can use the key name in this field as marker in the subsequent + // request to get next set of objects. string next_marker = 9; + // Keys that begin with the indicated prefix. string prefix = 10; } message Owner{ @@ -228,33 +455,49 @@ message Owner{ string id = 2; } message Object{ + // The entity tag is a hash of the object string etag = 1; + // The name that you assign to an object. You use the object key to retrieve the + // object. string key = 2; + // Creation date of the object. int64 last_modified = 3; + // The owner of the object Owner owner = 4; + // Size in bytes of the object int64 size = 5; + // The class of storage used to store the object. string storage_class = 6; } message Grantee{ string display_name = 1; string email_address = 2; + // The canonical user ID of the grantee. string id = 3; string type = 4; + // URI of the grantee group. string uri = 5; } + +// Container for grant information. message Grant{ Grantee grantee = 1; + // Specifies the permission given to the grantee. string permission = 2; } message GetObjectAclInput{ string store_name = 1; string bucket = 2; string key = 3; + // VersionId used to reference a specific version of the object + string version_id = 4; } message GetObjectAclOutput{ repeated Grant grants = 1; Owner owner = 2; + // If present, indicates that the requester was successfully charged for the + // request. string request_charged = 3; } @@ -262,7 +505,10 @@ message PutObjectAclInput{ string store_name = 1; string bucket = 2; string key = 3; + // The canned ACL to apply to the object string acl = 4; + // VersionId used to reference a specific version of the object. + string version_id = 5; } message PutObjectAclOutput{ string request_charged = 1; @@ -272,9 +518,15 @@ message RestoreObjectInput{ string store_name = 1; string bucket = 2; string key = 3; + // VersionId used to reference a specific version of the object. + string version_id = 5; } message RestoreObjectOutput{ + // If present, indicates that the requester was successfully charged for the + // request. string request_charged = 1; + // Indicates the path in the provided S3 output location where Select results will + // be restored to. string restore_output_path = 2; } @@ -282,6 +534,8 @@ message CreateMultipartUploadInput{ string store_name = 1; string bucket = 2; string key = 3; + // The canned ACL to apply to the object. This action is not supported by Amazon S3 + // on Outposts. string acl = 4; bool bucket_key_enabled = 5; string cache_control = 6; @@ -289,6 +543,9 @@ message CreateMultipartUploadInput{ string content_encoding = 8; string content_language = 9; string content_type = 10; + // 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). string expected_bucket_owner = 11; int64 expires = 12; string grant_full_control = 13; @@ -307,6 +564,7 @@ message CreateMultipartUploadInput{ string sse_kms_key_id = 26; string server_side_encryption = 27; string storage_class = 28; + // The tag-set for the object. The tag-set must be encoded as URL Query parameters. string tagging = 29; string website_redirect_location = 30; } @@ -322,6 +580,7 @@ message CreateMultipartUploadOutput{ string sse_kms_encryption_context = 9; string sse_kms_key_id = 10; string server_side_encryption = 11; + // ID for the initiated multipart upload. string upload_id = 12; } @@ -329,19 +588,28 @@ message UploadPartInput{ string store_name = 1; string bucket = 2; string key = 3; + // Object data. bytes body = 4; + // Size of the body in bytes. This parameter is useful when the size of the body + // cannot be determined automatically. int64 content_length = 5; string content_md5 = 6; string expected_bucket_owner = 7; + // Part number of part being uploaded. This is a positive integer between 1 and + // 10,000. + // This member is required. int32 part_number = 8; string request_payer = 9; string sse_customer_algorithm = 10; string sse_customer_key = 11; string sse_customer_key_md5 = 12; + // Upload ID identifying the multipart upload whose part is being uploaded. + // This member is required. string upload_id = 13; } message UploadPartOutput{ bool bucket_key_enabled = 1; + // Entity tag for the uploaded object. string etag = 2; string request_charged = 3; string sse_customer_algorithm = 4; @@ -355,13 +623,20 @@ message UploadPartCopyInput{ string bucket = 2; string key = 3; CopySource copy_source = 4; + // Part number of part being copied. This is a positive integer between 1 and + // 10,000. + // This member is required. int32 part_number = 5; + // Upload ID identifying the multipart upload whose part is being copied. + // This member is required. string upload_id = 6; + // The range of bytes to copy from the source object.bytes=start_position-part_size int64 start_position = 7; int64 part_size = 8; } message CopyPartResult{ + // Entity tag of the object. string etag = 1; int64 last_modified = 2; } @@ -381,15 +656,19 @@ message CompletedPart{ int32 part_number = 2; } message CompletedMultipartUpload{ + // Array of CompletedPart data types. repeated CompletedPart parts = 1; } message CompleteMultipartUploadInput{ string store_name = 1; string bucket = 2; string key = 3; + // ID for the initiated multipart upload. + // This member is required. string upload_id = 4; string request_payer = 5; string expected_bucket_owner = 6; + // The container for the multipart upload request information. CompletedMultipartUpload multipart_upload = 7; } message CompleteMultipartUploadOutput{ @@ -397,11 +676,18 @@ message CompleteMultipartUploadOutput{ string key = 2; bool bucket_key_enabled = 3; string etag = 4; + // 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. string expiration = 5; + // The URI that identifies the newly created object. string location = 6; + // If present, indicates that the requester was successfully charged for the + // request. string request_charged = 7; string sse_kms_keyId = 8; string server_side_encryption = 9; + // Version ID of the newly created object, in case the bucket has versioning turned + // on. string version_id = 10; } @@ -411,21 +697,49 @@ message AbortMultipartUploadInput{ string key = 3; string expected_bucket_owner = 4; string request_payer = 5; + // Upload ID that identifies the multipart upload. + // This member is required. string upload_id = 6; } message AbortMultipartUploadOutput{ + // If present, indicates that the requester was successfully charged for the + // request. string request_charged = 1; } message ListMultipartUploadsInput{ string store_name = 1; string bucket = 2; + // 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. string delimiter = 3; string encoding_type = 4; string expected_bucket_owner = 5; + // 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. string key_marker = 6; + // 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. int64 max_uploads = 7; + // 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.) string prefix = 8; + // 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. string upload_id_marker = 9; } message Initiator{ @@ -445,36 +759,75 @@ message ListMultipartUploadsOutput{ repeated string common_prefixes = 2; string delimiter = 3; string encoding_type = 4; + // 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. bool is_truncated = 5; + // The key at or after which the listing began. string key_marker = 6; + // Maximum number of multipart uploads that could have been included in the + // response. int32 max_uploads = 7; + // When a list is truncated, this element specifies the value that should be used + // for the key-marker request parameter in a subsequent request. string next_key_marker = 8; + // 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. string next_upload_id_marker = 9; + // When a prefix is provided in the request, this field contains the specified + // prefix. The result contains only keys starting with the specified prefix. string prefix = 10; + // Upload ID after which listing began. string upload_id_marker = 11; + // Container for elements related to a particular multipart upload. A response can + // contain zero or more Upload elements. repeated MultipartUpload uploads = 12; } message ListObjectVersionsInput{ string store_name = 1; string bucket = 2; + // 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. string delimiter = 3; string encoding_type = 4; string expected_bucket_owner = 5; + // Specifies the key to start with when listing objects in a bucket. string key_marker = 6; + // 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. int64 max_keys = 7; + // 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. string prefix = 8; + // Specifies the object version you want to start listing from. string version_id_marker = 9; } message DeleteMarkerEntry{ + // Specifies whether the object is (true) or is not (false) the latest version of + // an object. bool is_latest = 1; string key = 2; + // Date and time the object was last modified. int64 last_modified = 3; Owner owner = 4; + // Version ID of an object. string version_id = 5; } message ObjectVersion{ string etag = 1; + // Specifies whether the object is (true) or is not (false) the latest version of + // an object. bool is_latest = 2; string key = 3; int64 last_modified = 4; @@ -496,6 +849,7 @@ message ListObjectVersionsOutput{ string next_version_id_marker = 10; string prefix = 11; string version_id_marker = 12; + // Container for version information. repeated ObjectVersion versions = 13; } @@ -509,6 +863,10 @@ message HeadObjectInput{ int64 if_modified_since = 7; string if_none_match = 8; int64 if_unmodified_since = 9; + // 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. int32 part_number = 10; string request_payer = 11; string sse_customer_algorithm = 12; @@ -527,6 +885,7 @@ message IsObjectExistInput{ string store_name = 1; string bucket = 2; string key = 3; + string version_id = 4; } message IsObjectExistOutput{ bool file_exist = 1; @@ -536,7 +895,9 @@ message SignURLInput{ string store_name = 1; string bucket = 2; string key = 3; + // the method for sign url, eg. GET、POST string method = 4; + // expire time of the sign url int64 expired_in_sec = 5; } message SignURLOutput{ @@ -592,9 +953,19 @@ message Part{ message ListPartsOutput{ string bucket = 1; string key = 2; + // Upload ID identifying the multipart upload whose parts are being listed. string upload_id = 3; + // 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. string next_part_number_marker = 4; + // Maximum number of parts that were allowed in the response. int64 max_parts = 5; + // 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. bool is_truncated = 6; + // Container for elements related to a particular part. A response can contain zero + // or more Part elements. repeated Part parts = 7; } \ No newline at end of file diff --git a/spec/proto/extension/v1/oss_grpc.pb.go b/spec/proto/extension/v1/oss_grpc.pb.go new file mode 100644 index 0000000000..79fc45eda6 --- /dev/null +++ b/spec/proto/extension/v1/oss_grpc.pb.go @@ -0,0 +1,1166 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package s3 + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// ObjectStorageServiceClient is the client API for ObjectStorageService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ObjectStorageServiceClient interface { + InitClient(ctx context.Context, in *InitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) + PutObject(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_PutObjectClient, error) + GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (ObjectStorageService_GetObjectClient, error) + DeleteObject(ctx context.Context, in *DeleteObjectInput, opts ...grpc.CallOption) (*DeleteObjectOutput, error) + PutObjectTagging(ctx context.Context, in *PutObjectTaggingInput, opts ...grpc.CallOption) (*PutObjectTaggingOutput, error) + DeleteObjectTagging(ctx context.Context, in *DeleteObjectTaggingInput, opts ...grpc.CallOption) (*DeleteObjectTaggingOutput, error) + GetObjectTagging(ctx context.Context, in *GetObjectTaggingInput, opts ...grpc.CallOption) (*GetObjectTaggingOutput, error) + CopyObject(ctx context.Context, in *CopyObjectInput, opts ...grpc.CallOption) (*CopyObjectOutput, error) + DeleteObjects(ctx context.Context, in *DeleteObjectsInput, opts ...grpc.CallOption) (*DeleteObjectsOutput, error) + ListObjects(ctx context.Context, in *ListObjectsInput, opts ...grpc.CallOption) (*ListObjectsOutput, error) + GetObjectAcl(ctx context.Context, in *GetObjectAclInput, opts ...grpc.CallOption) (*GetObjectAclOutput, error) + PutObjectAcl(ctx context.Context, in *PutObjectAclInput, opts ...grpc.CallOption) (*PutObjectAclOutput, error) + RestoreObject(ctx context.Context, in *RestoreObjectInput, opts ...grpc.CallOption) (*RestoreObjectOutput, error) + CreateMultipartUpload(ctx context.Context, in *CreateMultipartUploadInput, opts ...grpc.CallOption) (*CreateMultipartUploadOutput, error) + UploadPart(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_UploadPartClient, error) + UploadPartCopy(ctx context.Context, in *UploadPartCopyInput, opts ...grpc.CallOption) (*UploadPartCopyOutput, error) + CompleteMultipartUpload(ctx context.Context, in *CompleteMultipartUploadInput, opts ...grpc.CallOption) (*CompleteMultipartUploadOutput, error) + AbortMultipartUpload(ctx context.Context, in *AbortMultipartUploadInput, opts ...grpc.CallOption) (*AbortMultipartUploadOutput, error) + ListMultipartUploads(ctx context.Context, in *ListMultipartUploadsInput, opts ...grpc.CallOption) (*ListMultipartUploadsOutput, error) + ListObjectVersions(ctx context.Context, in *ListObjectVersionsInput, opts ...grpc.CallOption) (*ListObjectVersionsOutput, error) + HeadObject(ctx context.Context, in *HeadObjectInput, opts ...grpc.CallOption) (*HeadObjectOutput, error) + IsObjectExist(ctx context.Context, in *IsObjectExistInput, opts ...grpc.CallOption) (*IsObjectExistOutput, error) + SignURL(ctx context.Context, in *SignURLInput, opts ...grpc.CallOption) (*SignURLOutput, error) + UpdateDownLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) + UpdateUpLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) + AppendObject(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_AppendObjectClient, error) + ListParts(ctx context.Context, in *ListPartsInput, opts ...grpc.CallOption) (*ListPartsOutput, error) +} + +type objectStorageServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewObjectStorageServiceClient(cc grpc.ClientConnInterface) ObjectStorageServiceClient { + return &objectStorageServiceClient{cc} +} + +func (c *objectStorageServiceClient) InitClient(ctx context.Context, in *InitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/InitClient", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) PutObject(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_PutObjectClient, error) { + stream, err := c.cc.NewStream(ctx, &ObjectStorageService_ServiceDesc.Streams[0], "/spec.proto.extension.v1.ObjectStorageService/PutObject", opts...) + if err != nil { + return nil, err + } + x := &objectStorageServicePutObjectClient{stream} + return x, nil +} + +type ObjectStorageService_PutObjectClient interface { + Send(*PutObjectInput) error + CloseAndRecv() (*PutObjectOutput, error) + grpc.ClientStream +} + +type objectStorageServicePutObjectClient struct { + grpc.ClientStream +} + +func (x *objectStorageServicePutObjectClient) Send(m *PutObjectInput) error { + return x.ClientStream.SendMsg(m) +} + +func (x *objectStorageServicePutObjectClient) CloseAndRecv() (*PutObjectOutput, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(PutObjectOutput) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *objectStorageServiceClient) GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (ObjectStorageService_GetObjectClient, error) { + stream, err := c.cc.NewStream(ctx, &ObjectStorageService_ServiceDesc.Streams[1], "/spec.proto.extension.v1.ObjectStorageService/GetObject", opts...) + if err != nil { + return nil, err + } + x := &objectStorageServiceGetObjectClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type ObjectStorageService_GetObjectClient interface { + Recv() (*GetObjectOutput, error) + grpc.ClientStream +} + +type objectStorageServiceGetObjectClient struct { + grpc.ClientStream +} + +func (x *objectStorageServiceGetObjectClient) Recv() (*GetObjectOutput, error) { + m := new(GetObjectOutput) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *objectStorageServiceClient) DeleteObject(ctx context.Context, in *DeleteObjectInput, opts ...grpc.CallOption) (*DeleteObjectOutput, error) { + out := new(DeleteObjectOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/DeleteObject", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) PutObjectTagging(ctx context.Context, in *PutObjectTaggingInput, opts ...grpc.CallOption) (*PutObjectTaggingOutput, error) { + out := new(PutObjectTaggingOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/PutObjectTagging", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) DeleteObjectTagging(ctx context.Context, in *DeleteObjectTaggingInput, opts ...grpc.CallOption) (*DeleteObjectTaggingOutput, error) { + out := new(DeleteObjectTaggingOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/DeleteObjectTagging", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) GetObjectTagging(ctx context.Context, in *GetObjectTaggingInput, opts ...grpc.CallOption) (*GetObjectTaggingOutput, error) { + out := new(GetObjectTaggingOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/GetObjectTagging", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) CopyObject(ctx context.Context, in *CopyObjectInput, opts ...grpc.CallOption) (*CopyObjectOutput, error) { + out := new(CopyObjectOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/CopyObject", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) DeleteObjects(ctx context.Context, in *DeleteObjectsInput, opts ...grpc.CallOption) (*DeleteObjectsOutput, error) { + out := new(DeleteObjectsOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/DeleteObjects", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) ListObjects(ctx context.Context, in *ListObjectsInput, opts ...grpc.CallOption) (*ListObjectsOutput, error) { + out := new(ListObjectsOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/ListObjects", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) GetObjectAcl(ctx context.Context, in *GetObjectAclInput, opts ...grpc.CallOption) (*GetObjectAclOutput, error) { + out := new(GetObjectAclOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/GetObjectAcl", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) PutObjectAcl(ctx context.Context, in *PutObjectAclInput, opts ...grpc.CallOption) (*PutObjectAclOutput, error) { + out := new(PutObjectAclOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/PutObjectAcl", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) RestoreObject(ctx context.Context, in *RestoreObjectInput, opts ...grpc.CallOption) (*RestoreObjectOutput, error) { + out := new(RestoreObjectOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/RestoreObject", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) CreateMultipartUpload(ctx context.Context, in *CreateMultipartUploadInput, opts ...grpc.CallOption) (*CreateMultipartUploadOutput, error) { + out := new(CreateMultipartUploadOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/CreateMultipartUpload", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) UploadPart(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_UploadPartClient, error) { + stream, err := c.cc.NewStream(ctx, &ObjectStorageService_ServiceDesc.Streams[2], "/spec.proto.extension.v1.ObjectStorageService/UploadPart", opts...) + if err != nil { + return nil, err + } + x := &objectStorageServiceUploadPartClient{stream} + return x, nil +} + +type ObjectStorageService_UploadPartClient interface { + Send(*UploadPartInput) error + CloseAndRecv() (*UploadPartOutput, error) + grpc.ClientStream +} + +type objectStorageServiceUploadPartClient struct { + grpc.ClientStream +} + +func (x *objectStorageServiceUploadPartClient) Send(m *UploadPartInput) error { + return x.ClientStream.SendMsg(m) +} + +func (x *objectStorageServiceUploadPartClient) CloseAndRecv() (*UploadPartOutput, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(UploadPartOutput) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *objectStorageServiceClient) UploadPartCopy(ctx context.Context, in *UploadPartCopyInput, opts ...grpc.CallOption) (*UploadPartCopyOutput, error) { + out := new(UploadPartCopyOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/UploadPartCopy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) CompleteMultipartUpload(ctx context.Context, in *CompleteMultipartUploadInput, opts ...grpc.CallOption) (*CompleteMultipartUploadOutput, error) { + out := new(CompleteMultipartUploadOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/CompleteMultipartUpload", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) AbortMultipartUpload(ctx context.Context, in *AbortMultipartUploadInput, opts ...grpc.CallOption) (*AbortMultipartUploadOutput, error) { + out := new(AbortMultipartUploadOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/AbortMultipartUpload", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) ListMultipartUploads(ctx context.Context, in *ListMultipartUploadsInput, opts ...grpc.CallOption) (*ListMultipartUploadsOutput, error) { + out := new(ListMultipartUploadsOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/ListMultipartUploads", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) ListObjectVersions(ctx context.Context, in *ListObjectVersionsInput, opts ...grpc.CallOption) (*ListObjectVersionsOutput, error) { + out := new(ListObjectVersionsOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/ListObjectVersions", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) HeadObject(ctx context.Context, in *HeadObjectInput, opts ...grpc.CallOption) (*HeadObjectOutput, error) { + out := new(HeadObjectOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/HeadObject", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) IsObjectExist(ctx context.Context, in *IsObjectExistInput, opts ...grpc.CallOption) (*IsObjectExistOutput, error) { + out := new(IsObjectExistOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/IsObjectExist", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) SignURL(ctx context.Context, in *SignURLInput, opts ...grpc.CallOption) (*SignURLOutput, error) { + out := new(SignURLOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/SignURL", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) UpdateDownLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/UpdateDownLoadBandwidthRateLimit", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) UpdateUpLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/UpdateUpLoadBandwidthRateLimit", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) AppendObject(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_AppendObjectClient, error) { + stream, err := c.cc.NewStream(ctx, &ObjectStorageService_ServiceDesc.Streams[3], "/spec.proto.extension.v1.ObjectStorageService/AppendObject", opts...) + if err != nil { + return nil, err + } + x := &objectStorageServiceAppendObjectClient{stream} + return x, nil +} + +type ObjectStorageService_AppendObjectClient interface { + Send(*AppendObjectInput) error + CloseAndRecv() (*AppendObjectOutput, error) + grpc.ClientStream +} + +type objectStorageServiceAppendObjectClient struct { + grpc.ClientStream +} + +func (x *objectStorageServiceAppendObjectClient) Send(m *AppendObjectInput) error { + return x.ClientStream.SendMsg(m) +} + +func (x *objectStorageServiceAppendObjectClient) CloseAndRecv() (*AppendObjectOutput, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(AppendObjectOutput) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *objectStorageServiceClient) ListParts(ctx context.Context, in *ListPartsInput, opts ...grpc.CallOption) (*ListPartsOutput, error) { + out := new(ListPartsOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/ListParts", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ObjectStorageServiceServer is the server API for ObjectStorageService service. +// All implementations should embed UnimplementedObjectStorageServiceServer +// for forward compatibility +type ObjectStorageServiceServer interface { + InitClient(context.Context, *InitInput) (*emptypb.Empty, error) + PutObject(ObjectStorageService_PutObjectServer) error + GetObject(*GetObjectInput, ObjectStorageService_GetObjectServer) error + DeleteObject(context.Context, *DeleteObjectInput) (*DeleteObjectOutput, error) + PutObjectTagging(context.Context, *PutObjectTaggingInput) (*PutObjectTaggingOutput, error) + DeleteObjectTagging(context.Context, *DeleteObjectTaggingInput) (*DeleteObjectTaggingOutput, error) + GetObjectTagging(context.Context, *GetObjectTaggingInput) (*GetObjectTaggingOutput, error) + CopyObject(context.Context, *CopyObjectInput) (*CopyObjectOutput, error) + DeleteObjects(context.Context, *DeleteObjectsInput) (*DeleteObjectsOutput, error) + ListObjects(context.Context, *ListObjectsInput) (*ListObjectsOutput, error) + GetObjectAcl(context.Context, *GetObjectAclInput) (*GetObjectAclOutput, error) + PutObjectAcl(context.Context, *PutObjectAclInput) (*PutObjectAclOutput, error) + RestoreObject(context.Context, *RestoreObjectInput) (*RestoreObjectOutput, error) + CreateMultipartUpload(context.Context, *CreateMultipartUploadInput) (*CreateMultipartUploadOutput, error) + UploadPart(ObjectStorageService_UploadPartServer) error + UploadPartCopy(context.Context, *UploadPartCopyInput) (*UploadPartCopyOutput, error) + CompleteMultipartUpload(context.Context, *CompleteMultipartUploadInput) (*CompleteMultipartUploadOutput, error) + AbortMultipartUpload(context.Context, *AbortMultipartUploadInput) (*AbortMultipartUploadOutput, error) + ListMultipartUploads(context.Context, *ListMultipartUploadsInput) (*ListMultipartUploadsOutput, error) + ListObjectVersions(context.Context, *ListObjectVersionsInput) (*ListObjectVersionsOutput, error) + HeadObject(context.Context, *HeadObjectInput) (*HeadObjectOutput, error) + IsObjectExist(context.Context, *IsObjectExistInput) (*IsObjectExistOutput, error) + SignURL(context.Context, *SignURLInput) (*SignURLOutput, error) + UpdateDownLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) + UpdateUpLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) + AppendObject(ObjectStorageService_AppendObjectServer) error + ListParts(context.Context, *ListPartsInput) (*ListPartsOutput, error) +} + +// UnimplementedObjectStorageServiceServer should be embedded to have forward compatible implementations. +type UnimplementedObjectStorageServiceServer struct { +} + +func (UnimplementedObjectStorageServiceServer) InitClient(context.Context, *InitInput) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method InitClient not implemented") +} +func (UnimplementedObjectStorageServiceServer) PutObject(ObjectStorageService_PutObjectServer) error { + return status.Errorf(codes.Unimplemented, "method PutObject not implemented") +} +func (UnimplementedObjectStorageServiceServer) GetObject(*GetObjectInput, ObjectStorageService_GetObjectServer) error { + return status.Errorf(codes.Unimplemented, "method GetObject not implemented") +} +func (UnimplementedObjectStorageServiceServer) DeleteObject(context.Context, *DeleteObjectInput) (*DeleteObjectOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteObject not implemented") +} +func (UnimplementedObjectStorageServiceServer) PutObjectTagging(context.Context, *PutObjectTaggingInput) (*PutObjectTaggingOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method PutObjectTagging not implemented") +} +func (UnimplementedObjectStorageServiceServer) DeleteObjectTagging(context.Context, *DeleteObjectTaggingInput) (*DeleteObjectTaggingOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteObjectTagging not implemented") +} +func (UnimplementedObjectStorageServiceServer) GetObjectTagging(context.Context, *GetObjectTaggingInput) (*GetObjectTaggingOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetObjectTagging not implemented") +} +func (UnimplementedObjectStorageServiceServer) CopyObject(context.Context, *CopyObjectInput) (*CopyObjectOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method CopyObject not implemented") +} +func (UnimplementedObjectStorageServiceServer) DeleteObjects(context.Context, *DeleteObjectsInput) (*DeleteObjectsOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteObjects not implemented") +} +func (UnimplementedObjectStorageServiceServer) ListObjects(context.Context, *ListObjectsInput) (*ListObjectsOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListObjects not implemented") +} +func (UnimplementedObjectStorageServiceServer) GetObjectAcl(context.Context, *GetObjectAclInput) (*GetObjectAclOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetObjectAcl not implemented") +} +func (UnimplementedObjectStorageServiceServer) PutObjectAcl(context.Context, *PutObjectAclInput) (*PutObjectAclOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method PutObjectAcl not implemented") +} +func (UnimplementedObjectStorageServiceServer) RestoreObject(context.Context, *RestoreObjectInput) (*RestoreObjectOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method RestoreObject not implemented") +} +func (UnimplementedObjectStorageServiceServer) CreateMultipartUpload(context.Context, *CreateMultipartUploadInput) (*CreateMultipartUploadOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateMultipartUpload not implemented") +} +func (UnimplementedObjectStorageServiceServer) UploadPart(ObjectStorageService_UploadPartServer) error { + return status.Errorf(codes.Unimplemented, "method UploadPart not implemented") +} +func (UnimplementedObjectStorageServiceServer) UploadPartCopy(context.Context, *UploadPartCopyInput) (*UploadPartCopyOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method UploadPartCopy not implemented") +} +func (UnimplementedObjectStorageServiceServer) CompleteMultipartUpload(context.Context, *CompleteMultipartUploadInput) (*CompleteMultipartUploadOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method CompleteMultipartUpload not implemented") +} +func (UnimplementedObjectStorageServiceServer) AbortMultipartUpload(context.Context, *AbortMultipartUploadInput) (*AbortMultipartUploadOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method AbortMultipartUpload not implemented") +} +func (UnimplementedObjectStorageServiceServer) ListMultipartUploads(context.Context, *ListMultipartUploadsInput) (*ListMultipartUploadsOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListMultipartUploads not implemented") +} +func (UnimplementedObjectStorageServiceServer) ListObjectVersions(context.Context, *ListObjectVersionsInput) (*ListObjectVersionsOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListObjectVersions not implemented") +} +func (UnimplementedObjectStorageServiceServer) HeadObject(context.Context, *HeadObjectInput) (*HeadObjectOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method HeadObject not implemented") +} +func (UnimplementedObjectStorageServiceServer) IsObjectExist(context.Context, *IsObjectExistInput) (*IsObjectExistOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method IsObjectExist not implemented") +} +func (UnimplementedObjectStorageServiceServer) SignURL(context.Context, *SignURLInput) (*SignURLOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method SignURL not implemented") +} +func (UnimplementedObjectStorageServiceServer) UpdateDownLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateDownLoadBandwidthRateLimit not implemented") +} +func (UnimplementedObjectStorageServiceServer) UpdateUpLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateUpLoadBandwidthRateLimit not implemented") +} +func (UnimplementedObjectStorageServiceServer) AppendObject(ObjectStorageService_AppendObjectServer) error { + return status.Errorf(codes.Unimplemented, "method AppendObject not implemented") +} +func (UnimplementedObjectStorageServiceServer) ListParts(context.Context, *ListPartsInput) (*ListPartsOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListParts not implemented") +} + +// UnsafeObjectStorageServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ObjectStorageServiceServer will +// result in compilation errors. +type UnsafeObjectStorageServiceServer interface { + mustEmbedUnimplementedObjectStorageServiceServer() +} + +func RegisterObjectStorageServiceServer(s grpc.ServiceRegistrar, srv ObjectStorageServiceServer) { + s.RegisterService(&ObjectStorageService_ServiceDesc, srv) +} + +func _ObjectStorageService_InitClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(InitInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).InitClient(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/InitClient", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).InitClient(ctx, req.(*InitInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_PutObject_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(ObjectStorageServiceServer).PutObject(&objectStorageServicePutObjectServer{stream}) +} + +type ObjectStorageService_PutObjectServer interface { + SendAndClose(*PutObjectOutput) error + Recv() (*PutObjectInput, error) + grpc.ServerStream +} + +type objectStorageServicePutObjectServer struct { + grpc.ServerStream +} + +func (x *objectStorageServicePutObjectServer) SendAndClose(m *PutObjectOutput) error { + return x.ServerStream.SendMsg(m) +} + +func (x *objectStorageServicePutObjectServer) Recv() (*PutObjectInput, error) { + m := new(PutObjectInput) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func _ObjectStorageService_GetObject_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(GetObjectInput) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(ObjectStorageServiceServer).GetObject(m, &objectStorageServiceGetObjectServer{stream}) +} + +type ObjectStorageService_GetObjectServer interface { + Send(*GetObjectOutput) error + grpc.ServerStream +} + +type objectStorageServiceGetObjectServer struct { + grpc.ServerStream +} + +func (x *objectStorageServiceGetObjectServer) Send(m *GetObjectOutput) error { + return x.ServerStream.SendMsg(m) +} + +func _ObjectStorageService_DeleteObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteObjectInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).DeleteObject(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/DeleteObject", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).DeleteObject(ctx, req.(*DeleteObjectInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_PutObjectTagging_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PutObjectTaggingInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).PutObjectTagging(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/PutObjectTagging", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).PutObjectTagging(ctx, req.(*PutObjectTaggingInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_DeleteObjectTagging_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteObjectTaggingInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).DeleteObjectTagging(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/DeleteObjectTagging", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).DeleteObjectTagging(ctx, req.(*DeleteObjectTaggingInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_GetObjectTagging_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetObjectTaggingInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).GetObjectTagging(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/GetObjectTagging", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).GetObjectTagging(ctx, req.(*GetObjectTaggingInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_CopyObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CopyObjectInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).CopyObject(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/CopyObject", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).CopyObject(ctx, req.(*CopyObjectInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_DeleteObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteObjectsInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).DeleteObjects(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/DeleteObjects", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).DeleteObjects(ctx, req.(*DeleteObjectsInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_ListObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListObjectsInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).ListObjects(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/ListObjects", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).ListObjects(ctx, req.(*ListObjectsInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_GetObjectAcl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetObjectAclInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).GetObjectAcl(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/GetObjectAcl", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).GetObjectAcl(ctx, req.(*GetObjectAclInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_PutObjectAcl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PutObjectAclInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).PutObjectAcl(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/PutObjectAcl", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).PutObjectAcl(ctx, req.(*PutObjectAclInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_RestoreObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RestoreObjectInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).RestoreObject(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/RestoreObject", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).RestoreObject(ctx, req.(*RestoreObjectInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_CreateMultipartUpload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateMultipartUploadInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).CreateMultipartUpload(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/CreateMultipartUpload", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).CreateMultipartUpload(ctx, req.(*CreateMultipartUploadInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_UploadPart_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(ObjectStorageServiceServer).UploadPart(&objectStorageServiceUploadPartServer{stream}) +} + +type ObjectStorageService_UploadPartServer interface { + SendAndClose(*UploadPartOutput) error + Recv() (*UploadPartInput, error) + grpc.ServerStream +} + +type objectStorageServiceUploadPartServer struct { + grpc.ServerStream +} + +func (x *objectStorageServiceUploadPartServer) SendAndClose(m *UploadPartOutput) error { + return x.ServerStream.SendMsg(m) +} + +func (x *objectStorageServiceUploadPartServer) Recv() (*UploadPartInput, error) { + m := new(UploadPartInput) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func _ObjectStorageService_UploadPartCopy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UploadPartCopyInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).UploadPartCopy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/UploadPartCopy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).UploadPartCopy(ctx, req.(*UploadPartCopyInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_CompleteMultipartUpload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CompleteMultipartUploadInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).CompleteMultipartUpload(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/CompleteMultipartUpload", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).CompleteMultipartUpload(ctx, req.(*CompleteMultipartUploadInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_AbortMultipartUpload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AbortMultipartUploadInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).AbortMultipartUpload(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/AbortMultipartUpload", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).AbortMultipartUpload(ctx, req.(*AbortMultipartUploadInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_ListMultipartUploads_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListMultipartUploadsInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).ListMultipartUploads(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/ListMultipartUploads", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).ListMultipartUploads(ctx, req.(*ListMultipartUploadsInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_ListObjectVersions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListObjectVersionsInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).ListObjectVersions(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/ListObjectVersions", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).ListObjectVersions(ctx, req.(*ListObjectVersionsInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_HeadObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(HeadObjectInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).HeadObject(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/HeadObject", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).HeadObject(ctx, req.(*HeadObjectInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_IsObjectExist_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(IsObjectExistInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).IsObjectExist(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/IsObjectExist", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).IsObjectExist(ctx, req.(*IsObjectExistInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_SignURL_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SignURLInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).SignURL(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/SignURL", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).SignURL(ctx, req.(*SignURLInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_UpdateDownLoadBandwidthRateLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateBandwidthRateLimitInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).UpdateDownLoadBandwidthRateLimit(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/UpdateDownLoadBandwidthRateLimit", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).UpdateDownLoadBandwidthRateLimit(ctx, req.(*UpdateBandwidthRateLimitInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_UpdateUpLoadBandwidthRateLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateBandwidthRateLimitInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).UpdateUpLoadBandwidthRateLimit(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/UpdateUpLoadBandwidthRateLimit", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).UpdateUpLoadBandwidthRateLimit(ctx, req.(*UpdateBandwidthRateLimitInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_AppendObject_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(ObjectStorageServiceServer).AppendObject(&objectStorageServiceAppendObjectServer{stream}) +} + +type ObjectStorageService_AppendObjectServer interface { + SendAndClose(*AppendObjectOutput) error + Recv() (*AppendObjectInput, error) + grpc.ServerStream +} + +type objectStorageServiceAppendObjectServer struct { + grpc.ServerStream +} + +func (x *objectStorageServiceAppendObjectServer) SendAndClose(m *AppendObjectOutput) error { + return x.ServerStream.SendMsg(m) +} + +func (x *objectStorageServiceAppendObjectServer) Recv() (*AppendObjectInput, error) { + m := new(AppendObjectInput) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func _ObjectStorageService_ListParts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListPartsInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).ListParts(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/ListParts", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).ListParts(ctx, req.(*ListPartsInput)) + } + return interceptor(ctx, in, info, handler) +} + +// ObjectStorageService_ServiceDesc is the grpc.ServiceDesc for ObjectStorageService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ObjectStorageService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "spec.proto.extension.v1.ObjectStorageService", + HandlerType: (*ObjectStorageServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "InitClient", + Handler: _ObjectStorageService_InitClient_Handler, + }, + { + MethodName: "DeleteObject", + Handler: _ObjectStorageService_DeleteObject_Handler, + }, + { + MethodName: "PutObjectTagging", + Handler: _ObjectStorageService_PutObjectTagging_Handler, + }, + { + MethodName: "DeleteObjectTagging", + Handler: _ObjectStorageService_DeleteObjectTagging_Handler, + }, + { + MethodName: "GetObjectTagging", + Handler: _ObjectStorageService_GetObjectTagging_Handler, + }, + { + MethodName: "CopyObject", + Handler: _ObjectStorageService_CopyObject_Handler, + }, + { + MethodName: "DeleteObjects", + Handler: _ObjectStorageService_DeleteObjects_Handler, + }, + { + MethodName: "ListObjects", + Handler: _ObjectStorageService_ListObjects_Handler, + }, + { + MethodName: "GetObjectAcl", + Handler: _ObjectStorageService_GetObjectAcl_Handler, + }, + { + MethodName: "PutObjectAcl", + Handler: _ObjectStorageService_PutObjectAcl_Handler, + }, + { + MethodName: "RestoreObject", + Handler: _ObjectStorageService_RestoreObject_Handler, + }, + { + MethodName: "CreateMultipartUpload", + Handler: _ObjectStorageService_CreateMultipartUpload_Handler, + }, + { + MethodName: "UploadPartCopy", + Handler: _ObjectStorageService_UploadPartCopy_Handler, + }, + { + MethodName: "CompleteMultipartUpload", + Handler: _ObjectStorageService_CompleteMultipartUpload_Handler, + }, + { + MethodName: "AbortMultipartUpload", + Handler: _ObjectStorageService_AbortMultipartUpload_Handler, + }, + { + MethodName: "ListMultipartUploads", + Handler: _ObjectStorageService_ListMultipartUploads_Handler, + }, + { + MethodName: "ListObjectVersions", + Handler: _ObjectStorageService_ListObjectVersions_Handler, + }, + { + MethodName: "HeadObject", + Handler: _ObjectStorageService_HeadObject_Handler, + }, + { + MethodName: "IsObjectExist", + Handler: _ObjectStorageService_IsObjectExist_Handler, + }, + { + MethodName: "SignURL", + Handler: _ObjectStorageService_SignURL_Handler, + }, + { + MethodName: "UpdateDownLoadBandwidthRateLimit", + Handler: _ObjectStorageService_UpdateDownLoadBandwidthRateLimit_Handler, + }, + { + MethodName: "UpdateUpLoadBandwidthRateLimit", + Handler: _ObjectStorageService_UpdateUpLoadBandwidthRateLimit_Handler, + }, + { + MethodName: "ListParts", + Handler: _ObjectStorageService_ListParts_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "PutObject", + Handler: _ObjectStorageService_PutObject_Handler, + ClientStreams: true, + }, + { + StreamName: "GetObject", + Handler: _ObjectStorageService_GetObject_Handler, + ServerStreams: true, + }, + { + StreamName: "UploadPart", + Handler: _ObjectStorageService_UploadPart_Handler, + ClientStreams: true, + }, + { + StreamName: "AppendObject", + Handler: _ObjectStorageService_AppendObject_Handler, + ClientStreams: true, + }, + }, + Metadata: "oss.proto", +} From df10d48057389606dd6718170da5a90cfe1a6e05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Thu, 16 Jun 2022 17:31:40 +0800 Subject: [PATCH 033/126] fix format error --- spec/proto/extension/v1/oss.pb.go | 5 +++-- spec/proto/extension/v1/oss_grpc.pb.go | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/spec/proto/extension/v1/oss.pb.go b/spec/proto/extension/v1/oss.pb.go index 04d828fc58..e571dc7172 100644 --- a/spec/proto/extension/v1/oss.pb.go +++ b/spec/proto/extension/v1/oss.pb.go @@ -11,12 +11,13 @@ package s3 import ( + reflect "reflect" + sync "sync" + proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" - reflect "reflect" - sync "sync" ) const ( diff --git a/spec/proto/extension/v1/oss_grpc.pb.go b/spec/proto/extension/v1/oss_grpc.pb.go index 79fc45eda6..c2edc2dd32 100644 --- a/spec/proto/extension/v1/oss_grpc.pb.go +++ b/spec/proto/extension/v1/oss_grpc.pb.go @@ -4,6 +4,7 @@ package s3 import ( context "context" + grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" From b42c079f136b2f583e9b16119f8150ce5f1a111a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Thu, 16 Jun 2022 17:39:28 +0800 Subject: [PATCH 034/126] fix s3 demo --- demo/file/s3/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/file/s3/client.go b/demo/file/s3/client.go index dbfcf07ab3..506adf3691 100644 --- a/demo/file/s3/client.go +++ b/demo/file/s3/client.go @@ -149,7 +149,7 @@ func TestTagging() { return } c := s3.NewObjectStorageServiceClient(conn) - req := &s3.PutBucketTaggingInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "王文学.jpg", Tags: map[string]string{"Abc": "123", "Def": "456"}} + req := &s3.PutObjectTaggingInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "王文学.jpg", Tags: map[string]string{"Abc": "123", "Def": "456"}} _, err = c.PutObjectTagging(context.Background(), req) if err != nil { fmt.Printf("PutObjectTagging fail, err: %+v \n", err) From c8a1cd9d04eb8ad070188052e16dd5010f2e15f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Fri, 17 Jun 2022 11:19:56 +0800 Subject: [PATCH 035/126] Modify the corresponding relationship between bucket and endpoint --- components/file/aliyun/file.go | 40 ++++++++------- components/file/aliyun/file_test.go | 2 +- components/file/aliyun/oss.go | 76 +++++++++++++++-------------- components/file/aliyun/oss_test.go | 30 ++++++++++++ configs/config_file.json | 11 ++++- 5 files changed, 103 insertions(+), 56 deletions(-) diff --git a/components/file/aliyun/file.go b/components/file/aliyun/file.go index 24f1b9d479..fb0b23679c 100644 --- a/components/file/aliyun/file.go +++ b/components/file/aliyun/file.go @@ -19,6 +19,7 @@ package aliyun import ( "context" "encoding/json" + "errors" "fmt" "io" "strconv" @@ -37,21 +38,21 @@ const ( // AliyunOSS is a binding for an AliCloud OSS storage bucketKey type AliyunOSS struct { - metadata map[string]*OssMetadata - client map[string]*oss.Client - method string - rawData json.RawMessage + client map[string]*oss.Client + method string + rawData json.RawMessage } type OssMetadata struct { - Endpoint string `json:"endpoint"` - AccessKeyID string `json:"accessKeyID"` - AccessKeySecret string `json:"accessKeySecret"` - Region string `json:"region"` + Buckets []string `json:"buckets"` + Endpoint string `json:"endpoint"` + AccessKeyID string `json:"accessKeyID"` + AccessKeySecret string `json:"accessKeySecret"` + Region string `json:"region"` } func NewAliCloudFile() file.File { - oss := &AliyunOSS{metadata: make(map[string]*OssMetadata), client: make(map[string]*oss.Client)} + oss := &AliyunOSS{client: make(map[string]*oss.Client)} return oss } @@ -71,8 +72,13 @@ func (s *AliyunOSS) Init(ctx context.Context, metadata *file.FileConfig) error { if err != nil { return err } - s.metadata[v.Endpoint] = v - s.client[v.Endpoint] = client + //use bucket as key, client as value + for _, bucketName := range v.Buckets { + if _, ok := s.client[bucketName]; ok { + return errors.New("incorrect configuration, bucketName must be unique") + } + s.client[bucketName] = client + } } return nil } @@ -217,7 +223,7 @@ func (s *AliyunOSS) getBucket(fileName string, metaData map[string]string) (*oss ossClient = s.client[endpointKey] } else { // if user not specify endpoint, try to use default client - ossClient, err = s.selectClient(map[string]string{}, "") + ossClient, err = s.selectClient("") if err != nil { return nil, err } @@ -235,12 +241,10 @@ func (s *AliyunOSS) getBucket(fileName string, metaData map[string]string) (*oss return bucket, nil } -func (s *AliyunOSS) selectClient(meta map[string]string, key string) (*oss.Client, error) { - // exist specific client with key endpoint - if ep, ok := meta[key]; ok { - if client, ok := s.client[ep]; ok { - return client, nil - } +func (s *AliyunOSS) selectClient(bucket string) (*oss.Client, error) { + + if client, ok := s.client[bucket]; ok { + return client, nil } // if not specify endpoint, select default one if len(s.client) == 1 { diff --git a/components/file/aliyun/file_test.go b/components/file/aliyun/file_test.go index 9c0dda83e6..c50ba34256 100644 --- a/components/file/aliyun/file_test.go +++ b/components/file/aliyun/file_test.go @@ -50,7 +50,7 @@ func TestInit(t *testing.T) { } func TestSelectClient(t *testing.T) { - ossObject := &AliyunOSS{metadata: make(map[string]*OssMetadata), client: make(map[string]*oss.Client)} + ossObject := &AliyunOSS{client: make(map[string]*oss.Client)} client, err := ossObject.selectClient(map[string]string{}, "") assert.Equal(t, err.Error(), "should specific endpoint in metadata") diff --git a/components/file/aliyun/oss.go b/components/file/aliyun/oss.go index b509417d48..5203d74116 100644 --- a/components/file/aliyun/oss.go +++ b/components/file/aliyun/oss.go @@ -19,6 +19,7 @@ package aliyun import ( "context" "encoding/json" + "errors" "net/http" "github.com/aliyun/aliyun-oss-go-sdk/oss" @@ -33,8 +34,7 @@ const ( func NewAliyunOss() file.Oss { return &AliyunOSS{ - client: make(map[string]*oss.Client), - metadata: make(map[string]*OssMetadata), + client: make(map[string]*oss.Client), } } @@ -49,13 +49,17 @@ func AliyunDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string if err != nil { return nil, file.ErrInvalid } - for _, v := range m { client, err := oss.New(v.Endpoint, v.AccessKeyID, v.AccessKeySecret) if err != nil { return nil, err } - clients[v.Endpoint] = client + for _, bucketName := range v.Buckets { + if _, ok := clients[bucketName]; ok { + return nil, errors.New("incorrect configuration, bucketName must be unique") + } + clients[bucketName] = client + } } return clients, nil } @@ -82,7 +86,7 @@ func (a *AliyunOSS) InitClient(ctx context.Context, req *file.InitRequest) error } func (a *AliyunOSS) GetObject(ctx context.Context, req *file.GetObjectInput) (*file.GetObjectOutput, error) { - client, err := a.selectClient(map[string]string{}, "") + client, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -108,7 +112,7 @@ func (a *AliyunOSS) GetObject(ctx context.Context, req *file.GetObjectInput) (*f } func (a *AliyunOSS) PutObject(ctx context.Context, req *file.PutObjectInput) (*file.PutObjectOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -142,7 +146,7 @@ func (a *AliyunOSS) PutObject(ctx context.Context, req *file.PutObjectInput) (*f } func (a *AliyunOSS) DeleteObject(ctx context.Context, req *file.DeleteObjectInput) (*file.DeleteObjectOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -154,7 +158,7 @@ func (a *AliyunOSS) DeleteObject(ctx context.Context, req *file.DeleteObjectInpu return &file.DeleteObjectOutput{}, err } func (a *AliyunOSS) DeleteObjects(ctx context.Context, req *file.DeleteObjectsInput) (*file.DeleteObjectsOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -180,7 +184,7 @@ func (a *AliyunOSS) DeleteObjects(ctx context.Context, req *file.DeleteObjectsIn } func (a *AliyunOSS) PutObjectTagging(ctx context.Context, req *file.PutObjectTaggingInput) (*file.PutObjectTaggingOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -198,7 +202,7 @@ func (a *AliyunOSS) PutObjectTagging(ctx context.Context, req *file.PutObjectTag } func (a *AliyunOSS) DeleteObjectTagging(ctx context.Context, req *file.DeleteObjectTaggingInput) (*file.DeleteObjectTaggingOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -211,7 +215,7 @@ func (a *AliyunOSS) DeleteObjectTagging(ctx context.Context, req *file.DeleteObj } func (a *AliyunOSS) GetObjectTagging(ctx context.Context, req *file.GetObjectTaggingInput) (*file.GetObjectTaggingOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -231,7 +235,7 @@ func (a *AliyunOSS) GetObjectTagging(ctx context.Context, req *file.GetObjectTag } func (a *AliyunOSS) GetObjectAcl(ctx context.Context, req *file.GetObjectAclInput) (*file.GetObjectAclOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -249,7 +253,7 @@ func (a *AliyunOSS) GetObjectAcl(ctx context.Context, req *file.GetObjectAclInpu return output, err } func (a *AliyunOSS) PutObjectAcl(ctx context.Context, req *file.PutObjectAclInput) (*file.PutObjectAclOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -262,7 +266,7 @@ func (a *AliyunOSS) PutObjectAcl(ctx context.Context, req *file.PutObjectAclInpu return output, err } func (a *AliyunOSS) ListObjects(ctx context.Context, req *file.ListObjectsInput) (*file.ListObjectsOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -297,7 +301,7 @@ func (a *AliyunOSS) ListObjects(ctx context.Context, req *file.ListObjectsInput) return out, nil } func (a *AliyunOSS) CopyObject(ctx context.Context, req *file.CopyObjectInput) (*file.CopyObjectOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -321,7 +325,7 @@ func (a *AliyunOSS) CopyObject(ctx context.Context, req *file.CopyObjectInput) ( } func (a *AliyunOSS) CreateMultipartUpload(ctx context.Context, req *file.CreateMultipartUploadInput) (*file.CreateMultipartUploadOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -334,7 +338,7 @@ func (a *AliyunOSS) CreateMultipartUpload(ctx context.Context, req *file.CreateM return output, err } func (a *AliyunOSS) UploadPart(ctx context.Context, req *file.UploadPartInput) (*file.UploadPartOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -351,7 +355,7 @@ func (a *AliyunOSS) UploadPart(ctx context.Context, req *file.UploadPartInput) ( return output, err } func (a *AliyunOSS) UploadPartCopy(ctx context.Context, req *file.UploadPartCopyInput) (*file.UploadPartCopyOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -372,7 +376,7 @@ func (a *AliyunOSS) UploadPartCopy(ctx context.Context, req *file.UploadPartCopy return output, err } func (a *AliyunOSS) CompleteMultipartUpload(ctx context.Context, req *file.CompleteMultipartUploadInput) (*file.CompleteMultipartUploadOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -396,7 +400,7 @@ func (a *AliyunOSS) CompleteMultipartUpload(ctx context.Context, req *file.Compl return output, err } func (a *AliyunOSS) AbortMultipartUpload(ctx context.Context, req *file.AbortMultipartUploadInput) (*file.AbortMultipartUploadOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -412,7 +416,7 @@ func (a *AliyunOSS) AbortMultipartUpload(ctx context.Context, req *file.AbortMul return output, err } func (a *AliyunOSS) ListMultipartUploads(ctx context.Context, req *file.ListMultipartUploadsInput) (*file.ListMultipartUploadsOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -441,7 +445,7 @@ func (a *AliyunOSS) ListMultipartUploads(ctx context.Context, req *file.ListMult } func (a *AliyunOSS) RestoreObject(ctx context.Context, req *file.RestoreObjectInput) (*file.RestoreObjectOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -455,7 +459,7 @@ func (a *AliyunOSS) RestoreObject(ctx context.Context, req *file.RestoreObjectIn } func (a *AliyunOSS) ListObjectVersions(ctx context.Context, req *file.ListObjectVersionsInput) (*file.ListObjectVersionsOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -511,7 +515,7 @@ func (a *AliyunOSS) ListObjectVersions(ctx context.Context, req *file.ListObject } func (a *AliyunOSS) HeadObject(ctx context.Context, req *file.HeadObjectInput) (*file.HeadObjectOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -543,7 +547,7 @@ func (a *AliyunOSS) HeadObject(ctx context.Context, req *file.HeadObjectInput) ( } func (a *AliyunOSS) IsObjectExist(ctx context.Context, req *file.IsObjectExistInput) (*file.IsObjectExistOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -556,7 +560,7 @@ func (a *AliyunOSS) IsObjectExist(ctx context.Context, req *file.IsObjectExistIn } func (a *AliyunOSS) SignURL(ctx context.Context, req *file.SignURLInput) (*file.SignURLOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -568,26 +572,26 @@ func (a *AliyunOSS) SignURL(ctx context.Context, req *file.SignURLInput) (*file. return &file.SignURLOutput{SignedUrl: resp}, err } +//UpdateDownLoadBandwidthRateLimit update all client rate func (a *AliyunOSS) UpdateDownLoadBandwidthRateLimit(ctx context.Context, req *file.UpdateBandwidthRateLimitInput) error { - cli, err := a.selectClient(map[string]string{}, endpointKey) - if err != nil { + for _, cli := range a.client { + err := cli.LimitDownloadSpeed(int(req.AverageRateLimitInBitsPerSec)) return err } - err = cli.LimitDownloadSpeed(int(req.AverageRateLimitInBitsPerSec)) - return err + return nil } +//UpdateUpLoadBandwidthRateLimit update all client rate func (a *AliyunOSS) UpdateUpLoadBandwidthRateLimit(ctx context.Context, req *file.UpdateBandwidthRateLimitInput) error { - cli, err := a.selectClient(map[string]string{}, endpointKey) - if err != nil { + for _, cli := range a.client { + err := cli.LimitUploadSpeed(int(req.AverageRateLimitInBitsPerSec)) return err } - err = cli.LimitUploadSpeed(int(req.AverageRateLimitInBitsPerSec)) - return err + return nil } func (a *AliyunOSS) AppendObject(ctx context.Context, req *file.AppendObjectInput) (*file.AppendObjectOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -610,7 +614,7 @@ func (a *AliyunOSS) AppendObject(ctx context.Context, req *file.AppendObjectInpu } func (a *AliyunOSS) ListParts(ctx context.Context, req *file.ListPartsInput) (*file.ListPartsOutput, error) { - cli, err := a.selectClient(map[string]string{}, endpointKey) + cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err } diff --git a/components/file/aliyun/oss_test.go b/components/file/aliyun/oss_test.go index bc0559e84a..bf79928d6e 100644 --- a/components/file/aliyun/oss_test.go +++ b/components/file/aliyun/oss_test.go @@ -15,3 +15,33 @@ */ package aliyun + +import ( + "testing" + + "mosn.io/layotto/components/file" + + "github.com/stretchr/testify/assert" + + "mosn.io/layotto/components/file/factory" +) + +const ( + conf = `[ + { + "endpoint": "endpoint_address", + "accessKeyID": "accessKey", + "accessKeySecret": "secret" + } + ]` +) + +func TestInitAliyunOss(t *testing.T) { + NewAliyunOss() + f := factory.GetInitFunc(DefaultClientInitFunc) + assert.Equal(t, f, AliyunDefaultInitFunc) + clients, err := f([]byte("hello"), map[string]string{}) + assert.Equal(t, err, file.ErrInvalid) + assert.Equal(t, nil, clients) + //oss.InitConfig(context.TODO(), file.FileConfig{}) +} diff --git a/configs/config_file.json b/configs/config_file.json index 5fd286d94f..a50038617f 100644 --- a/configs/config_file.json +++ b/configs/config_file.json @@ -27,11 +27,20 @@ "type": "aliyunOSS", "metadata": [ { - "endpoint": "127.0.0.1:9000", + "buckets" : ["bucket1","bucket2"], + "endpoint": "aliyun1", "accessKeyID": "layotto", "accessKeySecret": "layotto_secret", "SSL":false, "region":"us-east-1" + }, + { + "buckets" : ["bucket1","bucket2"], + "endpoint": "aliyun2", + "accessKeyID": "layotto", + "accessKeySecret": "layotto_secret", + "SSL":false, + "region":"us-east-2" } ] } From 7ec627dbdebc2b8b764c8adbcfcd6fdba7b97ec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Fri, 17 Jun 2022 11:32:50 +0800 Subject: [PATCH 036/126] add uid for oss configure --- components/file/aliyun/file.go | 4 ++-- components/file/aliyun/oss.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/file/aliyun/file.go b/components/file/aliyun/file.go index fb0b23679c..a73ae0b10b 100644 --- a/components/file/aliyun/file.go +++ b/components/file/aliyun/file.go @@ -44,7 +44,8 @@ type AliyunOSS struct { } type OssMetadata struct { - Buckets []string `json:"buckets"` + Buckets []string `json:"buckets"` // contained buckets in this oss client + Uid string `json:"uid"` // specify the uid of oss client Endpoint string `json:"endpoint"` AccessKeyID string `json:"accessKeyID"` AccessKeySecret string `json:"accessKeySecret"` @@ -242,7 +243,6 @@ func (s *AliyunOSS) getBucket(fileName string, metaData map[string]string) (*oss } func (s *AliyunOSS) selectClient(bucket string) (*oss.Client, error) { - if client, ok := s.client[bucket]; ok { return client, nil } diff --git a/components/file/aliyun/oss.go b/components/file/aliyun/oss.go index 5203d74116..6cd83c0513 100644 --- a/components/file/aliyun/oss.go +++ b/components/file/aliyun/oss.go @@ -54,11 +54,11 @@ func AliyunDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string if err != nil { return nil, err } + clients[v.Uid] = client for _, bucketName := range v.Buckets { if _, ok := clients[bucketName]; ok { return nil, errors.New("incorrect configuration, bucketName must be unique") } - clients[bucketName] = client } } return clients, nil From ad03e9251def9a576ebd4dac4354e6c9cab23d92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Fri, 17 Jun 2022 12:21:43 +0800 Subject: [PATCH 037/126] add range option for getobject --- components/file/aliyun/option.go | 8 ++++++++ components/file/aliyun/oss.go | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/components/file/aliyun/option.go b/components/file/aliyun/option.go index 35095cb5d3..0dc44e5751 100644 --- a/components/file/aliyun/option.go +++ b/components/file/aliyun/option.go @@ -194,6 +194,14 @@ func IfNoneMatch(value string) oss.Option { return oss.IfNoneMatch(value) } +// Range is an option to set Range header, [start, end] +func Range(start, end int64) oss.Option { + if start == 0 && end == 0 { + return nil + } + return oss.Range(start, end) +} + // CopySourceIfMatch is an option to set X-Oss-Copy-Source-If-Match header func CopySourceIfMatch(value string) oss.Option { if value == "" { diff --git a/components/file/aliyun/oss.go b/components/file/aliyun/oss.go index 6cd83c0513..03299e6ef3 100644 --- a/components/file/aliyun/oss.go +++ b/components/file/aliyun/oss.go @@ -104,7 +104,7 @@ func (a *AliyunOSS) GetObject(ctx context.Context, req *file.GetObjectInput) (*f IfModifiedSince(req.IfModifiedSince), IfMatch(req.IfMatch), IfNoneMatch(req.IfNoneMatch), - oss.Range(req.Start, req.End), + Range(req.Start, req.End), AcceptEncoding(req.AcceptEncoding), ) From 3763e2c7882456b89ddbe65b6bc26a804df4739a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 21 Jun 2022 21:14:11 +0800 Subject: [PATCH 038/126] add option for aws --- components/file/aws/option.go | 19 ++++++++++++++++++ components/file/aws/oss.go | 34 +++++++++++++++++++++------------ components/file/aws/oss_test.go | 31 ++++++++++++++++++++++++++++++ pkg/runtime/options_test.go | 2 ++ 4 files changed, 74 insertions(+), 12 deletions(-) create mode 100644 components/file/aws/option.go diff --git a/components/file/aws/option.go b/components/file/aws/option.go new file mode 100644 index 0000000000..b55604f27f --- /dev/null +++ b/components/file/aws/option.go @@ -0,0 +1,19 @@ +package aws + +import "github.com/jinzhu/copier" + +var str = "'" +var ( + str2point = copier.TypeConverter{ + SrcType: copier.String, + DstType: &str, + Fn: func(src interface{}) (interface{}, error) { + s, _ := src.(string) + // return nil on empty string + if s == "" { + return nil, nil + } + return &s, nil + }, + } +) diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index 812702424a..5cfcd2fbac 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -98,19 +98,26 @@ func (a *AwsOss) InitClient(ctx context.Context, req *file.InitRequest) error { } func (a *AwsOss) GetObject(ctx context.Context, req *file.GetObjectInput) (*file.GetObjectOutput, error) { - input := &s3.GetObjectInput{ - Bucket: &req.Bucket, - Key: &req.Key, - } + input := &s3.GetObjectInput{} client, err := a.selectClient(map[string]string{}, "") if err != nil { return nil, err } + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + if err != nil { + return nil, err + } ob, err := client.GetObject(context.TODO(), input) if err != nil { return nil, err } - return &file.GetObjectOutput{DataStream: ob.Body}, nil + out := &file.GetObjectOutput{} + err = copier.Copy(out, ob) + if err != nil { + return nil, err + } + out.DataStream = ob.Body + return out, nil } func (a *AwsOss) PutObject(ctx context.Context, req *file.PutObjectInput) (*file.PutObjectOutput, error) { @@ -118,16 +125,19 @@ func (a *AwsOss) PutObject(ctx context.Context, req *file.PutObjectInput) (*file if err != nil { return nil, err } + input := &s3.PutObjectInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) uploader := manager.NewUploader(client) - resp, err := uploader.Upload(context.TODO(), &s3.PutObjectInput{ - Bucket: &req.Bucket, - Key: &req.Key, - Body: req.DataStream, - }) + resp, err := uploader.Upload(context.TODO(), input) if err != nil { return nil, err } - return &file.PutObjectOutput{BucketKeyEnabled: resp.BucketKeyEnabled, ETag: *resp.ETag}, err + out := &file.PutObjectOutput{} + err = copier.Copy(out, resp) + if err != nil { + return nil, err + } + return out, err } func (a *AwsOss) DeleteObject(ctx context.Context, req *file.DeleteObjectInput) (*file.DeleteObjectOutput, error) { @@ -638,5 +648,5 @@ func (a *AwsOss) AppendObject(ctx context.Context, req *file.AppendObjectInput) } func (a *AwsOss) ListParts(ctx context.Context, req *file.ListPartsInput) (*file.ListPartsOutput, error) { - return nil, nil + return nil, errors.New("ListParts not supported on AWS") } diff --git a/components/file/aws/oss_test.go b/components/file/aws/oss_test.go index 49c1838f5e..affe915cb4 100644 --- a/components/file/aws/oss_test.go +++ b/components/file/aws/oss_test.go @@ -15,3 +15,34 @@ */ package aws + +import ( + "testing" + + "github.com/jinzhu/copier" +) + +func TestCopyWithConverterStrToStrPointer(t *testing.T) { + type SrcStruct struct { + Field1 string + } + + type DestStruct struct { + Field1 *string + } + + src := SrcStruct{} + + var dst DestStruct + + err := copier.Copy(&src, &dst) + + if err != nil { + t.Fatalf(`Should be able to copy from src to dst object. %v`, err) + return + } + + if src.Field1 != "" { + t.Fatalf("got %q, wanted nil", src.Field1) + } +} diff --git a/pkg/runtime/options_test.go b/pkg/runtime/options_test.go index 62af28c0f8..d5593676ae 100644 --- a/pkg/runtime/options_test.go +++ b/pkg/runtime/options_test.go @@ -22,6 +22,8 @@ import ( "github.com/stretchr/testify/assert" ) +var haha map[string]string + func TestWithErrInterceptor(t *testing.T) { cnt := 0 var f ErrInterceptor = func(err error, format string, args ...interface{}) { From 2cf7a82efd83eb262ce8c4f8bdf0ac36b683faf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 27 Jun 2022 14:14:24 +0800 Subject: [PATCH 039/126] fix aws implement --- components/file/aliyun/file.go | 15 +- components/file/aliyun/oss.go | 6 +- components/file/aws/file.go | 56 ++-- components/file/aws/file_test.go | 29 +- components/file/aws/option.go | 30 +- components/file/aws/oss.go | 418 ++++++++++++++------------- components/file/aws/oss_test.go | 19 +- components/file/{s3def.go => oss.go} | 15 +- components/file/types.go | 10 + demo/file/s3/client.go | 104 +++++-- 10 files changed, 395 insertions(+), 307 deletions(-) rename components/file/{s3def.go => oss.go} (98%) diff --git a/components/file/aliyun/file.go b/components/file/aliyun/file.go index a73ae0b10b..e0e59760ad 100644 --- a/components/file/aliyun/file.go +++ b/components/file/aliyun/file.go @@ -43,15 +43,6 @@ type AliyunOSS struct { rawData json.RawMessage } -type OssMetadata struct { - Buckets []string `json:"buckets"` // contained buckets in this oss client - Uid string `json:"uid"` // specify the uid of oss client - Endpoint string `json:"endpoint"` - AccessKeyID string `json:"accessKeyID"` - AccessKeySecret string `json:"accessKeySecret"` - Region string `json:"region"` -} - func NewAliCloudFile() file.File { oss := &AliyunOSS{client: make(map[string]*oss.Client)} return oss @@ -59,7 +50,7 @@ func NewAliCloudFile() file.File { // Init does metadata parsing and connection creation func (s *AliyunOSS) Init(ctx context.Context, metadata *file.FileConfig) error { - m := make([]*OssMetadata, 0) + m := make([]*file.OssMetadata, 0) err := json.Unmarshal(metadata.Metadata, &m) if err != nil { return file.ErrInvalid @@ -201,14 +192,14 @@ func (s *AliyunOSS) Stat(ctx context.Context, request *file.FileMetaRequest) (*f return resp, nil } -func (s *AliyunOSS) checkMetadata(m *OssMetadata) bool { +func (s *AliyunOSS) checkMetadata(m *file.OssMetadata) bool { if m.AccessKeySecret == "" || m.Endpoint == "" || m.AccessKeyID == "" { return false } return true } -func (s *AliyunOSS) getClient(metadata *OssMetadata) (*oss.Client, error) { +func (s *AliyunOSS) getClient(metadata *file.OssMetadata) (*oss.Client, error) { client, err := oss.New(metadata.Endpoint, metadata.AccessKeyID, metadata.AccessKeySecret) if err != nil { return nil, err diff --git a/components/file/aliyun/oss.go b/components/file/aliyun/oss.go index 03299e6ef3..314dae1f2a 100644 --- a/components/file/aliyun/oss.go +++ b/components/file/aliyun/oss.go @@ -19,7 +19,6 @@ package aliyun import ( "context" "encoding/json" - "errors" "net/http" "github.com/aliyun/aliyun-oss-go-sdk/oss" @@ -43,7 +42,7 @@ func init() { } func AliyunDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string) (map[string]interface{}, error) { - m := make([]*OssMetadata, 0) + m := make([]*file.OssMetadata, 0) clients := make(map[string]interface{}) err := json.Unmarshal(staticConf, &m) if err != nil { @@ -57,8 +56,9 @@ func AliyunDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string clients[v.Uid] = client for _, bucketName := range v.Buckets { if _, ok := clients[bucketName]; ok { - return nil, errors.New("incorrect configuration, bucketName must be unique") + continue } + clients[bucketName] = client } } return clients, nil diff --git a/components/file/aws/file.go b/components/file/aws/file.go index ef6be49496..25e4e7227e 100644 --- a/components/file/aws/file.go +++ b/components/file/aws/file.go @@ -42,62 +42,59 @@ const ( // AwsOss is a binding for aws oss storage. type AwsOss struct { client map[string]*s3.Client - meta map[string]*AwsOssMetaData + meta map[string]*file.OssMetadata method string rawData json.RawMessage } -// AwsOssMetaData describe a aws-oss instance. -type AwsOssMetaData struct { - Region string `json:"region"` // eg. us-west-2 - EndPoint string `json:"endpoint"` // eg. protocol://service-code.region-code.amazonaws.com - AccessKeyID string `json:"accessKeyID"` - AccessKeySecret string `json:"accessKeySecret"` -} - func NewAwsFile() file.File { return &AwsOss{ client: make(map[string]*s3.Client), - meta: make(map[string]*AwsOssMetaData), + meta: make(map[string]*file.OssMetadata), } } // Init instance by config. func (a *AwsOss) Init(ctx context.Context, config *file.FileConfig) error { - m := make([]*AwsOssMetaData, 0) + m := make([]*file.OssMetadata, 0) err := json.Unmarshal(config.Metadata, &m) if err != nil { return errors.New("invalid config for aws oss") } for _, data := range m { - if !data.isAwsMetaValid() { + if !a.isAwsMetaValid(data) { return errors.New("invalid config for aws oss") } client, err := a.createOssClient(data) if err != nil { continue } - a.client[data.EndPoint] = client - a.meta[data.EndPoint] = data + //use bucket as key, client as value + for _, bucketName := range data.Buckets { + if _, ok := a.client[bucketName]; ok { + return errors.New("incorrect configuration, bucketName must be unique") + } + a.client[bucketName] = client + } } return nil } // isAwsMetaValid check if the metadata valid. -func (am *AwsOssMetaData) isAwsMetaValid() bool { - if am.AccessKeySecret == "" || am.EndPoint == "" || am.AccessKeyID == "" { +func (a *AwsOss) isAwsMetaValid(v *file.OssMetadata) bool { + if v.AccessKeySecret == "" || v.Endpoint == "" || v.AccessKeyID == "" { return false } return true } // createOssClient by input meta info. -func (a *AwsOss) createOssClient(meta *AwsOssMetaData) (*s3.Client, error) { +func (a *AwsOss) createOssClient(meta *file.OssMetadata) (*s3.Client, error) { customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) { if region == meta.Region { return aws.Endpoint{ PartitionID: "awsoss", - URL: "https://" + meta.EndPoint, + URL: "https://" + meta.Endpoint, SigningRegion: meta.Region, HostnameImmutable: true, }, nil @@ -135,7 +132,7 @@ func (a *AwsOss) Put(ctx context.Context, st *file.PutFileStu) error { if err != nil { return fmt.Errorf("awsoss put file[%s] fail,err: %s", st.FileName, err.Error()) } - client, err := a.selectClient(st.Metadata, endpointKey) + client, err := a.selectClient(bucket) if err != nil { return err } @@ -153,16 +150,13 @@ func (a *AwsOss) Put(ctx context.Context, st *file.PutFileStu) error { } // selectClient choose aws client from exist client-map, key is endpoint, value is client instance. -func (a *AwsOss) selectClient(meta map[string]string, key string) (*s3.Client, error) { - // exist specific client with key endpoint - if ep, ok := meta[key]; ok { - if client, ok := a.client[ep]; ok { - return client, nil - } +func (s *AwsOss) selectClient(bucket string) (*s3.Client, error) { + if client, ok := s.client[bucket]; ok { + return client, nil } // if not specify endpoint, select default one - if len(a.client) == 1 { - for _, client := range a.client { + if len(s.client) == 1 { + for _, client := range s.client { return client, nil } } @@ -183,7 +177,7 @@ func (a *AwsOss) Get(ctx context.Context, st *file.GetFileStu) (io.ReadCloser, e Bucket: &bucket, Key: &key, } - client, err := a.selectClient(st.Metadata, endpointKey) + client, err := a.selectClient(bucket) if err != nil { return nil, err } @@ -207,7 +201,7 @@ func (a *AwsOss) List(ctx context.Context, st *file.ListRequest) (*file.ListResp Marker: &st.Marker, Prefix: &prefix, } - client, err := a.selectClient(st.Metadata, endpointKey) + client, err := a.selectClient(bucket) if err != nil { return nil, fmt.Errorf("list bucket[%s] fail, err: %s", st.DirectoryName, err.Error()) } @@ -244,7 +238,7 @@ func (a *AwsOss) Del(ctx context.Context, st *file.DelRequest) error { Bucket: &bucket, Key: &key, } - client, err := a.selectClient(st.Metadata, endpointKey) + client, err := a.selectClient(bucket) if err != nil { return err } @@ -267,7 +261,7 @@ func (a *AwsOss) Stat(ctx context.Context, st *file.FileMetaRequest) (*file.File Bucket: &bucket, Key: &key, } - client, err := a.selectClient(st.Metadata, endpointKey) + client, err := a.selectClient(bucket) if err != nil { return nil, err } diff --git a/components/file/aws/file_test.go b/components/file/aws/file_test.go index 248737c742..d6828eb907 100644 --- a/components/file/aws/file_test.go +++ b/components/file/aws/file_test.go @@ -32,6 +32,7 @@ import ( const cfg = `[ { + "buckets":["bucket1"], "endpoint": "protocol://service-code.region-code.amazonaws.com", "accessKeyID": "accessKey", "accessKeySecret": "secret", @@ -50,41 +51,39 @@ func TestAwsOss_Init(t *testing.T) { func TestAwsOss_SelectClient(t *testing.T) { oss := &AwsOss{ client: make(map[string]*s3.Client), - meta: make(map[string]*AwsOssMetaData), + meta: make(map[string]*file.OssMetadata), } err := oss.Init(context.TODO(), &file.FileConfig{Metadata: []byte(cfg)}) assert.Equal(t, nil, err) // not specify endpoint, select default client - meta := map[string]string{} - _, err = oss.selectClient(meta, endpointKey) + _, err = oss.selectClient("bucket1") assert.Nil(t, err) // specify endpoint equal config - meta["endpoint"] = "protocol://service-code.region-code.amazonaws.com" - client, _ := oss.selectClient(meta, endpointKey) + client, _ := oss.selectClient("bucket1") assert.NotNil(t, client) // specicy not exist endpoint, select default one - meta["endpoint"] = "protocol://cn-northwest-1.region-code.amazonaws.com" - client, err = oss.selectClient(meta, endpointKey) + client, err = oss.selectClient("bucket1") assert.Nil(t, err) assert.NotNil(t, client) // new client with endpoint - oss.client["protocol://cn-northwest-1.region-code.amazonaws.com"] = &s3.Client{} - client, _ = oss.selectClient(meta, endpointKey) + oss.client["bucket2"] = &s3.Client{} + client, _ = oss.selectClient("bucket2") assert.NotNil(t, client) } func TestAwsOss_IsAwsMetaValid(t *testing.T) { - mt := &AwsOssMetaData{} - assert.False(t, mt.isAwsMetaValid()) + mt := &file.OssMetadata{} + a := AwsOss{} + assert.False(t, a.isAwsMetaValid(mt)) mt.AccessKeyID = "a" - assert.False(t, mt.isAwsMetaValid()) - mt.EndPoint = "a" - assert.False(t, mt.isAwsMetaValid()) + assert.False(t, a.isAwsMetaValid(mt)) + mt.Endpoint = "a" + assert.False(t, a.isAwsMetaValid(mt)) mt.AccessKeySecret = "a" - assert.True(t, mt.isAwsMetaValid()) + assert.True(t, a.isAwsMetaValid(mt)) } diff --git a/components/file/aws/option.go b/components/file/aws/option.go index b55604f27f..06eccbf86c 100644 --- a/components/file/aws/option.go +++ b/components/file/aws/option.go @@ -1,6 +1,11 @@ package aws -import "github.com/jinzhu/copier" +import ( + "errors" + "time" + + "github.com/jinzhu/copier" +) var str = "'" var ( @@ -16,4 +21,27 @@ var ( return &s, nil }, } + int642time = copier.TypeConverter{ + SrcType: int64(0), + DstType: &time.Time{}, + Fn: func(src interface{}) (interface{}, error) { + s, ok := src.(int64) + if !ok { + return nil, errors.New("src type not matching") + } + t := time.Unix(0, s) + return &t, nil + }, + } + time2int64 = copier.TypeConverter{ + SrcType: &time.Time{}, + DstType: int64(0), + Fn: func(src interface{}) (interface{}, error) { + s, ok := src.(*time.Time) + if !ok { + return nil, errors.New("src type not matching") + } + return s.Unix(), nil + }, + } ) diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index 5cfcd2fbac..f5705987bf 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -19,9 +19,12 @@ import ( "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" @@ -43,7 +46,7 @@ func init() { } func AwsDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string) (map[string]interface{}, error) { - m := make([]*AwsOssMetaData, 0) + m := make([]*file.OssMetadata, 0) err := json.Unmarshal(staticConf, &m) clients := make(map[string]interface{}) if err != nil { @@ -64,7 +67,14 @@ func AwsDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string) ( if err != nil { return nil, err } - clients[data.EndPoint] = s3.NewFromConfig(cfg) + client := s3.NewFromConfig(cfg) + clients[data.Uid] = client + for _, bucketName := range data.Buckets { + if _, ok := clients[bucketName]; ok { + continue + } + + } } return clients, nil } @@ -72,7 +82,7 @@ func AwsDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string) ( func NewAwsOss() file.Oss { return &AwsOss{ client: make(map[string]*s3.Client), - meta: make(map[string]*AwsOssMetaData), + meta: make(map[string]*file.OssMetadata), } } @@ -99,7 +109,7 @@ func (a *AwsOss) InitClient(ctx context.Context, req *file.InitRequest) error { func (a *AwsOss) GetObject(ctx context.Context, req *file.GetObjectInput) (*file.GetObjectOutput, error) { input := &s3.GetObjectInput{} - client, err := a.selectClient(map[string]string{}, "") + client, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -121,12 +131,16 @@ func (a *AwsOss) GetObject(ctx context.Context, req *file.GetObjectInput) (*file } func (a *AwsOss) PutObject(ctx context.Context, req *file.PutObjectInput) (*file.PutObjectOutput, error) { - client, err := a.selectClient(map[string]string{}, endpointKey) + client, err := a.selectClient(req.Bucket) if err != nil { return nil, err } input := &s3.PutObjectInput{} err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + if err != nil { + return nil, err + } + input.Body = req.DataStream uploader := manager.NewUploader(client) resp, err := uploader.Upload(context.TODO(), input) if err != nil { @@ -145,7 +159,7 @@ func (a *AwsOss) DeleteObject(ctx context.Context, req *file.DeleteObjectInput) Bucket: &req.Bucket, Key: &req.Key, } - client, err := a.selectClient(map[string]string{}, endpointKey) + client, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -157,17 +171,15 @@ func (a *AwsOss) DeleteObject(ctx context.Context, req *file.DeleteObjectInput) } func (a *AwsOss) PutObjectTagging(ctx context.Context, req *file.PutObjectTaggingInput) (*file.PutObjectTaggingOutput, error) { - client, err := a.selectClient(map[string]string{}, endpointKey) + client, err := a.selectClient(req.Bucket) if err != nil { return nil, err } - input := &s3.PutObjectTaggingInput{ - Bucket: &req.Bucket, - Key: &req.Key, - Tagging: &types.Tagging{}, - VersionId: &req.VersionId, + input := &s3.PutObjectTaggingInput{Tagging: &types.Tagging{}} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + 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}) @@ -176,13 +188,14 @@ func (a *AwsOss) PutObjectTagging(ctx context.Context, req *file.PutObjectTaggin return &file.PutObjectTaggingOutput{}, err } func (a *AwsOss) DeleteObjectTagging(ctx context.Context, req *file.DeleteObjectTaggingInput) (*file.DeleteObjectTaggingOutput, error) { - client, err := a.selectClient(map[string]string{}, endpointKey) + client, err := a.selectClient(req.Bucket) if err != nil { return nil, err } - input := &s3.DeleteObjectTaggingInput{ - Bucket: &req.Bucket, - Key: &req.Key, + input := &s3.DeleteObjectTaggingInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + if err != nil { + return nil, err } resp, err := client.DeleteObjectTagging(ctx, input) if err != nil { @@ -192,13 +205,14 @@ func (a *AwsOss) DeleteObjectTagging(ctx context.Context, req *file.DeleteObject } func (a *AwsOss) GetObjectTagging(ctx context.Context, req *file.GetObjectTaggingInput) (*file.GetObjectTaggingOutput, error) { - client, err := a.selectClient(map[string]string{}, endpointKey) + client, err := a.selectClient(req.Bucket) if err != nil { return nil, err } - input := &s3.GetObjectTaggingInput{ - Bucket: &req.Bucket, - Key: &req.Key, + input := &s3.GetObjectTaggingInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + if err != nil { + return nil, err } resp, err := client.GetObjectTagging(ctx, input) if err != nil { @@ -213,27 +227,29 @@ func (a *AwsOss) GetObjectTagging(ctx context.Context, req *file.GetObjectTaggin } func (a *AwsOss) CopyObject(ctx context.Context, req *file.CopyObjectInput) (*file.CopyObjectOutput, error) { - client, err := a.selectClient(map[string]string{}, endpointKey) + client, err := a.selectClient(req.Bucket) if err != nil { return nil, err } //TODO: should support objects accessed through access points - copySource := req.CopySource.CopySourceBucket + "/" + req.CopySource.CopySourceKey + "?versionId=" + req.CopySource.CopySourceVersionId + copySource := req.CopySource.CopySourceBucket + "/" + req.CopySource.CopySourceKey + if req.CopySource.CopySourceVersionId != "" { + copySource += "?versionId=" + req.CopySource.CopySourceVersionId + } input := &s3.CopyObjectInput{ Bucket: &req.Bucket, Key: &req.Key, CopySource: ©Source, } - _, err = client.CopyObject(ctx, input) + resp, err := client.CopyObject(ctx, input) if err != nil { return nil, err } - - return &file.CopyObjectOutput{}, err + return &file.CopyObjectOutput{CopyObjectResult: &file.CopyObjectResult{ETag: *resp.CopyObjectResult.ETag, LastModified: resp.CopyObjectResult.LastModified.Unix()}}, err } func (a *AwsOss) DeleteObjects(ctx context.Context, req *file.DeleteObjectsInput) (*file.DeleteObjectsOutput, error) { - client, err := a.selectClient(map[string]string{}, endpointKey) + client, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -242,52 +258,45 @@ func (a *AwsOss) DeleteObjects(ctx context.Context, req *file.DeleteObjectsInput Delete: &types.Delete{}, } for _, v := range req.Delete.Objects { - object := types.ObjectIdentifier{Key: &v.Key, VersionId: &v.VersionId} - input.Delete.Objects = append(input.Delete.Objects, object) + object := &types.ObjectIdentifier{} + err = copier.CopyWithOption(object, v, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + if err != nil { + return nil, err + } + input.Delete.Objects = append(input.Delete.Objects, *object) } - _, err = client.DeleteObjects(ctx, input) + resp, err := client.DeleteObjects(ctx, input) if err != nil { return nil, err } - return &file.DeleteObjectsOutput{}, err + output := &file.DeleteObjectsOutput{} + copier.Copy(output, resp) + return output, err } func (a *AwsOss) ListObjects(ctx context.Context, req *file.ListObjectsInput) (*file.ListObjectsOutput, error) { - client, err := a.selectClient(map[string]string{}, endpointKey) + client, err := a.selectClient(req.Bucket) if err != nil { return nil, err } - //input := &s3.ListObjectsInput{ - // Bucket: &req.Bucket, - // Delimiter: &req.Delimiter, - // EncodingType: types.EncodingType(req.EncodingType), - // ExpectedBucketOwner: &req.ExpectedBucketOwner, - // Marker: &req.Marker, - // MaxKeys: req.MaxKeys, - // Prefix: &req.Prefix, - // RequestPayer: types.RequestPayer(req.RequestPayer), - //} input := &s3.ListObjectsInput{} - copier.Copy(input, req) + err = copier.CopyWithOption( + input, + req, + copier.Option{ + IgnoreEmpty: true, + DeepCopy: true, + Converters: []copier.TypeConverter{str2point}, + }, + ) + if err != nil { + return nil, err + } resp, err := client.ListObjects(ctx, input) if err != nil { return nil, err } - - //output := &file.ListObjectsOutput{Delimiter: *(resp.Delimiter), EncodingType: string(resp.EncodingType), IsTruncated: resp.IsTruncated, Marker: *(resp.Marker), - // MaxKeys: resp.MaxKeys, Name: *(resp.Name), NextMarker: *(resp.NextMarker), Prefix: *(resp.Prefix), - //} - // - //for _, v := range resp.CommonPrefixes { - // output.CommonPrefixes = append(output.CommonPrefixes, *v.Prefix) - //} - // - //for _, v := range resp.Contents { - // object := &file.Object{Etag: *v.ETag, Key: *v.Key, Size: v.Size, StorageClass: string(v.StorageClass), Owner: &file.Owner{DisplayName: *v.Owner.DisplayName, ID: *v.Owner.ID}, LastModified: ×tamppb.Timestamp{Seconds: int64(v.LastModified.Second()), Nanos: int32(v.LastModified.Nanosecond())}} - // output.Contents = append(output.Contents, object) - //} output := &file.ListObjectsOutput{} - err = copier.CopyWithOption(output, resp, copier.Option{ IgnoreEmpty: true, DeepCopy: true, @@ -307,7 +316,7 @@ func (a *AwsOss) ListObjects(ctx context.Context, req *file.ListObjectsInput) (* return output, err } func (a *AwsOss) GetObjectAcl(ctx context.Context, req *file.GetObjectAclInput) (*file.GetObjectAclOutput, error) { - client, err := a.selectClient(map[string]string{}, endpointKey) + client, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -319,16 +328,22 @@ func (a *AwsOss) GetObjectAcl(ctx context.Context, req *file.GetObjectAclInput) if err != nil { return nil, err } - output := &file.GetObjectAclOutput{Owner: &file.Owner{}, RequestCharged: string(resp.RequestCharged)} + output := &file.GetObjectAclOutput{ + Owner: &file.Owner{DisplayName: *resp.Owner.DisplayName, ID: *resp.Owner.ID}, + RequestCharged: string(resp.RequestCharged), + } for _, v := range resp.Grants { - output.Grants = append(output.Grants, &file.Grant{Grantee: &file.Grantee{DisplayName: *v.Grantee.DisplayName, EmailAddress: *v.Grantee.DisplayName, - ID: *v.Grantee.ID, Type: string(v.Grantee.Type), URI: *v.Grantee.URI, - }, Permission: string(v.Permission)}) + grant := &file.Grant{} + grantee := &file.Grantee{} + copier.Copy(grantee, v.Grantee) + grant.Permission = string(v.Permission) + grant.Grantee = grantee + output.Grants = append(output.Grants, grant) } return output, err } func (a *AwsOss) PutObjectAcl(ctx context.Context, req *file.PutObjectAclInput) (*file.PutObjectAclOutput, error) { - client, err := a.selectClient(map[string]string{}, endpointKey) + client, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -344,7 +359,7 @@ func (a *AwsOss) PutObjectAcl(ctx context.Context, req *file.PutObjectAclInput) return &file.PutObjectAclOutput{RequestCharged: string(resp.RequestCharged)}, err } func (a *AwsOss) RestoreObject(ctx context.Context, req *file.RestoreObjectInput) (*file.RestoreObjectOutput, error) { - client, err := a.selectClient(map[string]string{}, endpointKey) + client, err := a.selectClient(req.Bucket) if err != nil { return nil, err } @@ -359,28 +374,20 @@ func (a *AwsOss) RestoreObject(ctx context.Context, req *file.RestoreObjectInput return &file.RestoreObjectOutput{RequestCharged: string(resp.RequestCharged), RestoreOutputPath: *resp.RestoreOutputPath}, err } func (a *AwsOss) CreateMultipartUpload(ctx context.Context, req *file.CreateMultipartUploadInput) (*file.CreateMultipartUploadOutput, error) { - client, err := a.selectClient(map[string]string{}, endpointKey) + client, err := a.selectClient(req.Bucket) if err != nil { return nil, err } input := &s3.CreateMultipartUploadInput{} - err = copier.CopyWithOption(input, req, copier.Option{ - IgnoreEmpty: true, - DeepCopy: true, - Converters: []copier.TypeConverter{ - { - SrcType: int64(0), - DstType: &time.Time{}, - Fn: func(src interface{}) (interface{}, error) { - s, ok := src.(int64) - if !ok { - return nil, errors.New("src type not matching") - } - t := time.Unix(0, s) - return &t, nil - }, - }, - }}) + 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 @@ -390,127 +397,105 @@ func (a *AwsOss) CreateMultipartUpload(ctx context.Context, req *file.CreateMult return nil, err } output := &file.CreateMultipartUploadOutput{} - copier.CopyWithOption(output, resp, copier.Option{ - IgnoreEmpty: true, - DeepCopy: true, - Converters: []copier.TypeConverter{ - { - SrcType: &time.Time{}, - DstType: int64(0), - Fn: func(src interface{}) (interface{}, error) { - s, ok := src.(*time.Time) - if !ok { - return nil, errors.New("src type not matching") - } - return s.Unix(), nil - }, - }, + copier.CopyWithOption( + output, + resp, + copier.Option{ + IgnoreEmpty: true, + DeepCopy: true, + Converters: []copier.TypeConverter{time2int64}, }, - }) + ) return output, err } func (a *AwsOss) UploadPart(ctx context.Context, req *file.UploadPartInput) (*file.UploadPartOutput, error) { - client, err := a.selectClient(map[string]string{}, endpointKey) + client, err := a.selectClient(req.Bucket) if err != nil { return nil, err } - input := &s3.UploadPartInput{ - Body: req.DataStream, - Bucket: &req.Bucket, - Key: &req.Key, - ContentLength: req.ContentLength, - ContentMD5: &req.ContentMd5, - ExpectedBucketOwner: &req.ExpectedBucketOwner, - PartNumber: req.PartNumber, - RequestPayer: types.RequestPayer(req.RequestPayer), - SSECustomerAlgorithm: &req.SseCustomerAlgorithm, - SSECustomerKey: &req.SseCustomerKey, - SSECustomerKeyMD5: &req.SseCustomerKeyMd5, - UploadId: &req.UploadId, + input := &s3.UploadPartInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + if err != nil { + return nil, err } - resp, err := client.UploadPart(ctx, input) + input.Body = req.DataStream + resp, err := client.UploadPart( + ctx, + input, + s3.WithAPIOptions( + v4.SwapComputePayloadSHA256ForUnsignedPayloadMiddleware, + ), + ) if err != nil { return nil, err } - output := &file.UploadPartOutput{BucketKeyEnabled: resp.BucketKeyEnabled, ETag: *resp.ETag, RequestCharged: string(resp.RequestCharged), - SseCustomerAlgorithm: *resp.SSECustomerAlgorithm, SseCustomerKeyMd5: *resp.SSECustomerKeyMD5, SseKmsKeyId: *resp.SSECustomerKeyMD5, - ServerSideEncryption: string(resp.ServerSideEncryption), + output := &file.UploadPartOutput{} + err = copier.Copy(output, resp) + if err != nil { + return nil, err } return output, err } func (a *AwsOss) UploadPartCopy(ctx context.Context, req *file.UploadPartCopyInput) (*file.UploadPartCopyOutput, error) { - client, err := a.selectClient(map[string]string{}, endpointKey) + client, err := a.selectClient(req.Bucket) if err != nil { return nil, err } //TODO: should support objects accessed through access points - copySource := req.CopySource.CopySourceBucket + "/" + req.CopySource.CopySourceKey + "?versionId=" + req.CopySource.CopySourceVersionId - input := &s3.UploadPartCopyInput{ - Bucket: &req.Bucket, - Key: &req.Key, - CopySource: ©Source, - PartNumber: req.PartNumber, - UploadId: &req.UploadId, + copySource := req.CopySource.CopySourceBucket + "/" + req.CopySource.CopySourceKey + if req.CopySource.CopySourceVersionId != "" { + copySource += "?versionId=" + req.CopySource.CopySourceVersionId } - resp, err := client.UploadPartCopy(ctx, input) + input := &s3.UploadPartCopyInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) if err != nil { return nil, err } - //LastModified := ×tamppb.Timestamp{Seconds: int64(resp.CopyPartResult.LastModified.Second()), Nanos: int32(resp.CopyPartResult.LastModified.Nanosecond())} - output := &file.UploadPartCopyOutput{BucketKeyEnabled: resp.BucketKeyEnabled, RequestCharged: string(resp.RequestCharged), - //CopyPartResult: &file.CopyPartResult{ETag: *resp.CopyPartResult.ETag, LastModified: LastModified}, - CopySourceVersionId: *resp.CopySourceVersionId, - SseCustomerAlgorithm: *resp.SSECustomerAlgorithm, SseCustomerKeyMd5: *resp.SSECustomerKeyMD5, SseKmsKeyId: *resp.SSECustomerKeyMD5, - ServerSideEncryption: string(resp.ServerSideEncryption), + input.CopySource = ©Source + resp, err := client.UploadPartCopy(ctx, input) + if err != nil { + return nil, err } + output := &file.UploadPartCopyOutput{} + err = copier.Copy(output, resp) return output, err } func (a *AwsOss) CompleteMultipartUpload(ctx context.Context, req *file.CompleteMultipartUploadInput) (*file.CompleteMultipartUploadOutput, error) { - client, err := a.selectClient(map[string]string{}, endpointKey) + client, err := a.selectClient(req.Bucket) if err != nil { return nil, err } - input := &s3.CompleteMultipartUploadInput{ - Bucket: &req.Bucket, - Key: &req.Key, - UploadId: &req.UploadId, - RequestPayer: types.RequestPayer(req.RequestPayer), - ExpectedBucketOwner: &req.ExpectedBucketOwner, - MultipartUpload: &types.CompletedMultipartUpload{}, - } - for _, v := range req.MultipartUpload.Parts { - input.MultipartUpload.Parts = append(input.MultipartUpload.Parts, types.CompletedPart{ETag: &v.ETag, PartNumber: v.PartNumber}) + input := &s3.CompleteMultipartUploadInput{MultipartUpload: &types.CompletedMultipartUpload{}} + err = copier.CopyWithOption( + input, + req, + copier.Option{ + IgnoreEmpty: true, + DeepCopy: true, + Converters: []copier.TypeConverter{str2point}, + }, + ) + if err != nil { + return nil, err } resp, err := client.CompleteMultipartUpload(ctx, input) if err != nil { return nil, err } - output := &file.CompleteMultipartUploadOutput{ - Bucket: *resp.Bucket, - Key: *resp.Key, - BucketKeyEnabled: resp.BucketKeyEnabled, - ETag: *resp.ETag, - Expiration: *resp.Expiration, - Location: *resp.Location, - RequestCharged: string(resp.RequestCharged), - SseKmsKeyId: *resp.SSEKMSKeyId, - ServerSideEncryption: string(resp.ServerSideEncryption), - VersionId: *resp.VersionId, - } + output := &file.CompleteMultipartUploadOutput{} + err = copier.Copy(output, resp) return output, err } func (a *AwsOss) AbortMultipartUpload(ctx context.Context, req *file.AbortMultipartUploadInput) (*file.AbortMultipartUploadOutput, error) { - client, err := a.selectClient(map[string]string{}, endpointKey) + client, err := a.selectClient(req.Bucket) if err != nil { return nil, err } - input := &s3.AbortMultipartUploadInput{ - Bucket: &req.Bucket, - Key: &req.Key, - UploadId: &req.UploadId, - RequestPayer: types.RequestPayer(req.RequestPayer), - ExpectedBucketOwner: &req.ExpectedBucketOwner, + input := &s3.AbortMultipartUploadInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + if err != nil { + return nil, err } resp, err := client.AbortMultipartUpload(ctx, input) if err != nil { @@ -522,31 +507,26 @@ func (a *AwsOss) AbortMultipartUpload(ctx context.Context, req *file.AbortMultip return output, err } func (a *AwsOss) ListMultipartUploads(ctx context.Context, req *file.ListMultipartUploadsInput) (*file.ListMultipartUploadsOutput, error) { - client, err := a.selectClient(map[string]string{}, endpointKey) + client, err := a.selectClient(req.Bucket) if err != nil { return nil, err } - input := &s3.ListMultipartUploadsInput{ - Bucket: &req.Bucket, - ExpectedBucketOwner: &req.ExpectedBucketOwner, + input := &s3.ListMultipartUploadsInput{} + + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + if err != nil { + return nil, err } + resp, err := client.ListMultipartUploads(ctx, input) if err != nil { return nil, err } - output := &file.ListMultipartUploadsOutput{ - Bucket: *resp.Bucket, - Delimiter: *resp.Delimiter, - EncodingType: string(resp.EncodingType), - IsTruncated: resp.IsTruncated, - KeyMarker: *resp.KeyMarker, - MaxUploads: resp.MaxUploads, - NextKeyMarker: *resp.NextKeyMarker, - NextUploadIdMarker: *resp.NextUploadIdMarker, - Prefix: *resp.Prefix, - UploadIdMarker: *resp.UploadIdMarker, + output := &file.ListMultipartUploadsOutput{CommonPrefixes: []string{}, Uploads: []*file.MultipartUpload{}} + err = copier.Copy(output, resp) + if err != nil { + return nil, err } - for _, v := range resp.CommonPrefixes { output.CommonPrefixes = append(output.CommonPrefixes, *v.Prefix) } @@ -564,37 +544,24 @@ func (a *AwsOss) ListMultipartUploads(ctx context.Context, req *file.ListMultipa return output, err } func (a *AwsOss) ListObjectVersions(ctx context.Context, req *file.ListObjectVersionsInput) (*file.ListObjectVersionsOutput, error) { - client, err := a.selectClient(map[string]string{}, endpointKey) + client, err := a.selectClient(req.Bucket) if err != nil { return nil, err } - input := &s3.ListObjectVersionsInput{ - Bucket: &req.Bucket, - Delimiter: &req.Delimiter, - EncodingType: types.EncodingType(req.EncodingType), - ExpectedBucketOwner: &req.ExpectedBucketOwner, - KeyMarker: &req.KeyMarker, - MaxKeys: req.MaxKeys, - Prefix: &req.Prefix, - VersionIdMarker: &req.VersionIdMarker, + input := &s3.ListObjectVersionsInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + if err != nil { + return nil, err } resp, err := client.ListObjectVersions(ctx, input) if err != nil { return nil, err } - output := &file.ListObjectVersionsOutput{ - Delimiter: *resp.Delimiter, - EncodingType: string(resp.EncodingType), - IsTruncated: resp.IsTruncated, - KeyMarker: *resp.KeyMarker, - MaxKeys: resp.MaxKeys, - Name: *resp.Name, - NextKeyMarker: *resp.NextKeyMarker, - NextVersionIdMarker: *resp.NextVersionIdMarker, - Prefix: *resp.Prefix, - VersionIdMarker: *resp.VersionIdMarker, + output := &file.ListObjectVersionsOutput{} + err = copier.Copy(output, resp) + if err != nil { + return nil, err } - for _, v := range resp.CommonPrefixes { output.CommonPrefixes = append(output.CommonPrefixes, *v.Prefix) } @@ -610,10 +577,10 @@ func (a *AwsOss) ListObjectVersions(ctx context.Context, req *file.ListObjectVer } for _, v := range resp.Versions { version := &file.ObjectVersion{ - ETag: *v.ETag, - IsLatest: v.IsLatest, - Key: *v.Key, - //LastModified: timestamppb.New(*v.LastModified), + ETag: *v.ETag, + IsLatest: v.IsLatest, + Key: *v.Key, + LastModified: v.LastModified.Unix(), Owner: &file.Owner{DisplayName: *v.Owner.DisplayName, ID: *v.Owner.ID}, Size: v.Size, StorageClass: string(v.StorageClass), @@ -628,11 +595,48 @@ func (a *AwsOss) HeadObject(ctx context.Context, req *file.HeadObjectInput) (*fi return nil, nil } -func (a *AwsOss) IsObjectExist(context.Context, *file.IsObjectExistInput) (*file.IsObjectExistOutput, error) { - return nil, nil +func (a *AwsOss) IsObjectExist(ctx context.Context, req *file.IsObjectExistInput) (*file.IsObjectExistOutput, error) { + client, err := a.selectClient(req.Bucket) + 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 &file.IsObjectExistOutput{FileExist: false}, nil + } + return nil, err + } + return &file.IsObjectExistOutput{FileExist: true}, nil } func (a *AwsOss) SignURL(ctx context.Context, req *file.SignURLInput) (*file.SignURLOutput, error) { + client, err := a.selectClient(req.Bucket) + 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))) + if err != nil { + return nil, err + } + return &file.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))) + if err != nil { + return nil, err + } + return &file.SignURLOutput{SignedUrl: resp.URL}, nil + default: + return nil, errors.New(fmt.Sprintf("not supported method %+v now", req.Method)) + } + return nil, nil } @@ -644,9 +648,9 @@ func (a *AwsOss) UpdateUpLoadBandwidthRateLimit(ctx context.Context, req *file.U return nil } func (a *AwsOss) AppendObject(ctx context.Context, req *file.AppendObjectInput) (*file.AppendObjectOutput, error) { - return nil, nil + return nil, errors.New("AppendObject method not supported on AWS") } func (a *AwsOss) ListParts(ctx context.Context, req *file.ListPartsInput) (*file.ListPartsOutput, error) { - return nil, errors.New("ListParts not supported on AWS") + return nil, errors.New("ListParts method not supported on AWS") } diff --git a/components/file/aws/oss_test.go b/components/file/aws/oss_test.go index affe915cb4..4a669e760a 100644 --- a/components/file/aws/oss_test.go +++ b/components/file/aws/oss_test.go @@ -17,32 +17,41 @@ package aws import ( + "fmt" "testing" "github.com/jinzhu/copier" ) func TestCopyWithConverterStrToStrPointer(t *testing.T) { + type S1 struct { + name string + } + + type S2 struct { + name string + } + type SrcStruct struct { Field1 string + s *S1 } type DestStruct struct { Field1 *string + s *S2 } - src := SrcStruct{} + src := SrcStruct{s: &S1{name: "s1"}} var dst DestStruct - err := copier.Copy(&src, &dst) + err := copier.Copy(&dst, &src) if err != nil { t.Fatalf(`Should be able to copy from src to dst object. %v`, err) return } - if src.Field1 != "" { - t.Fatalf("got %q, wanted nil", src.Field1) - } + fmt.Println(dst.Field1, dst.s) } diff --git a/components/file/s3def.go b/components/file/oss.go similarity index 98% rename from components/file/s3def.go rename to components/file/oss.go index 240f3d05d7..e1e73a99e8 100644 --- a/components/file/s3def.go +++ b/components/file/oss.go @@ -356,9 +356,9 @@ type UploadPartOutput struct { BucketKeyEnabled bool `protobuf:"varint,1,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` ETag string `protobuf:"bytes,2,opt,name=etag,proto3" json:"etag,omitempty"` RequestCharged string `protobuf:"bytes,3,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` - SseCustomerAlgorithm string `protobuf:"bytes,4,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - SseCustomerKeyMd5 string `protobuf:"bytes,5,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - SseKmsKeyId string `protobuf:"bytes,6,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` + SSECustomerAlgorithm string `protobuf:"bytes,4,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SSECustomerKeyMD5 string `protobuf:"bytes,5,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + SSEKMSKeyId string `protobuf:"bytes,6,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` ServerSideEncryption string `protobuf:"bytes,7,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` } @@ -377,9 +377,9 @@ type UploadPartCopyOutput struct { CopyPartResult *CopyPartResult `protobuf:"bytes,2,opt,name=copy_part_result,json=copyPartResult,proto3" json:"copy_part_result,omitempty"` CopySourceVersionId string `protobuf:"bytes,3,opt,name=copy_source_version_id,json=copySourceVersionId,proto3" json:"copy_source_version_id,omitempty"` RequestCharged string `protobuf:"bytes,4,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` - SseCustomerAlgorithm string `protobuf:"bytes,5,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - SseCustomerKeyMd5 string `protobuf:"bytes,6,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - SseKmsKeyId string `protobuf:"bytes,7,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` + SSECustomerAlgorithm string `protobuf:"bytes,5,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SSECustomerKeyMD5 string `protobuf:"bytes,6,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + SSEKMSKeyId string `protobuf:"bytes,7,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` ServerSideEncryption string `protobuf:"bytes,8,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` } type CopyPartResult struct { @@ -410,7 +410,7 @@ type CompleteMultipartUploadOutput struct { Expiration string `protobuf:"bytes,5,opt,name=expiration,proto3" json:"expiration,omitempty"` Location string `protobuf:"bytes,6,opt,name=location,proto3" json:"location,omitempty"` RequestCharged string `protobuf:"bytes,7,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` - SseKmsKeyId string `protobuf:"bytes,8,opt,name=sse_kms_keyId,json=sseKmsKeyId,proto3" json:"sse_kms_keyId,omitempty"` + SSEKMSKeyId string `protobuf:"bytes,8,opt,name=sse_kms_keyId,json=sseKmsKeyId,proto3" json:"sse_kms_keyId,omitempty"` ServerSideEncryption string `protobuf:"bytes,9,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` VersionId string `protobuf:"bytes,10,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } @@ -537,7 +537,6 @@ type IsObjectExistOutput struct { } type SignURLInput struct { - StoreName string `json:"store_name,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` Method string `json:"method,omitempty"` diff --git a/components/file/types.go b/components/file/types.go index 8e378375c6..ff1f240329 100644 --- a/components/file/types.go +++ b/components/file/types.go @@ -21,6 +21,16 @@ import ( "io" ) +// OssMetadata wraps the configuration of oss implementation +type OssMetadata struct { + Buckets []string `json:"buckets"` // contained buckets in this oss client + Uid string `json:"uid"` // specify the uid of oss client + Endpoint string `json:"endpoint"` + AccessKeyID string `json:"accessKeyID"` + AccessKeySecret string `json:"accessKeySecret"` + Region string `json:"region"` +} + // FileConfig wraps configuration for a file implementation type FileConfig struct { Method string `json:"method"` diff --git a/demo/file/s3/client.go b/demo/file/s3/client.go index 506adf3691..9ad64d7e84 100644 --- a/demo/file/s3/client.go +++ b/demo/file/s3/client.go @@ -21,6 +21,7 @@ import ( "context" "fmt" "os" + "time" s3 "mosn.io/layotto/spec/proto/extension/v1" @@ -142,14 +143,14 @@ func TestDeleteObjects(fileName1, fileName2 string) { fmt.Printf("DeleteObjects success with resp: %+v \n", resp2) } -func TestTagging() { +func TestTagging(name string) { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return } c := s3.NewObjectStorageServiceClient(conn) - req := &s3.PutObjectTaggingInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "王文学.jpg", Tags: map[string]string{"Abc": "123", "Def": "456"}} + req := &s3.PutObjectTaggingInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name, Tags: map[string]string{"Abc": "123", "Def": "456"}} _, err = c.PutObjectTagging(context.Background(), req) if err != nil { fmt.Printf("PutObjectTagging fail, err: %+v \n", err) @@ -157,7 +158,7 @@ func TestTagging() { } fmt.Printf("PutObjectTagging success, try get tagging\n") - req2 := &s3.GetObjectTaggingInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "王文学.jpg"} + req2 := &s3.GetObjectTaggingInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name} getResp, err := c.GetObjectTagging(context.Background(), req2) if err != nil { fmt.Printf("GetObjectTagging fail, err: %+v \n", err) @@ -165,7 +166,7 @@ func TestTagging() { } fmt.Printf("GetObjectTagging: %+v \n", getResp.Tags) - req3 := &s3.DeleteObjectTaggingInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "王文学.jpg"} + req3 := &s3.DeleteObjectTaggingInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name} delResp, err := c.DeleteObjectTagging(context.Background(), req3) if err != nil { fmt.Printf("DeleteObjectTagging fail, err: %+v \n", err) @@ -173,7 +174,7 @@ func TestTagging() { } fmt.Printf("DeleteObjectTagging success: %+v \n", delResp.VersionId) - req4 := &s3.GetObjectTaggingInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "王文学.jpg"} + req4 := &s3.GetObjectTaggingInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name} getResp4, err := c.GetObjectTagging(context.Background(), req4) if err != nil { fmt.Printf("GetObjectTagging fail, err: %+v \n", err) @@ -182,14 +183,14 @@ func TestTagging() { fmt.Printf("GetObjectTagging after delete tag: %+v \n", getResp4.Tags) } -func TestAcl() { +func TestAcl(name string) { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return } c := s3.NewObjectStorageServiceClient(conn) - req := &s3.GetObjectAclInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "王文学.jpg"} + req := &s3.GetObjectAclInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name} resp, err := c.GetObjectAcl(context.Background(), req) if err != nil { fmt.Printf("GetObjectAcl fail, err: %+v \n", err) @@ -197,24 +198,24 @@ func TestAcl() { } fmt.Printf("get acl success, resp: %+v\n", resp) - putRequest := &s3.PutObjectAclInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "王文学.jpg", Acl: "public-read-write"} + putRequest := &s3.PutObjectAclInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name, Acl: "public-read-write"} resp2, err := c.PutObjectAcl(context.Background(), putRequest) if err != nil { - fmt.Printf("PutObjectTagging fail, err: %+v \n", err) + fmt.Printf("TestAcl fail, err: %+v \n", err) return } fmt.Printf("put acl public-read-write success with resp: %+v \n", resp2) } -func TestCopyObject() { +func TestCopyObject(name string) { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return } c := s3.NewObjectStorageServiceClient(conn) - req := &s3.CopyObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "王文学.jpg.copy", CopySource: &s3.CopySource{CopySourceKey: "王文学.jpg"}} + req := &s3.CopyObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name + ".copy", CopySource: &s3.CopySource{CopySourceBucket: "antsys-wenxuwan", CopySourceKey: name}} resp, err := c.CopyObject(context.Background(), req) if err != nil { fmt.Printf("CopyObject fail, err: %+v \n", err) @@ -247,7 +248,7 @@ func TestPart() { } fmt.Printf("ListMultipartUploads success, resp: %+v \n", resp1) - req2 := &s3.UploadPartCopyInput{StoreName: storeName, Bucket: "antsys-wenxuwan", PartNumber: 1, UploadId: resp.UploadId, Key: "multicopy.jpg", StartPosition: 0, PartSize: 1000, CopySource: &s3.CopySource{CopySourceBucket: "antsys-wenxuwan", CopySourceKey: "王文学.jpg"}} + req2 := &s3.UploadPartCopyInput{StoreName: storeName, Bucket: "antsys-wenxuwan", PartNumber: 1, UploadId: resp.UploadId, Key: "multicopy.jpg", StartPosition: 0, PartSize: 1000, CopySource: &s3.CopySource{CopySourceBucket: "antsys-wenxuwan", CopySourceKey: "hello2.txt"}} resp2, err := c.UploadPartCopy(context.Background(), req2) if err != nil { fmt.Printf("UploadPartCopy fail, err: %+v \n", err) @@ -271,7 +272,7 @@ func TestPart() { //} //fmt.Printf("AbortMultipartUpload success, resp: %+v \n", resp4) - req5 := &s3.CreateMultipartUploadInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "client"} + req5 := &s3.CreateMultipartUploadInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "海贼王.jpg"} resp5, err := c.CreateMultipartUpload(context.Background(), req5) if err != nil { fmt.Printf("CreateMultipartUpload fail, err: %+v \n", err) @@ -282,11 +283,11 @@ func TestPart() { req6 := &s3.UploadPartInput{ StoreName: storeName, Bucket: "antsys-wenxuwan", - Key: "client", + Key: "海贼王.jpg", UploadId: resp5.UploadId, PartNumber: 0, } - f, err := os.Open("haizei.jpg") + f, err := os.Open("海贼王.jpg") if err != nil { fmt.Printf("open file fail, err: %+v\n", err) return @@ -323,7 +324,7 @@ func TestPart() { parts = append(parts, part) } fmt.Printf("UploadPart success, parts: %+v \n", parts) - req7 := &s3.CompleteMultipartUploadInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "client", UploadId: resp5.UploadId, MultipartUpload: &s3.CompletedMultipartUpload{Parts: parts}} + req7 := &s3.CompleteMultipartUploadInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "海贼王.jpg", UploadId: resp5.UploadId, MultipartUpload: &s3.CompletedMultipartUpload{Parts: parts}} resp7, err := c.CompleteMultipartUpload(context.Background(), req7) if err != nil { fmt.Printf("CompleteMultipartUpload fail, err: %+v \n", err) @@ -349,14 +350,14 @@ func TestListVersion() { } -func TestRestore() { +func TestRestore(name string) { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return } c := s3.NewObjectStorageServiceClient(conn) - req := &s3.RestoreObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "client"} + req := &s3.RestoreObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name} resp, err := c.RestoreObject(context.Background(), req) if err != nil { fmt.Printf("RestoreObject fail, err: %+v \n", err) @@ -366,14 +367,14 @@ func TestRestore() { } -func TestObjectExist() { +func TestObjectExist(name string) { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return } c := s3.NewObjectStorageServiceClient(conn) - req := &s3.IsObjectExistInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "client"} + req := &s3.IsObjectExistInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name} resp, err := c.IsObjectExist(context.Background(), req) if err != nil { fmt.Printf("TestObjectExist fail, err: %+v \n", err) @@ -383,6 +384,52 @@ func TestObjectExist() { } +func TestAbortMultipartUpload() { + conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) + if err != nil { + fmt.Printf("conn build failed,err:%+v", err) + return + } + c := s3.NewObjectStorageServiceClient(conn) + + req := &s3.ListMultipartUploadsInput{StoreName: storeName, Bucket: "antsys-wenxuwan", MaxUploads: 1000} + resp, err := c.ListMultipartUploads(context.Background(), req) + if err != nil { + fmt.Printf("ListMultipartUploads fail, err: %+v \n", err) + return + } + fmt.Printf("ListMultipartUploads success, resp: %+v \n", resp) + + for _, v := range resp.Uploads { + req4 := &s3.AbortMultipartUploadInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: v.Key, UploadId: v.UploadId} + resp4, err := c.AbortMultipartUpload(context.Background(), req4) + if err != nil { + fmt.Printf("AbortMultipartUpload fail, err: %+v \n", err) + return + } + fmt.Printf("AbortMultipartUpload success, resp: %+v \n", resp4) + } + + fmt.Printf("AbortMultipartUpload test success") +} + +func TestSign(name, method string) { + conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) + if err != nil { + fmt.Printf("conn build failed,err:%+v", err) + return + } + c := s3.NewObjectStorageServiceClient(conn) + req := &s3.SignURLInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name, ExpiredInSec: int64(10 * time.Minute), Method: method} + resp, err := c.SignURL(context.Background(), req) + if err != nil { + fmt.Printf("SignURLInput fail, err: %+v \n", err) + return + } + fmt.Printf("SignURLInput success, resp: %+v\n", resp.SignedUrl) + +} + func main() { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { @@ -415,15 +462,15 @@ func main() { } if os.Args[1] == "tag" { - TestTagging() + TestTagging(os.Args[2]) } if os.Args[1] == "acl" { - TestAcl() + TestAcl(os.Args[2]) } if os.Args[1] == "copy" { - TestCopyObject() + TestCopyObject(os.Args[2]) } if os.Args[1] == "part" { @@ -435,9 +482,16 @@ func main() { } if os.Args[1] == "restore" { - TestRestore() + TestRestore(os.Args[2]) } if os.Args[1] == "exist" { - TestObjectExist() + TestObjectExist(os.Args[2]) + } + if os.Args[1] == "abort" { + TestAbortMultipartUpload() + } + + if os.Args[1] == "sign" { + TestSign(os.Args[2], os.Args[3]) } } From 42fd46e9b0b9b40979d8395b5aaf8ec46c8cb094 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 27 Jun 2022 14:23:07 +0800 Subject: [PATCH 040/126] add HeadObject implement --- components/file/aws/oss.go | 12 +++++++++++- components/file/oss.go | 6 +++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index f5705987bf..19108cfb5d 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -592,7 +592,17 @@ func (a *AwsOss) ListObjectVersions(ctx context.Context, req *file.ListObjectVer } func (a *AwsOss) HeadObject(ctx context.Context, req *file.HeadObjectInput) (*file.HeadObjectOutput, error) { - return nil, nil + client, err := a.selectClient(req.Bucket) + if err != nil { + return nil, err + } + input := &s3.HeadObjectInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + resp, err := client.HeadObject(ctx, input) + if err != nil { + return nil, err + } + return &file.HeadObjectOutput{ResultMetadata: resp.Metadata}, nil } func (a *AwsOss) IsObjectExist(ctx context.Context, req *file.IsObjectExistInput) (*file.IsObjectExistOutput, error) { diff --git a/components/file/oss.go b/components/file/oss.go index e1e73a99e8..23fe49c2f7 100644 --- a/components/file/oss.go +++ b/components/file/oss.go @@ -517,9 +517,9 @@ type HeadObjectInput struct { IfUnmodifiedSince int64 `json:"if_unmodified_since,omitempty"` PartNumber int32 `json:"part_number,omitempty"` RequestPayer string `json:"request_payer,omitempty"` - SseCustomerAlgorithm string `json:"sse_customer_algorithm,omitempty"` - SseCustomerKey string `json:"sse_customer_key,omitempty"` - SseCustomerKeyMd5 string `json:"sse_customer_key_md5,omitempty"` + SSECustomerAlgorithm string `json:"sse_customer_algorithm,omitempty"` + SSECustomerKey string `json:"sse_customer_key,omitempty"` + SSECustomerKeyMD5 string `json:"sse_customer_key_md5,omitempty"` VersionId string `json:"version_id,omitempty"` WithDetails bool `json:"with_details,omitempty"` } From 18cb89839ddd9b24c62e0d5418a1c67db9e188b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 27 Jun 2022 14:23:57 +0800 Subject: [PATCH 041/126] make format --- cmd/layotto/main.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/layotto/main.go b/cmd/layotto/main.go index aa41853f1d..17983bcef8 100644 --- a/cmd/layotto/main.go +++ b/cmd/layotto/main.go @@ -22,9 +22,10 @@ import ( "strconv" "time" - "mosn.io/layotto/components/file/aliyun" mosn_zipkin "mosn.io/mosn/pkg/trace/zipkin" + "mosn.io/layotto/components/file/aliyun" + "mosn.io/layotto/diagnostics/zipkin" mosn_jaeger "mosn.io/mosn/pkg/trace/jaeger" From 6b249a70737db623440503953e2d845854a3b67c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 27 Jun 2022 14:40:52 +0800 Subject: [PATCH 042/126] add license for file --- components/file/aws/option.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/components/file/aws/option.go b/components/file/aws/option.go index 06eccbf86c..2fa4189bee 100644 --- a/components/file/aws/option.go +++ b/components/file/aws/option.go @@ -1,3 +1,19 @@ +/* +* 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 aws import ( From 99f03f382eac51dc8e772942c20cb7d084f190ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 27 Jun 2022 15:16:27 +0800 Subject: [PATCH 043/126] chang acl interface to canned acl --- components/file/aliyun/oss.go | 10 +- components/file/aws/oss.go | 32 +- components/file/oss.go | 29 +- pkg/grpc/extension/s3/s3.go | 8 +- spec/proto/extension/v1/oss.pb.go | 2485 +++++++++++------------- spec/proto/extension/v1/oss.proto | 30 +- spec/proto/extension/v1/oss_grpc.pb.go | 56 +- 7 files changed, 1209 insertions(+), 1441 deletions(-) diff --git a/components/file/aliyun/oss.go b/components/file/aliyun/oss.go index 314dae1f2a..f55c5e615b 100644 --- a/components/file/aliyun/oss.go +++ b/components/file/aliyun/oss.go @@ -234,7 +234,7 @@ func (a *AliyunOSS) GetObjectTagging(ctx context.Context, req *file.GetObjectTag return out, err } -func (a *AliyunOSS) GetObjectAcl(ctx context.Context, req *file.GetObjectAclInput) (*file.GetObjectAclOutput, error) { +func (a *AliyunOSS) GetObjectCannedAcl(ctx context.Context, req *file.GetObjectCannedAclInput) (*file.GetObjectCannedAclOutput, error) { cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err @@ -247,12 +247,10 @@ func (a *AliyunOSS) GetObjectAcl(ctx context.Context, req *file.GetObjectAclInpu if err != nil { return nil, err } - output := &file.GetObjectAclOutput{Owner: &file.Owner{DisplayName: resp.Owner.DisplayName, ID: resp.Owner.ID}} - grant := &file.Grant{Grantee: &file.Grantee{DisplayName: resp.Owner.DisplayName, ID: resp.Owner.ID}, Permission: resp.ACL} - output.Grants = append(output.Grants, grant) + output := &file.GetObjectCannedAclOutput{CannedAcl: resp.ACL, Owner: &file.Owner{DisplayName: resp.Owner.DisplayName, ID: resp.Owner.ID}} return output, err } -func (a *AliyunOSS) PutObjectAcl(ctx context.Context, req *file.PutObjectAclInput) (*file.PutObjectAclOutput, error) { +func (a *AliyunOSS) PutObjectCannedAcl(ctx context.Context, req *file.PutObjectCannedAclInput) (*file.PutObjectCannedAclOutput, error) { cli, err := a.selectClient(req.Bucket) if err != nil { return nil, err @@ -262,7 +260,7 @@ func (a *AliyunOSS) PutObjectAcl(ctx context.Context, req *file.PutObjectAclInpu return nil, err } err = bucket.SetObjectACL(req.Key, oss.ACLType(req.Acl)) - output := &file.PutObjectAclOutput{} + output := &file.PutObjectCannedAclOutput{} return output, err } func (a *AliyunOSS) ListObjects(ctx context.Context, req *file.ListObjectsInput) (*file.ListObjectsOutput, error) { diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index 19108cfb5d..de63b231a9 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -315,34 +315,10 @@ func (a *AwsOss) ListObjects(ctx context.Context, req *file.ListObjectsInput) (* }}) return output, err } -func (a *AwsOss) GetObjectAcl(ctx context.Context, req *file.GetObjectAclInput) (*file.GetObjectAclOutput, error) { - client, err := a.selectClient(req.Bucket) - if err != nil { - return nil, err - } - input := &s3.GetObjectAclInput{ - Bucket: &req.Bucket, - Key: &req.Key, - } - resp, err := client.GetObjectAcl(ctx, input) - if err != nil { - return nil, err - } - output := &file.GetObjectAclOutput{ - Owner: &file.Owner{DisplayName: *resp.Owner.DisplayName, ID: *resp.Owner.ID}, - RequestCharged: string(resp.RequestCharged), - } - for _, v := range resp.Grants { - grant := &file.Grant{} - grantee := &file.Grantee{} - copier.Copy(grantee, v.Grantee) - grant.Permission = string(v.Permission) - grant.Grantee = grantee - output.Grants = append(output.Grants, grant) - } - return output, err +func (a *AwsOss) GetObjectCannedAcl(ctx context.Context, req *file.GetObjectCannedAclInput) (*file.GetObjectCannedAclOutput, error) { + return nil, errors.New("GetObjectCannedAcl method not supported on AWS") } -func (a *AwsOss) PutObjectAcl(ctx context.Context, req *file.PutObjectAclInput) (*file.PutObjectAclOutput, error) { +func (a *AwsOss) PutObjectCannedAcl(ctx context.Context, req *file.PutObjectCannedAclInput) (*file.PutObjectCannedAclOutput, error) { client, err := a.selectClient(req.Bucket) if err != nil { return nil, err @@ -356,7 +332,7 @@ func (a *AwsOss) PutObjectAcl(ctx context.Context, req *file.PutObjectAclInput) if err != nil { return nil, err } - return &file.PutObjectAclOutput{RequestCharged: string(resp.RequestCharged)}, err + return &file.PutObjectCannedAclOutput{RequestCharged: string(resp.RequestCharged)}, err } func (a *AwsOss) RestoreObject(ctx context.Context, req *file.RestoreObjectInput) (*file.RestoreObjectOutput, error) { client, err := a.selectClient(req.Bucket) diff --git a/components/file/oss.go b/components/file/oss.go index 23fe49c2f7..f0efd426c8 100644 --- a/components/file/oss.go +++ b/components/file/oss.go @@ -38,8 +38,8 @@ type Oss interface { CopyObject(context.Context, *CopyObjectInput) (*CopyObjectOutput, error) DeleteObjects(context.Context, *DeleteObjectsInput) (*DeleteObjectsOutput, error) ListObjects(context.Context, *ListObjectsInput) (*ListObjectsOutput, error) - GetObjectAcl(context.Context, *GetObjectAclInput) (*GetObjectAclOutput, error) - PutObjectAcl(context.Context, *PutObjectAclInput) (*PutObjectAclOutput, error) + GetObjectCannedAcl(context.Context, *GetObjectCannedAclInput) (*GetObjectCannedAclOutput, error) + PutObjectCannedAcl(context.Context, *PutObjectCannedAclInput) (*PutObjectCannedAclOutput, error) RestoreObject(context.Context, *RestoreObjectInput) (*RestoreObjectOutput, error) CreateMultipartUpload(context.Context, *CreateMultipartUploadInput) (*CreateMultipartUploadOutput, error) UploadPart(context.Context, *UploadPartInput) (*UploadPartOutput, error) @@ -252,33 +252,22 @@ type Owner struct { ID string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` } -type GetObjectAclInput struct { +type GetObjectCannedAclInput struct { Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` } -type GetObjectAclOutput struct { - Grants []*Grant `protobuf:"bytes,1,rep,name=grants,proto3" json:"grants,omitempty"` - Owner *Owner `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,omitempty"` - RequestCharged string `protobuf:"bytes,3,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` -} -type Grant struct { - Grantee *Grantee `protobuf:"bytes,1,opt,name=grantee,proto3" json:"grantee,omitempty"` - Permission string `protobuf:"bytes,2,opt,name=permission,proto3" json:"permission,omitempty"` -} -type Grantee struct { - DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - EmailAddress string `protobuf:"bytes,2,opt,name=email_address,json=emailAddress,proto3" json:"email_address,omitempty"` - ID string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` - Type string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"` - URI string `protobuf:"bytes,5,opt,name=uri,proto3" json:"uri,omitempty"` +type GetObjectCannedAclOutput struct { + CannedAcl string `protobuf:"bytes,1,opt,name=canned_acl,json=cannedAcl,proto3" json:"canned_acl,omitempty"` + Owner *Owner `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,omitempty"` + RequestCharged string `protobuf:"bytes,3,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` } -type PutObjectAclInput struct { +type PutObjectCannedAclInput struct { Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` Acl string `protobuf:"bytes,3,opt,name=acl,proto3" json:"acl,omitempty"` } -type PutObjectAclOutput struct { +type PutObjectCannedAclOutput struct { RequestCharged string `protobuf:"bytes,1,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` } diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go index c83f2a1cc1..72d3f3013e 100644 --- a/pkg/grpc/extension/s3/s3.go +++ b/pkg/grpc/extension/s3/s3.go @@ -353,12 +353,12 @@ func (s *S3Server) GetObjectAcl(ctx context.Context, req *s3.GetObjectAclInput) if s.ossInstance[req.StoreName] == nil { return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } - st := &l8s3.GetObjectAclInput{} + st := &l8s3.GetObjectCannedAclInput{} err := transferData(req, st) if err != nil { return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for GetObjectAcl,err: %+v", err) } - var resp *l8s3.GetObjectAclOutput + var resp *l8s3.GetObjectCannedAclOutput if resp, err = s.ossInstance[req.StoreName].GetObjectAcl(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) } @@ -374,12 +374,12 @@ func (s *S3Server) PutObjectAcl(ctx context.Context, req *s3.PutObjectAclInput) if s.ossInstance[req.StoreName] == nil { return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } - st := &l8s3.PutObjectAclInput{} + st := &l8s3.PutObjectCannedAclInput{} err := transferData(req, st) if err != nil { return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for PutObjectAcl,err: %+v", err) } - var resp *l8s3.PutObjectAclOutput + var resp *l8s3.PutObjectCannedAclOutput if resp, err = s.ossInstance[req.StoreName].PutObjectAcl(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) } diff --git a/spec/proto/extension/v1/oss.pb.go b/spec/proto/extension/v1/oss.pb.go index e571dc7172..9e5cf94ce8 100644 --- a/spec/proto/extension/v1/oss.pb.go +++ b/spec/proto/extension/v1/oss.pb.go @@ -2456,145 +2456,7 @@ func (x *Object) GetStorageClass() string { return "" } -type Grantee struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - EmailAddress string `protobuf:"bytes,2,opt,name=email_address,json=emailAddress,proto3" json:"email_address,omitempty"` - // The canonical user ID of the grantee. - Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` - Type string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"` - // URI of the grantee group. - Uri string `protobuf:"bytes,5,opt,name=uri,proto3" json:"uri,omitempty"` -} - -func (x *Grantee) Reset() { - *x = Grantee{} - if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Grantee) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Grantee) ProtoMessage() {} - -func (x *Grantee) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[26] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Grantee.ProtoReflect.Descriptor instead. -func (*Grantee) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{26} -} - -func (x *Grantee) GetDisplayName() string { - if x != nil { - return x.DisplayName - } - return "" -} - -func (x *Grantee) GetEmailAddress() string { - if x != nil { - return x.EmailAddress - } - return "" -} - -func (x *Grantee) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Grantee) GetType() string { - if x != nil { - return x.Type - } - return "" -} - -func (x *Grantee) GetUri() string { - if x != nil { - return x.Uri - } - return "" -} - -// Container for grant information. -type Grant struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Grantee *Grantee `protobuf:"bytes,1,opt,name=grantee,proto3" json:"grantee,omitempty"` - // Specifies the permission given to the grantee. - Permission string `protobuf:"bytes,2,opt,name=permission,proto3" json:"permission,omitempty"` -} - -func (x *Grant) Reset() { - *x = Grant{} - if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[27] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Grant) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Grant) ProtoMessage() {} - -func (x *Grant) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[27] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Grant.ProtoReflect.Descriptor instead. -func (*Grant) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{27} -} - -func (x *Grant) GetGrantee() *Grantee { - if x != nil { - return x.Grantee - } - return nil -} - -func (x *Grant) GetPermission() string { - if x != nil { - return x.Permission - } - return "" -} - -type GetObjectAclInput struct { +type GetObjectCannedAclInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -2606,23 +2468,23 @@ type GetObjectAclInput struct { VersionId string `protobuf:"bytes,4,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } -func (x *GetObjectAclInput) Reset() { - *x = GetObjectAclInput{} +func (x *GetObjectCannedAclInput) Reset() { + *x = GetObjectCannedAclInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[28] + mi := &file_oss_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetObjectAclInput) String() string { +func (x *GetObjectCannedAclInput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetObjectAclInput) ProtoMessage() {} +func (*GetObjectCannedAclInput) ProtoMessage() {} -func (x *GetObjectAclInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[28] +func (x *GetObjectCannedAclInput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2633,68 +2495,68 @@ func (x *GetObjectAclInput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetObjectAclInput.ProtoReflect.Descriptor instead. -func (*GetObjectAclInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{28} +// Deprecated: Use GetObjectCannedAclInput.ProtoReflect.Descriptor instead. +func (*GetObjectCannedAclInput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{26} } -func (x *GetObjectAclInput) GetStoreName() string { +func (x *GetObjectCannedAclInput) GetStoreName() string { if x != nil { return x.StoreName } return "" } -func (x *GetObjectAclInput) GetBucket() string { +func (x *GetObjectCannedAclInput) GetBucket() string { if x != nil { return x.Bucket } return "" } -func (x *GetObjectAclInput) GetKey() string { +func (x *GetObjectCannedAclInput) GetKey() string { if x != nil { return x.Key } return "" } -func (x *GetObjectAclInput) GetVersionId() string { +func (x *GetObjectCannedAclInput) GetVersionId() string { if x != nil { return x.VersionId } return "" } -type GetObjectAclOutput struct { +type GetObjectCannedAclOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Grants []*Grant `protobuf:"bytes,1,rep,name=grants,proto3" json:"grants,omitempty"` - Owner *Owner `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,omitempty"` + CannedAcl string `protobuf:"bytes,1,opt,name=canned_acl,json=cannedAcl,proto3" json:"canned_acl,omitempty"` + Owner *Owner `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,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"` } -func (x *GetObjectAclOutput) Reset() { - *x = GetObjectAclOutput{} +func (x *GetObjectCannedAclOutput) Reset() { + *x = GetObjectCannedAclOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[29] + mi := &file_oss_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetObjectAclOutput) String() string { +func (x *GetObjectCannedAclOutput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetObjectAclOutput) ProtoMessage() {} +func (*GetObjectCannedAclOutput) ProtoMessage() {} -func (x *GetObjectAclOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[29] +func (x *GetObjectCannedAclOutput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2705,33 +2567,33 @@ func (x *GetObjectAclOutput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetObjectAclOutput.ProtoReflect.Descriptor instead. -func (*GetObjectAclOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{29} +// Deprecated: Use GetObjectCannedAclOutput.ProtoReflect.Descriptor instead. +func (*GetObjectCannedAclOutput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{27} } -func (x *GetObjectAclOutput) GetGrants() []*Grant { +func (x *GetObjectCannedAclOutput) GetCannedAcl() string { if x != nil { - return x.Grants + return x.CannedAcl } - return nil + return "" } -func (x *GetObjectAclOutput) GetOwner() *Owner { +func (x *GetObjectCannedAclOutput) GetOwner() *Owner { if x != nil { return x.Owner } return nil } -func (x *GetObjectAclOutput) GetRequestCharged() string { +func (x *GetObjectCannedAclOutput) GetRequestCharged() string { if x != nil { return x.RequestCharged } return "" } -type PutObjectAclInput struct { +type PutObjectCannedAclInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -2745,23 +2607,23 @@ type PutObjectAclInput struct { VersionId string `protobuf:"bytes,5,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } -func (x *PutObjectAclInput) Reset() { - *x = PutObjectAclInput{} +func (x *PutObjectCannedAclInput) Reset() { + *x = PutObjectCannedAclInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[30] + mi := &file_oss_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PutObjectAclInput) String() string { +func (x *PutObjectCannedAclInput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PutObjectAclInput) ProtoMessage() {} +func (*PutObjectCannedAclInput) ProtoMessage() {} -func (x *PutObjectAclInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[30] +func (x *PutObjectCannedAclInput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2772,47 +2634,47 @@ func (x *PutObjectAclInput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PutObjectAclInput.ProtoReflect.Descriptor instead. -func (*PutObjectAclInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{30} +// Deprecated: Use PutObjectCannedAclInput.ProtoReflect.Descriptor instead. +func (*PutObjectCannedAclInput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{28} } -func (x *PutObjectAclInput) GetStoreName() string { +func (x *PutObjectCannedAclInput) GetStoreName() string { if x != nil { return x.StoreName } return "" } -func (x *PutObjectAclInput) GetBucket() string { +func (x *PutObjectCannedAclInput) GetBucket() string { if x != nil { return x.Bucket } return "" } -func (x *PutObjectAclInput) GetKey() string { +func (x *PutObjectCannedAclInput) GetKey() string { if x != nil { return x.Key } return "" } -func (x *PutObjectAclInput) GetAcl() string { +func (x *PutObjectCannedAclInput) GetAcl() string { if x != nil { return x.Acl } return "" } -func (x *PutObjectAclInput) GetVersionId() string { +func (x *PutObjectCannedAclInput) GetVersionId() string { if x != nil { return x.VersionId } return "" } -type PutObjectAclOutput struct { +type PutObjectCannedAclOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -2820,23 +2682,23 @@ type PutObjectAclOutput struct { RequestCharged string `protobuf:"bytes,1,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` } -func (x *PutObjectAclOutput) Reset() { - *x = PutObjectAclOutput{} +func (x *PutObjectCannedAclOutput) Reset() { + *x = PutObjectCannedAclOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[31] + mi := &file_oss_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PutObjectAclOutput) String() string { +func (x *PutObjectCannedAclOutput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PutObjectAclOutput) ProtoMessage() {} +func (*PutObjectCannedAclOutput) ProtoMessage() {} -func (x *PutObjectAclOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[31] +func (x *PutObjectCannedAclOutput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2847,12 +2709,12 @@ func (x *PutObjectAclOutput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PutObjectAclOutput.ProtoReflect.Descriptor instead. -func (*PutObjectAclOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{31} +// Deprecated: Use PutObjectCannedAclOutput.ProtoReflect.Descriptor instead. +func (*PutObjectCannedAclOutput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{29} } -func (x *PutObjectAclOutput) GetRequestCharged() string { +func (x *PutObjectCannedAclOutput) GetRequestCharged() string { if x != nil { return x.RequestCharged } @@ -2874,7 +2736,7 @@ type RestoreObjectInput struct { func (x *RestoreObjectInput) Reset() { *x = RestoreObjectInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[32] + mi := &file_oss_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2887,7 +2749,7 @@ func (x *RestoreObjectInput) String() string { func (*RestoreObjectInput) ProtoMessage() {} func (x *RestoreObjectInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[32] + mi := &file_oss_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2900,7 +2762,7 @@ func (x *RestoreObjectInput) ProtoReflect() protoreflect.Message { // Deprecated: Use RestoreObjectInput.ProtoReflect.Descriptor instead. func (*RestoreObjectInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{32} + return file_oss_proto_rawDescGZIP(), []int{30} } func (x *RestoreObjectInput) GetStoreName() string { @@ -2947,7 +2809,7 @@ type RestoreObjectOutput struct { func (x *RestoreObjectOutput) Reset() { *x = RestoreObjectOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[33] + mi := &file_oss_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2960,7 +2822,7 @@ func (x *RestoreObjectOutput) String() string { func (*RestoreObjectOutput) ProtoMessage() {} func (x *RestoreObjectOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[33] + mi := &file_oss_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2973,7 +2835,7 @@ func (x *RestoreObjectOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use RestoreObjectOutput.ProtoReflect.Descriptor instead. func (*RestoreObjectOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{33} + return file_oss_proto_rawDescGZIP(), []int{31} } func (x *RestoreObjectOutput) GetRequestCharged() string { @@ -3036,7 +2898,7 @@ type CreateMultipartUploadInput struct { func (x *CreateMultipartUploadInput) Reset() { *x = CreateMultipartUploadInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[34] + mi := &file_oss_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3049,7 +2911,7 @@ func (x *CreateMultipartUploadInput) String() string { func (*CreateMultipartUploadInput) ProtoMessage() {} func (x *CreateMultipartUploadInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[34] + mi := &file_oss_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3062,7 +2924,7 @@ func (x *CreateMultipartUploadInput) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateMultipartUploadInput.ProtoReflect.Descriptor instead. func (*CreateMultipartUploadInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{34} + return file_oss_proto_rawDescGZIP(), []int{32} } func (x *CreateMultipartUploadInput) GetStoreName() string { @@ -3298,7 +3160,7 @@ type CreateMultipartUploadOutput struct { func (x *CreateMultipartUploadOutput) Reset() { *x = CreateMultipartUploadOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[35] + mi := &file_oss_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3311,7 +3173,7 @@ func (x *CreateMultipartUploadOutput) String() string { func (*CreateMultipartUploadOutput) ProtoMessage() {} func (x *CreateMultipartUploadOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[35] + mi := &file_oss_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3324,7 +3186,7 @@ func (x *CreateMultipartUploadOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateMultipartUploadOutput.ProtoReflect.Descriptor instead. func (*CreateMultipartUploadOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{35} + return file_oss_proto_rawDescGZIP(), []int{33} } func (x *CreateMultipartUploadOutput) GetBucket() string { @@ -3442,7 +3304,7 @@ type UploadPartInput struct { func (x *UploadPartInput) Reset() { *x = UploadPartInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[36] + mi := &file_oss_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3455,7 +3317,7 @@ func (x *UploadPartInput) String() string { func (*UploadPartInput) ProtoMessage() {} func (x *UploadPartInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[36] + mi := &file_oss_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3468,7 +3330,7 @@ func (x *UploadPartInput) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadPartInput.ProtoReflect.Descriptor instead. func (*UploadPartInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{36} + return file_oss_proto_rawDescGZIP(), []int{34} } func (x *UploadPartInput) GetStoreName() string { @@ -3580,7 +3442,7 @@ type UploadPartOutput struct { func (x *UploadPartOutput) Reset() { *x = UploadPartOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[37] + mi := &file_oss_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3593,7 +3455,7 @@ func (x *UploadPartOutput) String() string { func (*UploadPartOutput) ProtoMessage() {} func (x *UploadPartOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[37] + mi := &file_oss_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3606,7 +3468,7 @@ func (x *UploadPartOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadPartOutput.ProtoReflect.Descriptor instead. func (*UploadPartOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{37} + return file_oss_proto_rawDescGZIP(), []int{35} } func (x *UploadPartOutput) GetBucketKeyEnabled() bool { @@ -3682,7 +3544,7 @@ type UploadPartCopyInput struct { func (x *UploadPartCopyInput) Reset() { *x = UploadPartCopyInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[38] + mi := &file_oss_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3695,7 +3557,7 @@ func (x *UploadPartCopyInput) String() string { func (*UploadPartCopyInput) ProtoMessage() {} func (x *UploadPartCopyInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[38] + mi := &file_oss_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3708,7 +3570,7 @@ func (x *UploadPartCopyInput) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadPartCopyInput.ProtoReflect.Descriptor instead. func (*UploadPartCopyInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{38} + return file_oss_proto_rawDescGZIP(), []int{36} } func (x *UploadPartCopyInput) GetStoreName() string { @@ -3780,7 +3642,7 @@ type CopyPartResult struct { func (x *CopyPartResult) Reset() { *x = CopyPartResult{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[39] + mi := &file_oss_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3793,7 +3655,7 @@ func (x *CopyPartResult) String() string { func (*CopyPartResult) ProtoMessage() {} func (x *CopyPartResult) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[39] + mi := &file_oss_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3806,7 +3668,7 @@ func (x *CopyPartResult) ProtoReflect() protoreflect.Message { // Deprecated: Use CopyPartResult.ProtoReflect.Descriptor instead. func (*CopyPartResult) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{39} + return file_oss_proto_rawDescGZIP(), []int{37} } func (x *CopyPartResult) GetEtag() string { @@ -3841,7 +3703,7 @@ type UploadPartCopyOutput struct { func (x *UploadPartCopyOutput) Reset() { *x = UploadPartCopyOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[40] + mi := &file_oss_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3854,7 +3716,7 @@ func (x *UploadPartCopyOutput) String() string { func (*UploadPartCopyOutput) ProtoMessage() {} func (x *UploadPartCopyOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[40] + mi := &file_oss_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3867,7 +3729,7 @@ func (x *UploadPartCopyOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadPartCopyOutput.ProtoReflect.Descriptor instead. func (*UploadPartCopyOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{40} + return file_oss_proto_rawDescGZIP(), []int{38} } func (x *UploadPartCopyOutput) GetBucketKeyEnabled() bool { @@ -3938,7 +3800,7 @@ type CompletedPart struct { func (x *CompletedPart) Reset() { *x = CompletedPart{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[41] + mi := &file_oss_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3951,7 +3813,7 @@ func (x *CompletedPart) String() string { func (*CompletedPart) ProtoMessage() {} func (x *CompletedPart) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[41] + mi := &file_oss_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3964,7 +3826,7 @@ func (x *CompletedPart) ProtoReflect() protoreflect.Message { // Deprecated: Use CompletedPart.ProtoReflect.Descriptor instead. func (*CompletedPart) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{41} + return file_oss_proto_rawDescGZIP(), []int{39} } func (x *CompletedPart) GetEtag() string { @@ -3993,7 +3855,7 @@ type CompletedMultipartUpload struct { func (x *CompletedMultipartUpload) Reset() { *x = CompletedMultipartUpload{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[42] + mi := &file_oss_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4006,7 +3868,7 @@ func (x *CompletedMultipartUpload) String() string { func (*CompletedMultipartUpload) ProtoMessage() {} func (x *CompletedMultipartUpload) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[42] + mi := &file_oss_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4019,7 +3881,7 @@ func (x *CompletedMultipartUpload) ProtoReflect() protoreflect.Message { // Deprecated: Use CompletedMultipartUpload.ProtoReflect.Descriptor instead. func (*CompletedMultipartUpload) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{42} + return file_oss_proto_rawDescGZIP(), []int{40} } func (x *CompletedMultipartUpload) GetParts() []*CompletedPart { @@ -4049,7 +3911,7 @@ type CompleteMultipartUploadInput struct { func (x *CompleteMultipartUploadInput) Reset() { *x = CompleteMultipartUploadInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[43] + mi := &file_oss_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4062,7 +3924,7 @@ func (x *CompleteMultipartUploadInput) String() string { func (*CompleteMultipartUploadInput) ProtoMessage() {} func (x *CompleteMultipartUploadInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[43] + mi := &file_oss_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4075,7 +3937,7 @@ func (x *CompleteMultipartUploadInput) ProtoReflect() protoreflect.Message { // Deprecated: Use CompleteMultipartUploadInput.ProtoReflect.Descriptor instead. func (*CompleteMultipartUploadInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{43} + return file_oss_proto_rawDescGZIP(), []int{41} } func (x *CompleteMultipartUploadInput) GetStoreName() string { @@ -4154,7 +4016,7 @@ type CompleteMultipartUploadOutput struct { func (x *CompleteMultipartUploadOutput) Reset() { *x = CompleteMultipartUploadOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[44] + mi := &file_oss_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4167,7 +4029,7 @@ func (x *CompleteMultipartUploadOutput) String() string { func (*CompleteMultipartUploadOutput) ProtoMessage() {} func (x *CompleteMultipartUploadOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[44] + mi := &file_oss_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4180,7 +4042,7 @@ func (x *CompleteMultipartUploadOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use CompleteMultipartUploadOutput.ProtoReflect.Descriptor instead. func (*CompleteMultipartUploadOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{44} + return file_oss_proto_rawDescGZIP(), []int{42} } func (x *CompleteMultipartUploadOutput) GetBucket() string { @@ -4271,7 +4133,7 @@ type AbortMultipartUploadInput struct { func (x *AbortMultipartUploadInput) Reset() { *x = AbortMultipartUploadInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[45] + mi := &file_oss_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4284,7 +4146,7 @@ func (x *AbortMultipartUploadInput) String() string { func (*AbortMultipartUploadInput) ProtoMessage() {} func (x *AbortMultipartUploadInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[45] + mi := &file_oss_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4297,7 +4159,7 @@ func (x *AbortMultipartUploadInput) ProtoReflect() protoreflect.Message { // Deprecated: Use AbortMultipartUploadInput.ProtoReflect.Descriptor instead. func (*AbortMultipartUploadInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{45} + return file_oss_proto_rawDescGZIP(), []int{43} } func (x *AbortMultipartUploadInput) GetStoreName() string { @@ -4355,7 +4217,7 @@ type AbortMultipartUploadOutput struct { func (x *AbortMultipartUploadOutput) Reset() { *x = AbortMultipartUploadOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[46] + mi := &file_oss_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4368,7 +4230,7 @@ func (x *AbortMultipartUploadOutput) String() string { func (*AbortMultipartUploadOutput) ProtoMessage() {} func (x *AbortMultipartUploadOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[46] + mi := &file_oss_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4381,7 +4243,7 @@ func (x *AbortMultipartUploadOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use AbortMultipartUploadOutput.ProtoReflect.Descriptor instead. func (*AbortMultipartUploadOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{46} + return file_oss_proto_rawDescGZIP(), []int{44} } func (x *AbortMultipartUploadOutput) GetRequestCharged() string { @@ -4434,7 +4296,7 @@ type ListMultipartUploadsInput struct { func (x *ListMultipartUploadsInput) Reset() { *x = ListMultipartUploadsInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[47] + mi := &file_oss_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4447,7 +4309,7 @@ func (x *ListMultipartUploadsInput) String() string { func (*ListMultipartUploadsInput) ProtoMessage() {} func (x *ListMultipartUploadsInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[47] + mi := &file_oss_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4460,7 +4322,7 @@ func (x *ListMultipartUploadsInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMultipartUploadsInput.ProtoReflect.Descriptor instead. func (*ListMultipartUploadsInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{47} + return file_oss_proto_rawDescGZIP(), []int{45} } func (x *ListMultipartUploadsInput) GetStoreName() string { @@ -4538,7 +4400,7 @@ type Initiator struct { func (x *Initiator) Reset() { *x = Initiator{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[48] + mi := &file_oss_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4551,7 +4413,7 @@ func (x *Initiator) String() string { func (*Initiator) ProtoMessage() {} func (x *Initiator) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[48] + mi := &file_oss_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4564,7 +4426,7 @@ func (x *Initiator) ProtoReflect() protoreflect.Message { // Deprecated: Use Initiator.ProtoReflect.Descriptor instead. func (*Initiator) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{48} + return file_oss_proto_rawDescGZIP(), []int{46} } func (x *Initiator) GetDisplayName() string { @@ -4597,7 +4459,7 @@ type MultipartUpload struct { func (x *MultipartUpload) Reset() { *x = MultipartUpload{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[49] + mi := &file_oss_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4610,7 +4472,7 @@ func (x *MultipartUpload) String() string { func (*MultipartUpload) ProtoMessage() {} func (x *MultipartUpload) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[49] + mi := &file_oss_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4623,7 +4485,7 @@ func (x *MultipartUpload) ProtoReflect() protoreflect.Message { // Deprecated: Use MultipartUpload.ProtoReflect.Descriptor instead. func (*MultipartUpload) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{49} + return file_oss_proto_rawDescGZIP(), []int{47} } func (x *MultipartUpload) GetInitiated() int64 { @@ -4706,7 +4568,7 @@ type ListMultipartUploadsOutput struct { func (x *ListMultipartUploadsOutput) Reset() { *x = ListMultipartUploadsOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[50] + mi := &file_oss_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4719,7 +4581,7 @@ func (x *ListMultipartUploadsOutput) String() string { func (*ListMultipartUploadsOutput) ProtoMessage() {} func (x *ListMultipartUploadsOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[50] + mi := &file_oss_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4732,7 +4594,7 @@ func (x *ListMultipartUploadsOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMultipartUploadsOutput.ProtoReflect.Descriptor instead. func (*ListMultipartUploadsOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{50} + return file_oss_proto_rawDescGZIP(), []int{48} } func (x *ListMultipartUploadsOutput) GetBucket() string { @@ -4855,7 +4717,7 @@ type ListObjectVersionsInput struct { func (x *ListObjectVersionsInput) Reset() { *x = ListObjectVersionsInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[51] + mi := &file_oss_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4868,7 +4730,7 @@ func (x *ListObjectVersionsInput) String() string { func (*ListObjectVersionsInput) ProtoMessage() {} func (x *ListObjectVersionsInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[51] + mi := &file_oss_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4881,7 +4743,7 @@ func (x *ListObjectVersionsInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListObjectVersionsInput.ProtoReflect.Descriptor instead. func (*ListObjectVersionsInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{51} + return file_oss_proto_rawDescGZIP(), []int{49} } func (x *ListObjectVersionsInput) GetStoreName() string { @@ -4966,7 +4828,7 @@ type DeleteMarkerEntry struct { func (x *DeleteMarkerEntry) Reset() { *x = DeleteMarkerEntry{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[52] + mi := &file_oss_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4979,7 +4841,7 @@ func (x *DeleteMarkerEntry) String() string { func (*DeleteMarkerEntry) ProtoMessage() {} func (x *DeleteMarkerEntry) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[52] + mi := &file_oss_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4992,7 +4854,7 @@ func (x *DeleteMarkerEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteMarkerEntry.ProtoReflect.Descriptor instead. func (*DeleteMarkerEntry) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{52} + return file_oss_proto_rawDescGZIP(), []int{50} } func (x *DeleteMarkerEntry) GetIsLatest() bool { @@ -5050,7 +4912,7 @@ type ObjectVersion struct { func (x *ObjectVersion) Reset() { *x = ObjectVersion{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[53] + mi := &file_oss_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5063,7 +4925,7 @@ func (x *ObjectVersion) String() string { func (*ObjectVersion) ProtoMessage() {} func (x *ObjectVersion) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[53] + mi := &file_oss_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5076,7 +4938,7 @@ func (x *ObjectVersion) ProtoReflect() protoreflect.Message { // Deprecated: Use ObjectVersion.ProtoReflect.Descriptor instead. func (*ObjectVersion) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{53} + return file_oss_proto_rawDescGZIP(), []int{51} } func (x *ObjectVersion) GetEtag() string { @@ -5159,7 +5021,7 @@ type ListObjectVersionsOutput struct { func (x *ListObjectVersionsOutput) Reset() { *x = ListObjectVersionsOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[54] + mi := &file_oss_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5172,7 +5034,7 @@ func (x *ListObjectVersionsOutput) String() string { func (*ListObjectVersionsOutput) ProtoMessage() {} func (x *ListObjectVersionsOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[54] + mi := &file_oss_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5185,7 +5047,7 @@ func (x *ListObjectVersionsOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListObjectVersionsOutput.ProtoReflect.Descriptor instead. func (*ListObjectVersionsOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{54} + return file_oss_proto_rawDescGZIP(), []int{52} } func (x *ListObjectVersionsOutput) GetCommonPrefixes() []string { @@ -5310,7 +5172,7 @@ type HeadObjectInput struct { func (x *HeadObjectInput) Reset() { *x = HeadObjectInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[55] + mi := &file_oss_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5323,7 +5185,7 @@ func (x *HeadObjectInput) String() string { func (*HeadObjectInput) ProtoMessage() {} func (x *HeadObjectInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[55] + mi := &file_oss_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5336,7 +5198,7 @@ func (x *HeadObjectInput) ProtoReflect() protoreflect.Message { // Deprecated: Use HeadObjectInput.ProtoReflect.Descriptor instead. func (*HeadObjectInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{55} + return file_oss_proto_rawDescGZIP(), []int{53} } func (x *HeadObjectInput) GetStoreName() string { @@ -5463,7 +5325,7 @@ type HeadObjectOutput struct { func (x *HeadObjectOutput) Reset() { *x = HeadObjectOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[56] + mi := &file_oss_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5476,7 +5338,7 @@ func (x *HeadObjectOutput) String() string { func (*HeadObjectOutput) ProtoMessage() {} func (x *HeadObjectOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[56] + mi := &file_oss_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5489,7 +5351,7 @@ func (x *HeadObjectOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use HeadObjectOutput.ProtoReflect.Descriptor instead. func (*HeadObjectOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{56} + return file_oss_proto_rawDescGZIP(), []int{54} } func (x *HeadObjectOutput) GetResultMetadata() map[string]string { @@ -5513,7 +5375,7 @@ type IsObjectExistInput struct { func (x *IsObjectExistInput) Reset() { *x = IsObjectExistInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[57] + mi := &file_oss_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5526,7 +5388,7 @@ func (x *IsObjectExistInput) String() string { func (*IsObjectExistInput) ProtoMessage() {} func (x *IsObjectExistInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[57] + mi := &file_oss_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5539,7 +5401,7 @@ func (x *IsObjectExistInput) ProtoReflect() protoreflect.Message { // Deprecated: Use IsObjectExistInput.ProtoReflect.Descriptor instead. func (*IsObjectExistInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{57} + return file_oss_proto_rawDescGZIP(), []int{55} } func (x *IsObjectExistInput) GetStoreName() string { @@ -5581,7 +5443,7 @@ type IsObjectExistOutput struct { func (x *IsObjectExistOutput) Reset() { *x = IsObjectExistOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[58] + mi := &file_oss_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5594,7 +5456,7 @@ func (x *IsObjectExistOutput) String() string { func (*IsObjectExistOutput) ProtoMessage() {} func (x *IsObjectExistOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[58] + mi := &file_oss_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5607,7 +5469,7 @@ func (x *IsObjectExistOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use IsObjectExistOutput.ProtoReflect.Descriptor instead. func (*IsObjectExistOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{58} + return file_oss_proto_rawDescGZIP(), []int{56} } func (x *IsObjectExistOutput) GetFileExist() bool { @@ -5634,7 +5496,7 @@ type SignURLInput struct { func (x *SignURLInput) Reset() { *x = SignURLInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[59] + mi := &file_oss_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5647,7 +5509,7 @@ func (x *SignURLInput) String() string { func (*SignURLInput) ProtoMessage() {} func (x *SignURLInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[59] + mi := &file_oss_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5660,7 +5522,7 @@ func (x *SignURLInput) ProtoReflect() protoreflect.Message { // Deprecated: Use SignURLInput.ProtoReflect.Descriptor instead. func (*SignURLInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{59} + return file_oss_proto_rawDescGZIP(), []int{57} } func (x *SignURLInput) GetStoreName() string { @@ -5709,7 +5571,7 @@ type SignURLOutput struct { func (x *SignURLOutput) Reset() { *x = SignURLOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[60] + mi := &file_oss_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5722,7 +5584,7 @@ func (x *SignURLOutput) String() string { func (*SignURLOutput) ProtoMessage() {} func (x *SignURLOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[60] + mi := &file_oss_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5735,7 +5597,7 @@ func (x *SignURLOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use SignURLOutput.ProtoReflect.Descriptor instead. func (*SignURLOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{60} + return file_oss_proto_rawDescGZIP(), []int{58} } func (x *SignURLOutput) GetSignedUrl() string { @@ -5760,7 +5622,7 @@ type UpdateBandwidthRateLimitInput struct { func (x *UpdateBandwidthRateLimitInput) Reset() { *x = UpdateBandwidthRateLimitInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[61] + mi := &file_oss_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5773,7 +5635,7 @@ func (x *UpdateBandwidthRateLimitInput) String() string { func (*UpdateBandwidthRateLimitInput) ProtoMessage() {} func (x *UpdateBandwidthRateLimitInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[61] + mi := &file_oss_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5786,7 +5648,7 @@ func (x *UpdateBandwidthRateLimitInput) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateBandwidthRateLimitInput.ProtoReflect.Descriptor instead. func (*UpdateBandwidthRateLimitInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{61} + return file_oss_proto_rawDescGZIP(), []int{59} } func (x *UpdateBandwidthRateLimitInput) GetStoreName() string { @@ -5835,7 +5697,7 @@ type AppendObjectInput struct { func (x *AppendObjectInput) Reset() { *x = AppendObjectInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[62] + mi := &file_oss_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5848,7 +5710,7 @@ func (x *AppendObjectInput) String() string { func (*AppendObjectInput) ProtoMessage() {} func (x *AppendObjectInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[62] + mi := &file_oss_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5861,7 +5723,7 @@ func (x *AppendObjectInput) ProtoReflect() protoreflect.Message { // Deprecated: Use AppendObjectInput.ProtoReflect.Descriptor instead. func (*AppendObjectInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{62} + return file_oss_proto_rawDescGZIP(), []int{60} } func (x *AppendObjectInput) GetStoreName() string { @@ -5980,7 +5842,7 @@ type AppendObjectOutput struct { func (x *AppendObjectOutput) Reset() { *x = AppendObjectOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[63] + mi := &file_oss_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5993,7 +5855,7 @@ func (x *AppendObjectOutput) String() string { func (*AppendObjectOutput) ProtoMessage() {} func (x *AppendObjectOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[63] + mi := &file_oss_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6006,7 +5868,7 @@ func (x *AppendObjectOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use AppendObjectOutput.ProtoReflect.Descriptor instead. func (*AppendObjectOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{63} + return file_oss_proto_rawDescGZIP(), []int{61} } func (x *AppendObjectOutput) GetAppendPosition() int64 { @@ -6034,7 +5896,7 @@ type ListPartsInput struct { func (x *ListPartsInput) Reset() { *x = ListPartsInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[64] + mi := &file_oss_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6047,7 +5909,7 @@ func (x *ListPartsInput) String() string { func (*ListPartsInput) ProtoMessage() {} func (x *ListPartsInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[64] + mi := &file_oss_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6060,7 +5922,7 @@ func (x *ListPartsInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPartsInput.ProtoReflect.Descriptor instead. func (*ListPartsInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{64} + return file_oss_proto_rawDescGZIP(), []int{62} } func (x *ListPartsInput) GetStoreName() string { @@ -6133,7 +5995,7 @@ type Part struct { func (x *Part) Reset() { *x = Part{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[65] + mi := &file_oss_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6146,7 +6008,7 @@ func (x *Part) String() string { func (*Part) ProtoMessage() {} func (x *Part) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[65] + mi := &file_oss_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6159,7 +6021,7 @@ func (x *Part) ProtoReflect() protoreflect.Message { // Deprecated: Use Part.ProtoReflect.Descriptor instead. func (*Part) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{65} + return file_oss_proto_rawDescGZIP(), []int{63} } func (x *Part) GetEtag() string { @@ -6217,7 +6079,7 @@ type ListPartsOutput struct { func (x *ListPartsOutput) Reset() { *x = ListPartsOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[66] + mi := &file_oss_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6230,7 +6092,7 @@ func (x *ListPartsOutput) String() string { func (*ListPartsOutput) ProtoMessage() {} func (x *ListPartsOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[66] + mi := &file_oss_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6243,7 +6105,7 @@ func (x *ListPartsOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPartsOutput.ProtoReflect.Descriptor instead. func (*ListPartsOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{66} + return file_oss_proto_rawDescGZIP(), []int{64} } func (x *ListPartsOutput) GetBucket() string { @@ -6726,432 +6588,346 @@ var file_oss_proto_rawDesc = []byte{ 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, 0x87, 0x01, 0x0a, 0x07, 0x47, 0x72, 0x61, - 0x6e, 0x74, 0x65, 0x65, 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, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, - 0x72, 0x69, 0x22, 0x63, 0x0a, 0x05, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x07, 0x67, - 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 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, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x52, 0x07, - 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x7b, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 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, 0xab, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x36, 0x0a, 0x06, 0x67, - 0x72, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 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, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x06, 0x67, 0x72, 0x61, - 0x6e, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 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, 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, + 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, 0x98, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0x8d, 0x01, 0x0a, 0x11, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, + 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, 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, 0x3d, 0x0a, 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 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, - 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, - 0xf1, 0x0a, 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, - 0x5e, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x11, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x41, 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, 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, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x1d, 0x20, 0x01, 0x28, - 0x09, 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, 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, 0xa6, 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, 0x44, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 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, 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, 0xb7, 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, 0x51, 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, 0x27, 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, 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, 0x58, 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, 0x3c, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 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, - 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, - 0x61, 0x72, 0x74, 0x73, 0x22, 0xbb, 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, 0x5c, 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, 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, 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, + 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, 0xf1, 0x0a, 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, 0x5e, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x11, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x41, 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, 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, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x1d, 0x20, 0x01, + 0x28, 0x09, 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, 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, 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, + 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, - 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, 0xfb, 0x01, 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, 0x40, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, 0x72, 0x18, - 0x02, 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, - 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, - 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, 0xe4, - 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, 0x42, 0x0a, 0x07, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x03, - 0x28, 0x0b, 0x32, 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, 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, + 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, 0xa6, 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, 0x44, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, + 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 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, 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, 0xb7, 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, 0x51, 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, 0x27, 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, 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, 0x58, 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, 0x3c, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 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, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, + 0x70, 0x61, 0x72, 0x74, 0x73, 0x22, 0xbb, 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, 0x5c, 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, + 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, 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, @@ -7164,439 +6940,512 @@ var file_oss_proto_rawDesc = []byte{ 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, 0xbc, 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, + 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, 0xfb, 0x01, 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, 0x40, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, 0x72, + 0x18, 0x02, 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, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, + 0xe4, 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, 0x42, 0x0a, 0x07, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x0c, 0x20, + 0x03, 0x28, 0x0b, 0x32, 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, 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, 0xbc, + 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0x85, 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, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, + 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0x85, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, + 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, 0xaf, 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, 0x51, 0x0a, 0x0e, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, + 0x03, 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, 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, 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, 0x42, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x0d, 0x20, 0x03, 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, - 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, 0xaf, 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, 0x51, 0x0a, 0x0e, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, - 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, 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, 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, 0x42, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, - 0x20, 0x03, 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, 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, 0xbd, 0x01, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x66, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, - 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, 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, + 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, 0xbd, 0x01, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x66, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x3d, 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, 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, - 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, 0xcc, 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, 0x48, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, - 0x0f, 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, - 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, 0x84, 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, 0x33, - 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 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, 0xcc, 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, 0x48, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, + 0x18, 0x0f, 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, 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, 0x84, 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, + 0x33, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, + 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, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, + 0x61, 0x72, 0x74, 0x73, 0x32, 0xff, 0x17, 0x0a, 0x14, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4a, 0x0a, + 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 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, 0x49, 0x6e, 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, 0x62, 0x0a, 0x09, 0x50, 0x75, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, + 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x62, 0x0a, + 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x1a, 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, 0x47, 0x65, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x69, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 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, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, - 0x72, 0x74, 0x73, 0x32, 0xdb, 0x17, 0x0a, 0x14, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, - 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x0a, - 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x73, 0x70, 0x65, + 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x10, + 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, + 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, 0x50, 0x75, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 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, 0x7e, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, 0x49, 0x6e, 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, 0x62, 0x0a, 0x09, 0x50, 0x75, 0x74, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 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, - 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x62, 0x0a, 0x09, - 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x1a, 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, 0x47, 0x65, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x69, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x12, 0x2a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, + 0x6e, 0x2e, 0x76, 0x31, 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, 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, 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, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, + 0x6e, 0x67, 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, 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, 0x63, 0x0a, 0x0a, 0x43, 0x6f, + 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x43, 0x6f, 0x70, + 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, + 0x6c, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, + 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, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x10, 0x50, - 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 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, 0x7e, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, 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, 0x32, 0x2e, 0x73, + 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x66, 0x0a, + 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 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, 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, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, - 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, - 0x67, 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, 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, 0x63, 0x0a, 0x0a, 0x43, 0x6f, 0x70, - 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x28, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x43, 0x6f, 0x70, 0x79, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, - 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x0b, - 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x41, 0x63, 0x6c, 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, 0x47, - 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, - 0x69, 0x0a, 0x0c, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, - 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x52, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2b, 0x2e, 0x73, 0x70, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 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, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 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, 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, 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, 0x7b, 0x0a, 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, + 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 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, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x84, 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, 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, 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, 0x34, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x76, 0x31, 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, 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, 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, + 0x6c, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x84, 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, 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, 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, - 0x65, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x12, 0x28, 0x2e, + 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 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, 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, 0x65, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, + 0x72, 0x74, 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, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, + 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x0e, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, - 0x72, 0x74, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x0e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, + 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, + 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x8a, 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, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, - 0x79, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x76, 0x31, 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, + 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, 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, 0x81, 0x01, 0x0a, 0x14, 0x41, 0x62, + 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x12, 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, 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, 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, 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, 0x81, 0x01, + 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x8a, 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, 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, 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, 0x36, 0x2e, 0x73, 0x70, 0x65, + 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, 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, 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, 0x81, 0x01, 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, - 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 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, 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, 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, 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, 0x81, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, - 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x73, 0x12, 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, 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, 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, - 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, 0x7b, 0x0a, 0x12, - 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 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, 0x4c, 0x69, 0x73, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 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, 0x63, 0x0a, 0x0a, 0x48, 0x65, 0x61, - 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x48, 0x65, 0x61, 0x64, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, - 0x0a, 0x0d, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, - 0x78, 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x07, - 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x12, 0x25, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x6e, 0x2e, 0x76, 0x31, 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, 0x7b, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 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, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, - 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x36, 0x2e, 0x73, + 0x31, 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, 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, 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, 0x63, + 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 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, 0x72, - 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x70, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, - 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 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, 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, 0x6b, 0x0a, 0x0c, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 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, 0x41, 0x70, 0x70, - 0x65, 0x6e, 0x64, 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, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, - 0x60, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x73, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, + 0x78, 0x69, 0x73, 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, 0x49, + 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x49, 0x73, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, + 0x00, 0x12, 0x5a, 0x0a, 0x07, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x12, 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, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x28, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x1a, 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, 0x53, 0x69, + 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x74, 0x0a, + 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x42, + 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 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, 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, 0x72, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x70, 0x4c, + 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 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, - 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, - 0x00, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 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, 0x6b, 0x0a, 0x0c, 0x41, 0x70, 0x70, 0x65, 0x6e, + 0x64, 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, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 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, 0x41, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x28, 0x01, 0x12, 0x60, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, + 0x73, 0x12, 0x27, 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, 0x4c, 0x69, 0x73, 0x74, + 0x50, 0x61, 0x72, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -7611,7 +7460,7 @@ func file_oss_proto_rawDescGZIP() []byte { return file_oss_proto_rawDescData } -var file_oss_proto_msgTypes = make([]protoimpl.MessageInfo, 79) +var file_oss_proto_msgTypes = make([]protoimpl.MessageInfo, 77) var file_oss_proto_goTypes = []interface{}{ (*InitInput)(nil), // 0: spec.proto.extension.v1.InitInput (*GetObjectInput)(nil), // 1: spec.proto.extension.v1.GetObjectInput @@ -7639,155 +7488,151 @@ var file_oss_proto_goTypes = []interface{}{ (*ListObjectsOutput)(nil), // 23: spec.proto.extension.v1.ListObjectsOutput (*Owner)(nil), // 24: spec.proto.extension.v1.Owner (*Object)(nil), // 25: spec.proto.extension.v1.Object - (*Grantee)(nil), // 26: spec.proto.extension.v1.Grantee - (*Grant)(nil), // 27: spec.proto.extension.v1.Grant - (*GetObjectAclInput)(nil), // 28: spec.proto.extension.v1.GetObjectAclInput - (*GetObjectAclOutput)(nil), // 29: spec.proto.extension.v1.GetObjectAclOutput - (*PutObjectAclInput)(nil), // 30: spec.proto.extension.v1.PutObjectAclInput - (*PutObjectAclOutput)(nil), // 31: spec.proto.extension.v1.PutObjectAclOutput - (*RestoreObjectInput)(nil), // 32: spec.proto.extension.v1.RestoreObjectInput - (*RestoreObjectOutput)(nil), // 33: spec.proto.extension.v1.RestoreObjectOutput - (*CreateMultipartUploadInput)(nil), // 34: spec.proto.extension.v1.CreateMultipartUploadInput - (*CreateMultipartUploadOutput)(nil), // 35: spec.proto.extension.v1.CreateMultipartUploadOutput - (*UploadPartInput)(nil), // 36: spec.proto.extension.v1.UploadPartInput - (*UploadPartOutput)(nil), // 37: spec.proto.extension.v1.UploadPartOutput - (*UploadPartCopyInput)(nil), // 38: spec.proto.extension.v1.UploadPartCopyInput - (*CopyPartResult)(nil), // 39: spec.proto.extension.v1.CopyPartResult - (*UploadPartCopyOutput)(nil), // 40: spec.proto.extension.v1.UploadPartCopyOutput - (*CompletedPart)(nil), // 41: spec.proto.extension.v1.CompletedPart - (*CompletedMultipartUpload)(nil), // 42: spec.proto.extension.v1.CompletedMultipartUpload - (*CompleteMultipartUploadInput)(nil), // 43: spec.proto.extension.v1.CompleteMultipartUploadInput - (*CompleteMultipartUploadOutput)(nil), // 44: spec.proto.extension.v1.CompleteMultipartUploadOutput - (*AbortMultipartUploadInput)(nil), // 45: spec.proto.extension.v1.AbortMultipartUploadInput - (*AbortMultipartUploadOutput)(nil), // 46: spec.proto.extension.v1.AbortMultipartUploadOutput - (*ListMultipartUploadsInput)(nil), // 47: spec.proto.extension.v1.ListMultipartUploadsInput - (*Initiator)(nil), // 48: spec.proto.extension.v1.Initiator - (*MultipartUpload)(nil), // 49: spec.proto.extension.v1.MultipartUpload - (*ListMultipartUploadsOutput)(nil), // 50: spec.proto.extension.v1.ListMultipartUploadsOutput - (*ListObjectVersionsInput)(nil), // 51: spec.proto.extension.v1.ListObjectVersionsInput - (*DeleteMarkerEntry)(nil), // 52: spec.proto.extension.v1.DeleteMarkerEntry - (*ObjectVersion)(nil), // 53: spec.proto.extension.v1.ObjectVersion - (*ListObjectVersionsOutput)(nil), // 54: spec.proto.extension.v1.ListObjectVersionsOutput - (*HeadObjectInput)(nil), // 55: spec.proto.extension.v1.HeadObjectInput - (*HeadObjectOutput)(nil), // 56: spec.proto.extension.v1.HeadObjectOutput - (*IsObjectExistInput)(nil), // 57: spec.proto.extension.v1.IsObjectExistInput - (*IsObjectExistOutput)(nil), // 58: spec.proto.extension.v1.IsObjectExistOutput - (*SignURLInput)(nil), // 59: spec.proto.extension.v1.SignURLInput - (*SignURLOutput)(nil), // 60: spec.proto.extension.v1.SignURLOutput - (*UpdateBandwidthRateLimitInput)(nil), // 61: spec.proto.extension.v1.UpdateBandwidthRateLimitInput - (*AppendObjectInput)(nil), // 62: spec.proto.extension.v1.AppendObjectInput - (*AppendObjectOutput)(nil), // 63: spec.proto.extension.v1.AppendObjectOutput - (*ListPartsInput)(nil), // 64: spec.proto.extension.v1.ListPartsInput - (*Part)(nil), // 65: spec.proto.extension.v1.Part - (*ListPartsOutput)(nil), // 66: spec.proto.extension.v1.ListPartsOutput - nil, // 67: spec.proto.extension.v1.InitInput.MetadataEntry - nil, // 68: spec.proto.extension.v1.GetObjectOutput.MetadataEntry - nil, // 69: spec.proto.extension.v1.PutObjectInput.MetaEntry - nil, // 70: spec.proto.extension.v1.PutObjectTaggingInput.TagsEntry - nil, // 71: spec.proto.extension.v1.PutObjectTaggingOutput.ResultMetadataEntry - nil, // 72: spec.proto.extension.v1.DeleteObjectTaggingOutput.ResultMetadataEntry - nil, // 73: spec.proto.extension.v1.GetObjectTaggingOutput.TagsEntry - nil, // 74: spec.proto.extension.v1.GetObjectTaggingOutput.ResultMetadataEntry - nil, // 75: spec.proto.extension.v1.CopyObjectInput.MetadataEntry - nil, // 76: spec.proto.extension.v1.CreateMultipartUploadInput.MetaDataEntry - nil, // 77: spec.proto.extension.v1.HeadObjectOutput.ResultMetadataEntry - nil, // 78: spec.proto.extension.v1.AppendObjectInput.TagsEntry - (*emptypb.Empty)(nil), // 79: google.protobuf.Empty + (*GetObjectCannedAclInput)(nil), // 26: spec.proto.extension.v1.GetObjectCannedAclInput + (*GetObjectCannedAclOutput)(nil), // 27: spec.proto.extension.v1.GetObjectCannedAclOutput + (*PutObjectCannedAclInput)(nil), // 28: spec.proto.extension.v1.PutObjectCannedAclInput + (*PutObjectCannedAclOutput)(nil), // 29: spec.proto.extension.v1.PutObjectCannedAclOutput + (*RestoreObjectInput)(nil), // 30: spec.proto.extension.v1.RestoreObjectInput + (*RestoreObjectOutput)(nil), // 31: spec.proto.extension.v1.RestoreObjectOutput + (*CreateMultipartUploadInput)(nil), // 32: spec.proto.extension.v1.CreateMultipartUploadInput + (*CreateMultipartUploadOutput)(nil), // 33: spec.proto.extension.v1.CreateMultipartUploadOutput + (*UploadPartInput)(nil), // 34: spec.proto.extension.v1.UploadPartInput + (*UploadPartOutput)(nil), // 35: spec.proto.extension.v1.UploadPartOutput + (*UploadPartCopyInput)(nil), // 36: spec.proto.extension.v1.UploadPartCopyInput + (*CopyPartResult)(nil), // 37: spec.proto.extension.v1.CopyPartResult + (*UploadPartCopyOutput)(nil), // 38: spec.proto.extension.v1.UploadPartCopyOutput + (*CompletedPart)(nil), // 39: spec.proto.extension.v1.CompletedPart + (*CompletedMultipartUpload)(nil), // 40: spec.proto.extension.v1.CompletedMultipartUpload + (*CompleteMultipartUploadInput)(nil), // 41: spec.proto.extension.v1.CompleteMultipartUploadInput + (*CompleteMultipartUploadOutput)(nil), // 42: spec.proto.extension.v1.CompleteMultipartUploadOutput + (*AbortMultipartUploadInput)(nil), // 43: spec.proto.extension.v1.AbortMultipartUploadInput + (*AbortMultipartUploadOutput)(nil), // 44: spec.proto.extension.v1.AbortMultipartUploadOutput + (*ListMultipartUploadsInput)(nil), // 45: spec.proto.extension.v1.ListMultipartUploadsInput + (*Initiator)(nil), // 46: spec.proto.extension.v1.Initiator + (*MultipartUpload)(nil), // 47: spec.proto.extension.v1.MultipartUpload + (*ListMultipartUploadsOutput)(nil), // 48: spec.proto.extension.v1.ListMultipartUploadsOutput + (*ListObjectVersionsInput)(nil), // 49: spec.proto.extension.v1.ListObjectVersionsInput + (*DeleteMarkerEntry)(nil), // 50: spec.proto.extension.v1.DeleteMarkerEntry + (*ObjectVersion)(nil), // 51: spec.proto.extension.v1.ObjectVersion + (*ListObjectVersionsOutput)(nil), // 52: spec.proto.extension.v1.ListObjectVersionsOutput + (*HeadObjectInput)(nil), // 53: spec.proto.extension.v1.HeadObjectInput + (*HeadObjectOutput)(nil), // 54: spec.proto.extension.v1.HeadObjectOutput + (*IsObjectExistInput)(nil), // 55: spec.proto.extension.v1.IsObjectExistInput + (*IsObjectExistOutput)(nil), // 56: spec.proto.extension.v1.IsObjectExistOutput + (*SignURLInput)(nil), // 57: spec.proto.extension.v1.SignURLInput + (*SignURLOutput)(nil), // 58: spec.proto.extension.v1.SignURLOutput + (*UpdateBandwidthRateLimitInput)(nil), // 59: spec.proto.extension.v1.UpdateBandwidthRateLimitInput + (*AppendObjectInput)(nil), // 60: spec.proto.extension.v1.AppendObjectInput + (*AppendObjectOutput)(nil), // 61: spec.proto.extension.v1.AppendObjectOutput + (*ListPartsInput)(nil), // 62: spec.proto.extension.v1.ListPartsInput + (*Part)(nil), // 63: spec.proto.extension.v1.Part + (*ListPartsOutput)(nil), // 64: spec.proto.extension.v1.ListPartsOutput + nil, // 65: spec.proto.extension.v1.InitInput.MetadataEntry + nil, // 66: spec.proto.extension.v1.GetObjectOutput.MetadataEntry + nil, // 67: spec.proto.extension.v1.PutObjectInput.MetaEntry + nil, // 68: spec.proto.extension.v1.PutObjectTaggingInput.TagsEntry + nil, // 69: spec.proto.extension.v1.PutObjectTaggingOutput.ResultMetadataEntry + nil, // 70: spec.proto.extension.v1.DeleteObjectTaggingOutput.ResultMetadataEntry + nil, // 71: spec.proto.extension.v1.GetObjectTaggingOutput.TagsEntry + nil, // 72: spec.proto.extension.v1.GetObjectTaggingOutput.ResultMetadataEntry + nil, // 73: spec.proto.extension.v1.CopyObjectInput.MetadataEntry + nil, // 74: spec.proto.extension.v1.CreateMultipartUploadInput.MetaDataEntry + nil, // 75: spec.proto.extension.v1.HeadObjectOutput.ResultMetadataEntry + nil, // 76: spec.proto.extension.v1.AppendObjectInput.TagsEntry + (*emptypb.Empty)(nil), // 77: google.protobuf.Empty } var file_oss_proto_depIdxs = []int32{ - 67, // 0: spec.proto.extension.v1.InitInput.metadata:type_name -> spec.proto.extension.v1.InitInput.MetadataEntry - 68, // 1: spec.proto.extension.v1.GetObjectOutput.metadata:type_name -> spec.proto.extension.v1.GetObjectOutput.MetadataEntry - 69, // 2: spec.proto.extension.v1.PutObjectInput.meta:type_name -> spec.proto.extension.v1.PutObjectInput.MetaEntry - 70, // 3: spec.proto.extension.v1.PutObjectTaggingInput.tags:type_name -> spec.proto.extension.v1.PutObjectTaggingInput.TagsEntry - 71, // 4: spec.proto.extension.v1.PutObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.PutObjectTaggingOutput.ResultMetadataEntry - 72, // 5: spec.proto.extension.v1.DeleteObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.DeleteObjectTaggingOutput.ResultMetadataEntry - 73, // 6: spec.proto.extension.v1.GetObjectTaggingOutput.tags:type_name -> spec.proto.extension.v1.GetObjectTaggingOutput.TagsEntry - 74, // 7: spec.proto.extension.v1.GetObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.GetObjectTaggingOutput.ResultMetadataEntry + 65, // 0: spec.proto.extension.v1.InitInput.metadata:type_name -> spec.proto.extension.v1.InitInput.MetadataEntry + 66, // 1: spec.proto.extension.v1.GetObjectOutput.metadata:type_name -> spec.proto.extension.v1.GetObjectOutput.MetadataEntry + 67, // 2: spec.proto.extension.v1.PutObjectInput.meta:type_name -> spec.proto.extension.v1.PutObjectInput.MetaEntry + 68, // 3: spec.proto.extension.v1.PutObjectTaggingInput.tags:type_name -> spec.proto.extension.v1.PutObjectTaggingInput.TagsEntry + 69, // 4: spec.proto.extension.v1.PutObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.PutObjectTaggingOutput.ResultMetadataEntry + 70, // 5: spec.proto.extension.v1.DeleteObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.DeleteObjectTaggingOutput.ResultMetadataEntry + 71, // 6: spec.proto.extension.v1.GetObjectTaggingOutput.tags:type_name -> spec.proto.extension.v1.GetObjectTaggingOutput.TagsEntry + 72, // 7: spec.proto.extension.v1.GetObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.GetObjectTaggingOutput.ResultMetadataEntry 13, // 8: spec.proto.extension.v1.CopyObjectInput.copy_source:type_name -> spec.proto.extension.v1.CopySource - 75, // 9: spec.proto.extension.v1.CopyObjectInput.metadata:type_name -> spec.proto.extension.v1.CopyObjectInput.MetadataEntry + 73, // 9: spec.proto.extension.v1.CopyObjectInput.metadata:type_name -> spec.proto.extension.v1.CopyObjectInput.MetadataEntry 15, // 10: spec.proto.extension.v1.CopyObjectOutput.copy_object_result:type_name -> spec.proto.extension.v1.CopyObjectResult 18, // 11: spec.proto.extension.v1.Delete.objects:type_name -> spec.proto.extension.v1.ObjectIdentifier 17, // 12: spec.proto.extension.v1.DeleteObjectsInput.delete:type_name -> spec.proto.extension.v1.Delete 20, // 13: spec.proto.extension.v1.DeleteObjectsOutput.deleted:type_name -> spec.proto.extension.v1.DeletedObject 25, // 14: spec.proto.extension.v1.ListObjectsOutput.contents:type_name -> spec.proto.extension.v1.Object 24, // 15: spec.proto.extension.v1.Object.owner:type_name -> spec.proto.extension.v1.Owner - 26, // 16: spec.proto.extension.v1.Grant.grantee:type_name -> spec.proto.extension.v1.Grantee - 27, // 17: spec.proto.extension.v1.GetObjectAclOutput.grants:type_name -> spec.proto.extension.v1.Grant - 24, // 18: spec.proto.extension.v1.GetObjectAclOutput.owner:type_name -> spec.proto.extension.v1.Owner - 76, // 19: spec.proto.extension.v1.CreateMultipartUploadInput.meta_data:type_name -> spec.proto.extension.v1.CreateMultipartUploadInput.MetaDataEntry - 13, // 20: spec.proto.extension.v1.UploadPartCopyInput.copy_source:type_name -> spec.proto.extension.v1.CopySource - 39, // 21: spec.proto.extension.v1.UploadPartCopyOutput.copy_part_result:type_name -> spec.proto.extension.v1.CopyPartResult - 41, // 22: spec.proto.extension.v1.CompletedMultipartUpload.parts:type_name -> spec.proto.extension.v1.CompletedPart - 42, // 23: spec.proto.extension.v1.CompleteMultipartUploadInput.multipart_upload:type_name -> spec.proto.extension.v1.CompletedMultipartUpload - 48, // 24: spec.proto.extension.v1.MultipartUpload.initiator:type_name -> spec.proto.extension.v1.Initiator - 24, // 25: spec.proto.extension.v1.MultipartUpload.owner:type_name -> spec.proto.extension.v1.Owner - 49, // 26: spec.proto.extension.v1.ListMultipartUploadsOutput.uploads:type_name -> spec.proto.extension.v1.MultipartUpload - 24, // 27: spec.proto.extension.v1.DeleteMarkerEntry.owner:type_name -> spec.proto.extension.v1.Owner - 24, // 28: spec.proto.extension.v1.ObjectVersion.owner:type_name -> spec.proto.extension.v1.Owner - 52, // 29: spec.proto.extension.v1.ListObjectVersionsOutput.delete_markers:type_name -> spec.proto.extension.v1.DeleteMarkerEntry - 53, // 30: spec.proto.extension.v1.ListObjectVersionsOutput.versions:type_name -> spec.proto.extension.v1.ObjectVersion - 77, // 31: spec.proto.extension.v1.HeadObjectOutput.result_metadata:type_name -> spec.proto.extension.v1.HeadObjectOutput.ResultMetadataEntry - 78, // 32: spec.proto.extension.v1.AppendObjectInput.tags:type_name -> spec.proto.extension.v1.AppendObjectInput.TagsEntry - 65, // 33: spec.proto.extension.v1.ListPartsOutput.parts:type_name -> spec.proto.extension.v1.Part - 0, // 34: spec.proto.extension.v1.ObjectStorageService.InitClient:input_type -> spec.proto.extension.v1.InitInput - 3, // 35: spec.proto.extension.v1.ObjectStorageService.PutObject:input_type -> spec.proto.extension.v1.PutObjectInput - 1, // 36: spec.proto.extension.v1.ObjectStorageService.GetObject:input_type -> spec.proto.extension.v1.GetObjectInput - 5, // 37: spec.proto.extension.v1.ObjectStorageService.DeleteObject:input_type -> spec.proto.extension.v1.DeleteObjectInput - 7, // 38: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:input_type -> spec.proto.extension.v1.PutObjectTaggingInput - 9, // 39: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:input_type -> spec.proto.extension.v1.DeleteObjectTaggingInput - 11, // 40: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:input_type -> spec.proto.extension.v1.GetObjectTaggingInput - 14, // 41: spec.proto.extension.v1.ObjectStorageService.CopyObject:input_type -> spec.proto.extension.v1.CopyObjectInput - 19, // 42: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:input_type -> spec.proto.extension.v1.DeleteObjectsInput - 22, // 43: spec.proto.extension.v1.ObjectStorageService.ListObjects:input_type -> spec.proto.extension.v1.ListObjectsInput - 28, // 44: spec.proto.extension.v1.ObjectStorageService.GetObjectAcl:input_type -> spec.proto.extension.v1.GetObjectAclInput - 30, // 45: spec.proto.extension.v1.ObjectStorageService.PutObjectAcl:input_type -> spec.proto.extension.v1.PutObjectAclInput - 32, // 46: spec.proto.extension.v1.ObjectStorageService.RestoreObject:input_type -> spec.proto.extension.v1.RestoreObjectInput - 34, // 47: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:input_type -> spec.proto.extension.v1.CreateMultipartUploadInput - 36, // 48: spec.proto.extension.v1.ObjectStorageService.UploadPart:input_type -> spec.proto.extension.v1.UploadPartInput - 38, // 49: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:input_type -> spec.proto.extension.v1.UploadPartCopyInput - 43, // 50: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:input_type -> spec.proto.extension.v1.CompleteMultipartUploadInput - 45, // 51: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:input_type -> spec.proto.extension.v1.AbortMultipartUploadInput - 47, // 52: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:input_type -> spec.proto.extension.v1.ListMultipartUploadsInput - 51, // 53: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:input_type -> spec.proto.extension.v1.ListObjectVersionsInput - 55, // 54: spec.proto.extension.v1.ObjectStorageService.HeadObject:input_type -> spec.proto.extension.v1.HeadObjectInput - 57, // 55: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:input_type -> spec.proto.extension.v1.IsObjectExistInput - 59, // 56: spec.proto.extension.v1.ObjectStorageService.SignURL:input_type -> spec.proto.extension.v1.SignURLInput - 61, // 57: spec.proto.extension.v1.ObjectStorageService.UpdateDownLoadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput - 61, // 58: spec.proto.extension.v1.ObjectStorageService.UpdateUpLoadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput - 62, // 59: spec.proto.extension.v1.ObjectStorageService.AppendObject:input_type -> spec.proto.extension.v1.AppendObjectInput - 64, // 60: spec.proto.extension.v1.ObjectStorageService.ListParts:input_type -> spec.proto.extension.v1.ListPartsInput - 79, // 61: spec.proto.extension.v1.ObjectStorageService.InitClient:output_type -> google.protobuf.Empty - 4, // 62: spec.proto.extension.v1.ObjectStorageService.PutObject:output_type -> spec.proto.extension.v1.PutObjectOutput - 2, // 63: spec.proto.extension.v1.ObjectStorageService.GetObject:output_type -> spec.proto.extension.v1.GetObjectOutput - 6, // 64: spec.proto.extension.v1.ObjectStorageService.DeleteObject:output_type -> spec.proto.extension.v1.DeleteObjectOutput - 8, // 65: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:output_type -> spec.proto.extension.v1.PutObjectTaggingOutput - 10, // 66: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:output_type -> spec.proto.extension.v1.DeleteObjectTaggingOutput - 12, // 67: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:output_type -> spec.proto.extension.v1.GetObjectTaggingOutput - 16, // 68: spec.proto.extension.v1.ObjectStorageService.CopyObject:output_type -> spec.proto.extension.v1.CopyObjectOutput - 21, // 69: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:output_type -> spec.proto.extension.v1.DeleteObjectsOutput - 23, // 70: spec.proto.extension.v1.ObjectStorageService.ListObjects:output_type -> spec.proto.extension.v1.ListObjectsOutput - 29, // 71: spec.proto.extension.v1.ObjectStorageService.GetObjectAcl:output_type -> spec.proto.extension.v1.GetObjectAclOutput - 31, // 72: spec.proto.extension.v1.ObjectStorageService.PutObjectAcl:output_type -> spec.proto.extension.v1.PutObjectAclOutput - 33, // 73: spec.proto.extension.v1.ObjectStorageService.RestoreObject:output_type -> spec.proto.extension.v1.RestoreObjectOutput - 35, // 74: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:output_type -> spec.proto.extension.v1.CreateMultipartUploadOutput - 37, // 75: spec.proto.extension.v1.ObjectStorageService.UploadPart:output_type -> spec.proto.extension.v1.UploadPartOutput - 40, // 76: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:output_type -> spec.proto.extension.v1.UploadPartCopyOutput - 44, // 77: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:output_type -> spec.proto.extension.v1.CompleteMultipartUploadOutput - 46, // 78: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:output_type -> spec.proto.extension.v1.AbortMultipartUploadOutput - 50, // 79: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:output_type -> spec.proto.extension.v1.ListMultipartUploadsOutput - 54, // 80: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:output_type -> spec.proto.extension.v1.ListObjectVersionsOutput - 56, // 81: spec.proto.extension.v1.ObjectStorageService.HeadObject:output_type -> spec.proto.extension.v1.HeadObjectOutput - 58, // 82: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:output_type -> spec.proto.extension.v1.IsObjectExistOutput - 60, // 83: spec.proto.extension.v1.ObjectStorageService.SignURL:output_type -> spec.proto.extension.v1.SignURLOutput - 79, // 84: spec.proto.extension.v1.ObjectStorageService.UpdateDownLoadBandwidthRateLimit:output_type -> google.protobuf.Empty - 79, // 85: spec.proto.extension.v1.ObjectStorageService.UpdateUpLoadBandwidthRateLimit:output_type -> google.protobuf.Empty - 63, // 86: spec.proto.extension.v1.ObjectStorageService.AppendObject:output_type -> spec.proto.extension.v1.AppendObjectOutput - 66, // 87: spec.proto.extension.v1.ObjectStorageService.ListParts:output_type -> spec.proto.extension.v1.ListPartsOutput - 61, // [61:88] is the sub-list for method output_type - 34, // [34:61] 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 + 24, // 16: spec.proto.extension.v1.GetObjectCannedAclOutput.owner:type_name -> spec.proto.extension.v1.Owner + 74, // 17: spec.proto.extension.v1.CreateMultipartUploadInput.meta_data:type_name -> spec.proto.extension.v1.CreateMultipartUploadInput.MetaDataEntry + 13, // 18: spec.proto.extension.v1.UploadPartCopyInput.copy_source:type_name -> spec.proto.extension.v1.CopySource + 37, // 19: spec.proto.extension.v1.UploadPartCopyOutput.copy_part_result:type_name -> spec.proto.extension.v1.CopyPartResult + 39, // 20: spec.proto.extension.v1.CompletedMultipartUpload.parts:type_name -> spec.proto.extension.v1.CompletedPart + 40, // 21: spec.proto.extension.v1.CompleteMultipartUploadInput.multipart_upload:type_name -> spec.proto.extension.v1.CompletedMultipartUpload + 46, // 22: spec.proto.extension.v1.MultipartUpload.initiator:type_name -> spec.proto.extension.v1.Initiator + 24, // 23: spec.proto.extension.v1.MultipartUpload.owner:type_name -> spec.proto.extension.v1.Owner + 47, // 24: spec.proto.extension.v1.ListMultipartUploadsOutput.uploads:type_name -> spec.proto.extension.v1.MultipartUpload + 24, // 25: spec.proto.extension.v1.DeleteMarkerEntry.owner:type_name -> spec.proto.extension.v1.Owner + 24, // 26: spec.proto.extension.v1.ObjectVersion.owner:type_name -> spec.proto.extension.v1.Owner + 50, // 27: spec.proto.extension.v1.ListObjectVersionsOutput.delete_markers:type_name -> spec.proto.extension.v1.DeleteMarkerEntry + 51, // 28: spec.proto.extension.v1.ListObjectVersionsOutput.versions:type_name -> spec.proto.extension.v1.ObjectVersion + 75, // 29: spec.proto.extension.v1.HeadObjectOutput.result_metadata:type_name -> spec.proto.extension.v1.HeadObjectOutput.ResultMetadataEntry + 76, // 30: spec.proto.extension.v1.AppendObjectInput.tags:type_name -> spec.proto.extension.v1.AppendObjectInput.TagsEntry + 63, // 31: spec.proto.extension.v1.ListPartsOutput.parts:type_name -> spec.proto.extension.v1.Part + 0, // 32: spec.proto.extension.v1.ObjectStorageService.InitClient:input_type -> spec.proto.extension.v1.InitInput + 3, // 33: spec.proto.extension.v1.ObjectStorageService.PutObject:input_type -> spec.proto.extension.v1.PutObjectInput + 1, // 34: spec.proto.extension.v1.ObjectStorageService.GetObject:input_type -> spec.proto.extension.v1.GetObjectInput + 5, // 35: spec.proto.extension.v1.ObjectStorageService.DeleteObject:input_type -> spec.proto.extension.v1.DeleteObjectInput + 7, // 36: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:input_type -> spec.proto.extension.v1.PutObjectTaggingInput + 9, // 37: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:input_type -> spec.proto.extension.v1.DeleteObjectTaggingInput + 11, // 38: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:input_type -> spec.proto.extension.v1.GetObjectTaggingInput + 14, // 39: spec.proto.extension.v1.ObjectStorageService.CopyObject:input_type -> spec.proto.extension.v1.CopyObjectInput + 19, // 40: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:input_type -> spec.proto.extension.v1.DeleteObjectsInput + 22, // 41: spec.proto.extension.v1.ObjectStorageService.ListObjects:input_type -> spec.proto.extension.v1.ListObjectsInput + 26, // 42: spec.proto.extension.v1.ObjectStorageService.GetObjectCannedAcl:input_type -> spec.proto.extension.v1.GetObjectCannedAclInput + 28, // 43: spec.proto.extension.v1.ObjectStorageService.PutObjectCannedAcl:input_type -> spec.proto.extension.v1.PutObjectCannedAclInput + 30, // 44: spec.proto.extension.v1.ObjectStorageService.RestoreObject:input_type -> spec.proto.extension.v1.RestoreObjectInput + 32, // 45: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:input_type -> spec.proto.extension.v1.CreateMultipartUploadInput + 34, // 46: spec.proto.extension.v1.ObjectStorageService.UploadPart:input_type -> spec.proto.extension.v1.UploadPartInput + 36, // 47: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:input_type -> spec.proto.extension.v1.UploadPartCopyInput + 41, // 48: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:input_type -> spec.proto.extension.v1.CompleteMultipartUploadInput + 43, // 49: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:input_type -> spec.proto.extension.v1.AbortMultipartUploadInput + 45, // 50: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:input_type -> spec.proto.extension.v1.ListMultipartUploadsInput + 49, // 51: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:input_type -> spec.proto.extension.v1.ListObjectVersionsInput + 53, // 52: spec.proto.extension.v1.ObjectStorageService.HeadObject:input_type -> spec.proto.extension.v1.HeadObjectInput + 55, // 53: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:input_type -> spec.proto.extension.v1.IsObjectExistInput + 57, // 54: spec.proto.extension.v1.ObjectStorageService.SignURL:input_type -> spec.proto.extension.v1.SignURLInput + 59, // 55: spec.proto.extension.v1.ObjectStorageService.UpdateDownLoadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput + 59, // 56: spec.proto.extension.v1.ObjectStorageService.UpdateUpLoadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput + 60, // 57: spec.proto.extension.v1.ObjectStorageService.AppendObject:input_type -> spec.proto.extension.v1.AppendObjectInput + 62, // 58: spec.proto.extension.v1.ObjectStorageService.ListParts:input_type -> spec.proto.extension.v1.ListPartsInput + 77, // 59: spec.proto.extension.v1.ObjectStorageService.InitClient:output_type -> google.protobuf.Empty + 4, // 60: spec.proto.extension.v1.ObjectStorageService.PutObject:output_type -> spec.proto.extension.v1.PutObjectOutput + 2, // 61: spec.proto.extension.v1.ObjectStorageService.GetObject:output_type -> spec.proto.extension.v1.GetObjectOutput + 6, // 62: spec.proto.extension.v1.ObjectStorageService.DeleteObject:output_type -> spec.proto.extension.v1.DeleteObjectOutput + 8, // 63: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:output_type -> spec.proto.extension.v1.PutObjectTaggingOutput + 10, // 64: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:output_type -> spec.proto.extension.v1.DeleteObjectTaggingOutput + 12, // 65: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:output_type -> spec.proto.extension.v1.GetObjectTaggingOutput + 16, // 66: spec.proto.extension.v1.ObjectStorageService.CopyObject:output_type -> spec.proto.extension.v1.CopyObjectOutput + 21, // 67: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:output_type -> spec.proto.extension.v1.DeleteObjectsOutput + 23, // 68: spec.proto.extension.v1.ObjectStorageService.ListObjects:output_type -> spec.proto.extension.v1.ListObjectsOutput + 27, // 69: spec.proto.extension.v1.ObjectStorageService.GetObjectCannedAcl:output_type -> spec.proto.extension.v1.GetObjectCannedAclOutput + 29, // 70: spec.proto.extension.v1.ObjectStorageService.PutObjectCannedAcl:output_type -> spec.proto.extension.v1.PutObjectCannedAclOutput + 31, // 71: spec.proto.extension.v1.ObjectStorageService.RestoreObject:output_type -> spec.proto.extension.v1.RestoreObjectOutput + 33, // 72: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:output_type -> spec.proto.extension.v1.CreateMultipartUploadOutput + 35, // 73: spec.proto.extension.v1.ObjectStorageService.UploadPart:output_type -> spec.proto.extension.v1.UploadPartOutput + 38, // 74: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:output_type -> spec.proto.extension.v1.UploadPartCopyOutput + 42, // 75: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:output_type -> spec.proto.extension.v1.CompleteMultipartUploadOutput + 44, // 76: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:output_type -> spec.proto.extension.v1.AbortMultipartUploadOutput + 48, // 77: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:output_type -> spec.proto.extension.v1.ListMultipartUploadsOutput + 52, // 78: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:output_type -> spec.proto.extension.v1.ListObjectVersionsOutput + 54, // 79: spec.proto.extension.v1.ObjectStorageService.HeadObject:output_type -> spec.proto.extension.v1.HeadObjectOutput + 56, // 80: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:output_type -> spec.proto.extension.v1.IsObjectExistOutput + 58, // 81: spec.proto.extension.v1.ObjectStorageService.SignURL:output_type -> spec.proto.extension.v1.SignURLOutput + 77, // 82: spec.proto.extension.v1.ObjectStorageService.UpdateDownLoadBandwidthRateLimit:output_type -> google.protobuf.Empty + 77, // 83: spec.proto.extension.v1.ObjectStorageService.UpdateUpLoadBandwidthRateLimit:output_type -> google.protobuf.Empty + 61, // 84: spec.proto.extension.v1.ObjectStorageService.AppendObject:output_type -> spec.proto.extension.v1.AppendObjectOutput + 64, // 85: spec.proto.extension.v1.ObjectStorageService.ListParts:output_type -> spec.proto.extension.v1.ListPartsOutput + 59, // [59:86] is the sub-list for method output_type + 32, // [32:59] is the sub-list for method input_type + 32, // [32:32] is the sub-list for extension type_name + 32, // [32:32] is the sub-list for extension extendee + 0, // [0:32] is the sub-list for field type_name } func init() { file_oss_proto_init() } @@ -8109,7 +7954,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Grantee); i { + switch v := v.(*GetObjectCannedAclInput); i { case 0: return &v.state case 1: @@ -8121,7 +7966,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Grant); i { + switch v := v.(*GetObjectCannedAclOutput); i { case 0: return &v.state case 1: @@ -8133,7 +7978,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObjectAclInput); i { + switch v := v.(*PutObjectCannedAclInput); i { case 0: return &v.state case 1: @@ -8145,7 +7990,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObjectAclOutput); i { + switch v := v.(*PutObjectCannedAclOutput); i { case 0: return &v.state case 1: @@ -8157,30 +8002,6 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutObjectAclInput); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_oss_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutObjectAclOutput); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_oss_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RestoreObjectInput); i { case 0: return &v.state @@ -8192,7 +8013,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RestoreObjectOutput); i { case 0: return &v.state @@ -8204,7 +8025,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateMultipartUploadInput); i { case 0: return &v.state @@ -8216,7 +8037,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateMultipartUploadOutput); i { case 0: return &v.state @@ -8228,7 +8049,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UploadPartInput); i { case 0: return &v.state @@ -8240,7 +8061,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UploadPartOutput); i { case 0: return &v.state @@ -8252,7 +8073,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UploadPartCopyInput); i { case 0: return &v.state @@ -8264,7 +8085,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CopyPartResult); i { case 0: return &v.state @@ -8276,7 +8097,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UploadPartCopyOutput); i { case 0: return &v.state @@ -8288,7 +8109,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CompletedPart); i { case 0: return &v.state @@ -8300,7 +8121,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CompletedMultipartUpload); i { case 0: return &v.state @@ -8312,7 +8133,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CompleteMultipartUploadInput); i { case 0: return &v.state @@ -8324,7 +8145,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CompleteMultipartUploadOutput); i { case 0: return &v.state @@ -8336,7 +8157,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AbortMultipartUploadInput); i { case 0: return &v.state @@ -8348,7 +8169,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AbortMultipartUploadOutput); i { case 0: return &v.state @@ -8360,7 +8181,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListMultipartUploadsInput); i { case 0: return &v.state @@ -8372,7 +8193,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Initiator); i { case 0: return &v.state @@ -8384,7 +8205,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MultipartUpload); i { case 0: return &v.state @@ -8396,7 +8217,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListMultipartUploadsOutput); i { case 0: return &v.state @@ -8408,7 +8229,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListObjectVersionsInput); i { case 0: return &v.state @@ -8420,7 +8241,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteMarkerEntry); i { case 0: return &v.state @@ -8432,7 +8253,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ObjectVersion); i { case 0: return &v.state @@ -8444,7 +8265,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListObjectVersionsOutput); i { case 0: return &v.state @@ -8456,7 +8277,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HeadObjectInput); i { case 0: return &v.state @@ -8468,7 +8289,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HeadObjectOutput); i { case 0: return &v.state @@ -8480,7 +8301,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IsObjectExistInput); i { case 0: return &v.state @@ -8492,7 +8313,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IsObjectExistOutput); i { case 0: return &v.state @@ -8504,7 +8325,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SignURLInput); i { case 0: return &v.state @@ -8516,7 +8337,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SignURLOutput); i { case 0: return &v.state @@ -8528,7 +8349,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateBandwidthRateLimitInput); i { case 0: return &v.state @@ -8540,7 +8361,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AppendObjectInput); i { case 0: return &v.state @@ -8552,7 +8373,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AppendObjectOutput); i { case 0: return &v.state @@ -8564,7 +8385,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListPartsInput); i { case 0: return &v.state @@ -8576,7 +8397,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Part); i { case 0: return &v.state @@ -8588,7 +8409,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListPartsOutput); i { case 0: return &v.state @@ -8607,7 +8428,7 @@ func file_oss_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_oss_proto_rawDesc, NumEnums: 0, - NumMessages: 79, + NumMessages: 77, NumExtensions: 0, NumServices: 1, }, diff --git a/spec/proto/extension/v1/oss.proto b/spec/proto/extension/v1/oss.proto index f98c4a73b5..90ee8591ed 100644 --- a/spec/proto/extension/v1/oss.proto +++ b/spec/proto/extension/v1/oss.proto @@ -20,8 +20,8 @@ service ObjectStorageService{ rpc CopyObject(CopyObjectInput) returns(CopyObjectOutput){} rpc DeleteObjects(DeleteObjectsInput) returns(DeleteObjectsOutput){} rpc ListObjects(ListObjectsInput) returns(ListObjectsOutput){} - rpc GetObjectAcl(GetObjectAclInput) returns(GetObjectAclOutput){} - rpc PutObjectAcl(PutObjectAclInput) returns(PutObjectAclOutput){} + rpc GetObjectCannedAcl(GetObjectCannedAclInput) returns(GetObjectCannedAclOutput){} + rpc PutObjectCannedAcl(PutObjectCannedAclInput) returns(PutObjectCannedAclOutput){} rpc RestoreObject(RestoreObjectInput) returns(RestoreObjectOutput){} rpc CreateMultipartUpload(CreateMultipartUploadInput) returns(CreateMultipartUploadOutput){} rpc UploadPart(stream UploadPartInput) returns(UploadPartOutput){} @@ -470,38 +470,22 @@ message Object{ string storage_class = 6; } -message Grantee{ - string display_name = 1; - string email_address = 2; - // The canonical user ID of the grantee. - string id = 3; - string type = 4; - // URI of the grantee group. - string uri = 5; -} - -// Container for grant information. -message Grant{ - Grantee grantee = 1; - // Specifies the permission given to the grantee. - string permission = 2; -} -message GetObjectAclInput{ +message GetObjectCannedAclInput{ string store_name = 1; string bucket = 2; string key = 3; // VersionId used to reference a specific version of the object string version_id = 4; } -message GetObjectAclOutput{ - repeated Grant grants = 1; +message GetObjectCannedAclOutput{ + string canned_acl = 1; Owner owner = 2; // If present, indicates that the requester was successfully charged for the // request. string request_charged = 3; } -message PutObjectAclInput{ +message PutObjectCannedAclInput{ string store_name = 1; string bucket = 2; string key = 3; @@ -510,7 +494,7 @@ message PutObjectAclInput{ // VersionId used to reference a specific version of the object. string version_id = 5; } -message PutObjectAclOutput{ +message PutObjectCannedAclOutput{ string request_charged = 1; } diff --git a/spec/proto/extension/v1/oss_grpc.pb.go b/spec/proto/extension/v1/oss_grpc.pb.go index c2edc2dd32..32f88dc5ee 100644 --- a/spec/proto/extension/v1/oss_grpc.pb.go +++ b/spec/proto/extension/v1/oss_grpc.pb.go @@ -30,8 +30,8 @@ type ObjectStorageServiceClient interface { CopyObject(ctx context.Context, in *CopyObjectInput, opts ...grpc.CallOption) (*CopyObjectOutput, error) DeleteObjects(ctx context.Context, in *DeleteObjectsInput, opts ...grpc.CallOption) (*DeleteObjectsOutput, error) ListObjects(ctx context.Context, in *ListObjectsInput, opts ...grpc.CallOption) (*ListObjectsOutput, error) - GetObjectAcl(ctx context.Context, in *GetObjectAclInput, opts ...grpc.CallOption) (*GetObjectAclOutput, error) - PutObjectAcl(ctx context.Context, in *PutObjectAclInput, opts ...grpc.CallOption) (*PutObjectAclOutput, error) + GetObjectCannedAcl(ctx context.Context, in *GetObjectCannedAclInput, opts ...grpc.CallOption) (*GetObjectCannedAclOutput, error) + PutObjectCannedAcl(ctx context.Context, in *PutObjectCannedAclInput, opts ...grpc.CallOption) (*PutObjectCannedAclOutput, error) RestoreObject(ctx context.Context, in *RestoreObjectInput, opts ...grpc.CallOption) (*RestoreObjectOutput, error) CreateMultipartUpload(ctx context.Context, in *CreateMultipartUploadInput, opts ...grpc.CallOption) (*CreateMultipartUploadOutput, error) UploadPart(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_UploadPartClient, error) @@ -195,18 +195,18 @@ func (c *objectStorageServiceClient) ListObjects(ctx context.Context, in *ListOb return out, nil } -func (c *objectStorageServiceClient) GetObjectAcl(ctx context.Context, in *GetObjectAclInput, opts ...grpc.CallOption) (*GetObjectAclOutput, error) { - out := new(GetObjectAclOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/GetObjectAcl", in, out, opts...) +func (c *objectStorageServiceClient) GetObjectCannedAcl(ctx context.Context, in *GetObjectCannedAclInput, opts ...grpc.CallOption) (*GetObjectCannedAclOutput, error) { + out := new(GetObjectCannedAclOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/GetObjectCannedAcl", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *objectStorageServiceClient) PutObjectAcl(ctx context.Context, in *PutObjectAclInput, opts ...grpc.CallOption) (*PutObjectAclOutput, error) { - out := new(PutObjectAclOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/PutObjectAcl", in, out, opts...) +func (c *objectStorageServiceClient) PutObjectCannedAcl(ctx context.Context, in *PutObjectCannedAclInput, opts ...grpc.CallOption) (*PutObjectCannedAclOutput, error) { + out := new(PutObjectCannedAclOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/PutObjectCannedAcl", in, out, opts...) if err != nil { return nil, err } @@ -412,8 +412,8 @@ type ObjectStorageServiceServer interface { CopyObject(context.Context, *CopyObjectInput) (*CopyObjectOutput, error) DeleteObjects(context.Context, *DeleteObjectsInput) (*DeleteObjectsOutput, error) ListObjects(context.Context, *ListObjectsInput) (*ListObjectsOutput, error) - GetObjectAcl(context.Context, *GetObjectAclInput) (*GetObjectAclOutput, error) - PutObjectAcl(context.Context, *PutObjectAclInput) (*PutObjectAclOutput, error) + GetObjectCannedAcl(context.Context, *GetObjectCannedAclInput) (*GetObjectCannedAclOutput, error) + PutObjectCannedAcl(context.Context, *PutObjectCannedAclInput) (*PutObjectCannedAclOutput, error) RestoreObject(context.Context, *RestoreObjectInput) (*RestoreObjectOutput, error) CreateMultipartUpload(context.Context, *CreateMultipartUploadInput) (*CreateMultipartUploadOutput, error) UploadPart(ObjectStorageService_UploadPartServer) error @@ -465,11 +465,11 @@ func (UnimplementedObjectStorageServiceServer) DeleteObjects(context.Context, *D func (UnimplementedObjectStorageServiceServer) ListObjects(context.Context, *ListObjectsInput) (*ListObjectsOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method ListObjects not implemented") } -func (UnimplementedObjectStorageServiceServer) GetObjectAcl(context.Context, *GetObjectAclInput) (*GetObjectAclOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetObjectAcl not implemented") +func (UnimplementedObjectStorageServiceServer) GetObjectCannedAcl(context.Context, *GetObjectCannedAclInput) (*GetObjectCannedAclOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetObjectCannedAcl not implemented") } -func (UnimplementedObjectStorageServiceServer) PutObjectAcl(context.Context, *PutObjectAclInput) (*PutObjectAclOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method PutObjectAcl not implemented") +func (UnimplementedObjectStorageServiceServer) PutObjectCannedAcl(context.Context, *PutObjectCannedAclInput) (*PutObjectCannedAclOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method PutObjectCannedAcl not implemented") } func (UnimplementedObjectStorageServiceServer) RestoreObject(context.Context, *RestoreObjectInput) (*RestoreObjectOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method RestoreObject not implemented") @@ -719,38 +719,38 @@ func _ObjectStorageService_ListObjects_Handler(srv interface{}, ctx context.Cont return interceptor(ctx, in, info, handler) } -func _ObjectStorageService_GetObjectAcl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetObjectAclInput) +func _ObjectStorageService_GetObjectCannedAcl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetObjectCannedAclInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ObjectStorageServiceServer).GetObjectAcl(ctx, in) + return srv.(ObjectStorageServiceServer).GetObjectCannedAcl(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/GetObjectAcl", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/GetObjectCannedAcl", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).GetObjectAcl(ctx, req.(*GetObjectAclInput)) + return srv.(ObjectStorageServiceServer).GetObjectCannedAcl(ctx, req.(*GetObjectCannedAclInput)) } return interceptor(ctx, in, info, handler) } -func _ObjectStorageService_PutObjectAcl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PutObjectAclInput) +func _ObjectStorageService_PutObjectCannedAcl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PutObjectCannedAclInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ObjectStorageServiceServer).PutObjectAcl(ctx, in) + return srv.(ObjectStorageServiceServer).PutObjectCannedAcl(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/PutObjectAcl", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/PutObjectCannedAcl", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).PutObjectAcl(ctx, req.(*PutObjectAclInput)) + return srv.(ObjectStorageServiceServer).PutObjectCannedAcl(ctx, req.(*PutObjectCannedAclInput)) } return interceptor(ctx, in, info, handler) } @@ -1081,12 +1081,12 @@ var ObjectStorageService_ServiceDesc = grpc.ServiceDesc{ Handler: _ObjectStorageService_ListObjects_Handler, }, { - MethodName: "GetObjectAcl", - Handler: _ObjectStorageService_GetObjectAcl_Handler, + MethodName: "GetObjectCannedAcl", + Handler: _ObjectStorageService_GetObjectCannedAcl_Handler, }, { - MethodName: "PutObjectAcl", - Handler: _ObjectStorageService_PutObjectAcl_Handler, + MethodName: "PutObjectCannedAcl", + Handler: _ObjectStorageService_PutObjectCannedAcl_Handler, }, { MethodName: "RestoreObject", From f5368c304408321654fd6f0b4c16a5a1ba40aa8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 27 Jun 2022 15:27:02 +0800 Subject: [PATCH 044/126] fix client --- demo/file/s3/client.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/demo/file/s3/client.go b/demo/file/s3/client.go index 9ad64d7e84..ca26822261 100644 --- a/demo/file/s3/client.go +++ b/demo/file/s3/client.go @@ -190,16 +190,16 @@ func TestAcl(name string) { return } c := s3.NewObjectStorageServiceClient(conn) - req := &s3.GetObjectAclInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name} - resp, err := c.GetObjectAcl(context.Background(), req) + req := &s3.GetObjectCannedAclInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name} + resp, err := c.GetObjectCannedAcl(context.Background(), req) if err != nil { fmt.Printf("GetObjectAcl fail, err: %+v \n", err) return } fmt.Printf("get acl success, resp: %+v\n", resp) - putRequest := &s3.PutObjectAclInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name, Acl: "public-read-write"} - resp2, err := c.PutObjectAcl(context.Background(), putRequest) + putRequest := &s3.PutObjectCannedAclInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name, Acl: "public-read-write"} + resp2, err := c.PutObjectCannedAcl(context.Background(), putRequest) if err != nil { fmt.Printf("TestAcl fail, err: %+v \n", err) return From f27bf5bfc92ed5badb34c554ba097b7d7f9b344d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 27 Jun 2022 15:41:45 +0800 Subject: [PATCH 045/126] fix exist ut --- components/file/aliyun/file.go | 16 +++++----------- components/file/aliyun/file_test.go | 10 +++++----- components/file/aliyun/oss_test.go | 3 +-- 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/components/file/aliyun/file.go b/components/file/aliyun/file.go index e0e59760ad..75f5513139 100644 --- a/components/file/aliyun/file.go +++ b/components/file/aliyun/file.go @@ -64,6 +64,7 @@ func (s *AliyunOSS) Init(ctx context.Context, metadata *file.FileConfig) error { if err != nil { return err } + s.client[v.Uid] = client //use bucket as key, client as value for _, bucketName := range v.Buckets { if _, ok := s.client[bucketName]; ok { @@ -210,22 +211,15 @@ func (s *AliyunOSS) getClient(metadata *file.OssMetadata) (*oss.Client, error) { func (s *AliyunOSS) getBucket(fileName string, metaData map[string]string) (*oss.Bucket, error) { var ossClient *oss.Client var err error - // get oss client - if _, ok := metaData[endpointKey]; ok { - ossClient = s.client[endpointKey] - } else { - // if user not specify endpoint, try to use default client - ossClient, err = s.selectClient("") - if err != nil { - return nil, err - } - } - // get oss bucket bucketName, err := util.GetBucketName(fileName) if err != nil { return nil, err } + ossClient, err = s.selectClient(bucketName) + if err != nil { + return nil, err + } bucket, err := ossClient.Bucket(bucketName) if err != nil { return nil, err diff --git a/components/file/aliyun/file_test.go b/components/file/aliyun/file_test.go index c50ba34256..1dfe3eb5d7 100644 --- a/components/file/aliyun/file_test.go +++ b/components/file/aliyun/file_test.go @@ -52,19 +52,19 @@ func TestInit(t *testing.T) { func TestSelectClient(t *testing.T) { ossObject := &AliyunOSS{client: make(map[string]*oss.Client)} - client, err := ossObject.selectClient(map[string]string{}, "") + client, err := ossObject.selectClient("") assert.Equal(t, err.Error(), "should specific endpoint in metadata") assert.Nil(t, client) client1 := &oss.Client{} ossObject.client["127.0.0.1"] = client1 - client, err = ossObject.selectClient(map[string]string{}, "") + client, err = ossObject.selectClient("") assert.Equal(t, client, client1) assert.Nil(t, err) client2 := &oss.Client{} ossObject.client["0.0.0.0"] = client2 - client, err = ossObject.selectClient(map[string]string{}, "") + client, err = ossObject.selectClient("") assert.Equal(t, err.Error(), "should specific endpoint in metadata") assert.Nil(t, client) } @@ -100,7 +100,7 @@ func TestGetClient(t *testing.T) { assert.Nil(t, err) ac := oss.(*AliyunOSS) - mt := &OssMetadata{ + mt := &file.OssMetadata{ Endpoint: "endpoint", AccessKeyID: "ak", AccessKeySecret: "ak", @@ -121,7 +121,7 @@ func TestCheckMetadata(t *testing.T) { assert.Nil(t, err) ac := oss.(*AliyunOSS) - mt := &OssMetadata{ + mt := &file.OssMetadata{ Endpoint: "", AccessKeyID: "", AccessKeySecret: "", diff --git a/components/file/aliyun/oss_test.go b/components/file/aliyun/oss_test.go index bf79928d6e..652d44d1cc 100644 --- a/components/file/aliyun/oss_test.go +++ b/components/file/aliyun/oss_test.go @@ -39,9 +39,8 @@ const ( func TestInitAliyunOss(t *testing.T) { NewAliyunOss() f := factory.GetInitFunc(DefaultClientInitFunc) - assert.Equal(t, f, AliyunDefaultInitFunc) clients, err := f([]byte("hello"), map[string]string{}) assert.Equal(t, err, file.ErrInvalid) - assert.Equal(t, nil, clients) + assert.Nil(t, clients) //oss.InitConfig(context.TODO(), file.FileConfig{}) } From d4ee7833511fe3d1ce54b37627b53a53a6a4e715 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 27 Jun 2022 16:09:42 +0800 Subject: [PATCH 046/126] fix compile error --- pkg/grpc/extension/s3/s3.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go index 72d3f3013e..78fe5e5354 100644 --- a/pkg/grpc/extension/s3/s3.go +++ b/pkg/grpc/extension/s3/s3.go @@ -349,7 +349,7 @@ func (s *S3Server) ListObjects(ctx context.Context, req *s3.ListObjectsInput) (* return output, nil } -func (s *S3Server) GetObjectAcl(ctx context.Context, req *s3.GetObjectAclInput) (*s3.GetObjectAclOutput, error) { +func (s *S3Server) GetObjectCannedAcl(ctx context.Context, req *s3.GetObjectCannedAclInput) (*s3.GetObjectCannedAclOutput, error) { if s.ossInstance[req.StoreName] == nil { return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } @@ -359,10 +359,10 @@ func (s *S3Server) GetObjectAcl(ctx context.Context, req *s3.GetObjectAclInput) return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for GetObjectAcl,err: %+v", err) } var resp *l8s3.GetObjectCannedAclOutput - if resp, err = s.ossInstance[req.StoreName].GetObjectAcl(ctx, st); err != nil { + if resp, err = s.ossInstance[req.StoreName].GetObjectCannedAcl(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) } - output := &s3.GetObjectAclOutput{} + output := &s3.GetObjectCannedAclOutput{} err = transferData(resp, output) if err != nil { return nil, status.Errorf(codes.Internal, "transfer response data fail for GetObjectAcl,err: %+v", err) @@ -370,7 +370,7 @@ func (s *S3Server) GetObjectAcl(ctx context.Context, req *s3.GetObjectAclInput) return output, nil } -func (s *S3Server) PutObjectAcl(ctx context.Context, req *s3.PutObjectAclInput) (*s3.PutObjectAclOutput, error) { +func (s *S3Server) PutObjectCannedAcl(ctx context.Context, req *s3.PutObjectCannedAclInput) (*s3.PutObjectCannedAclOutput, error) { if s.ossInstance[req.StoreName] == nil { return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } @@ -380,10 +380,10 @@ func (s *S3Server) PutObjectAcl(ctx context.Context, req *s3.PutObjectAclInput) return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for PutObjectAcl,err: %+v", err) } var resp *l8s3.PutObjectCannedAclOutput - if resp, err = s.ossInstance[req.StoreName].PutObjectAcl(ctx, st); err != nil { + if resp, err = s.ossInstance[req.StoreName].PutObjectCannedAcl(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) } - output := &s3.PutObjectAclOutput{} + output := &s3.PutObjectCannedAclOutput{} err = transferData(resp, output) if err != nil { return nil, status.Errorf(codes.Internal, "transfer response data fail for PutObjectAcl,err: %+v", err) From f5422bcc7a32d983a6880f3716eb37ff4beeca53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 27 Jun 2022 17:43:59 +0800 Subject: [PATCH 047/126] add s3 ut --- pkg/grpc/extension/s3/s3.go | 5 - pkg/grpc/extension/s3/s3_test.go | 91 +++++++ pkg/mock/components/oss/oss.go | 452 +++++++++++++++++++++++++++++++ 3 files changed, 543 insertions(+), 5 deletions(-) create mode 100644 pkg/grpc/extension/s3/s3_test.go create mode 100644 pkg/mock/components/oss/oss.go diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go index 78fe5e5354..1077c2b4d9 100644 --- a/pkg/grpc/extension/s3/s3.go +++ b/pkg/grpc/extension/s3/s3.go @@ -46,11 +46,6 @@ var ( } ) -const ( - Region = "region" - EndPoint = "endpoint" -) - type S3Server struct { appId string ossInstance map[string]l8s3.Oss diff --git a/pkg/grpc/extension/s3/s3_test.go b/pkg/grpc/extension/s3/s3_test.go new file mode 100644 index 0000000000..c937a06225 --- /dev/null +++ b/pkg/grpc/extension/s3/s3_test.go @@ -0,0 +1,91 @@ +/* + * 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 s3 + +import ( + "context" + "errors" + "testing" + + "mosn.io/pkg/buffer" + + mock_s3 "mosn.io/layotto/pkg/mock/runtime/oss" + + "github.com/stretchr/testify/assert" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + s3 "mosn.io/layotto/spec/proto/extension/v1" + + "mosn.io/layotto/components/file" + l8s3 "mosn.io/layotto/components/file" + + "github.com/golang/mock/gomock" + + mock_oss "mosn.io/layotto/pkg/mock/components/oss" + + "mosn.io/layotto/pkg/grpc" +) + +type MockDataStream struct { + buffer.IoBuffer +} + +func (m *MockDataStream) Close() error { + m.CloseWithError(nil) + return nil +} + +func TestS3Server(t *testing.T) { + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockoss := mock_oss.NewMockOss(ctrl) + ac.Oss["mockoss"] = mockoss + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + // Test InitClient function + initReq := &s3.InitInput{StoreName: "NoStore", Metadata: map[string]string{"k": "v"}} + ctx := context.TODO() + _, err := s3Server.InitClient(ctx, initReq) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + mockoss.EXPECT().InitClient(ctx, &l8s3.InitRequest{Metadata: initReq.Metadata}).Return(nil) + initReq.StoreName = "mockoss" + _, err = s3Server.InitClient(ctx, initReq) + assert.Nil(t, err) + + mockoss.EXPECT().InitClient(ctx, &l8s3.InitRequest{Metadata: initReq.Metadata}).Return(errors.New("init fail")) + _, err = s3Server.InitClient(ctx, initReq) + assert.Equal(t, err.Error(), "init fail") + + // Test GetObject function + mockServer := mock_s3.NewMockObjectStorageService_GetObjectServer(ctrl) + getObjectReq := &s3.GetObjectInput{StoreName: "NoStore", Bucket: "layotto", Key: "object"} + err = s3Server.GetObject(getObjectReq, mockServer) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + iobuf := buffer.NewIoBufferBytes([]byte("hello")) + dataStream := &MockDataStream{iobuf} + output := &file.GetObjectOutput{Etag: "tag"} + output.DataStream = dataStream + mockServer.EXPECT().Context().Return(ctx) + mockoss.EXPECT().GetObject(ctx, &l8s3.GetObjectInput{Bucket: "layotto", Key: "object"}).Return(output, nil) + getObjectReq.StoreName = "mockoss" + mockServer.EXPECT().Send(&s3.GetObjectOutput{Body: []byte("hello"), Etag: "tag"}).Times(1) + err = s3Server.GetObject(getObjectReq, mockServer) + assert.Nil(t, err) + +} diff --git a/pkg/mock/components/oss/oss.go b/pkg/mock/components/oss/oss.go new file mode 100644 index 0000000000..96e5549601 --- /dev/null +++ b/pkg/mock/components/oss/oss.go @@ -0,0 +1,452 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: oss.go + +// Package mock_oss is a generated GoMock package. +package mock_oss + +import ( + context "context" + reflect "reflect" + + gomock "github.com/golang/mock/gomock" + file "mosn.io/layotto/components/file" +) + +// MockOss is a mock of Oss interface. +type MockOss struct { + ctrl *gomock.Controller + recorder *MockOssMockRecorder +} + +// MockOssMockRecorder is the mock recorder for MockOss. +type MockOssMockRecorder struct { + mock *MockOss +} + +// NewMockOss creates a new mock instance. +func NewMockOss(ctrl *gomock.Controller) *MockOss { + mock := &MockOss{ctrl: ctrl} + mock.recorder = &MockOssMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockOss) EXPECT() *MockOssMockRecorder { + return m.recorder +} + +// AbortMultipartUpload mocks base method. +func (m *MockOss) AbortMultipartUpload(arg0 context.Context, arg1 *file.AbortMultipartUploadInput) (*file.AbortMultipartUploadOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AbortMultipartUpload", arg0, arg1) + ret0, _ := ret[0].(*file.AbortMultipartUploadOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AbortMultipartUpload indicates an expected call of AbortMultipartUpload. +func (mr *MockOssMockRecorder) AbortMultipartUpload(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AbortMultipartUpload", reflect.TypeOf((*MockOss)(nil).AbortMultipartUpload), arg0, arg1) +} + +// AppendObject mocks base method. +func (m *MockOss) AppendObject(arg0 context.Context, arg1 *file.AppendObjectInput) (*file.AppendObjectOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AppendObject", arg0, arg1) + ret0, _ := ret[0].(*file.AppendObjectOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AppendObject indicates an expected call of AppendObject. +func (mr *MockOssMockRecorder) AppendObject(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AppendObject", reflect.TypeOf((*MockOss)(nil).AppendObject), arg0, arg1) +} + +// CompleteMultipartUpload mocks base method. +func (m *MockOss) CompleteMultipartUpload(arg0 context.Context, arg1 *file.CompleteMultipartUploadInput) (*file.CompleteMultipartUploadOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CompleteMultipartUpload", arg0, arg1) + ret0, _ := ret[0].(*file.CompleteMultipartUploadOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CompleteMultipartUpload indicates an expected call of CompleteMultipartUpload. +func (mr *MockOssMockRecorder) CompleteMultipartUpload(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CompleteMultipartUpload", reflect.TypeOf((*MockOss)(nil).CompleteMultipartUpload), arg0, arg1) +} + +// CopyObject mocks base method. +func (m *MockOss) CopyObject(arg0 context.Context, arg1 *file.CopyObjectInput) (*file.CopyObjectOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CopyObject", arg0, arg1) + ret0, _ := ret[0].(*file.CopyObjectOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CopyObject indicates an expected call of CopyObject. +func (mr *MockOssMockRecorder) CopyObject(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CopyObject", reflect.TypeOf((*MockOss)(nil).CopyObject), arg0, arg1) +} + +// CreateMultipartUpload mocks base method. +func (m *MockOss) CreateMultipartUpload(arg0 context.Context, arg1 *file.CreateMultipartUploadInput) (*file.CreateMultipartUploadOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateMultipartUpload", arg0, arg1) + ret0, _ := ret[0].(*file.CreateMultipartUploadOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateMultipartUpload indicates an expected call of CreateMultipartUpload. +func (mr *MockOssMockRecorder) CreateMultipartUpload(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateMultipartUpload", reflect.TypeOf((*MockOss)(nil).CreateMultipartUpload), arg0, arg1) +} + +// DeleteObject mocks base method. +func (m *MockOss) DeleteObject(arg0 context.Context, arg1 *file.DeleteObjectInput) (*file.DeleteObjectOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteObject", arg0, arg1) + ret0, _ := ret[0].(*file.DeleteObjectOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteObject indicates an expected call of DeleteObject. +func (mr *MockOssMockRecorder) DeleteObject(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteObject", reflect.TypeOf((*MockOss)(nil).DeleteObject), arg0, arg1) +} + +// DeleteObjectTagging mocks base method. +func (m *MockOss) DeleteObjectTagging(arg0 context.Context, arg1 *file.DeleteObjectTaggingInput) (*file.DeleteObjectTaggingOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteObjectTagging", arg0, arg1) + ret0, _ := ret[0].(*file.DeleteObjectTaggingOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteObjectTagging indicates an expected call of DeleteObjectTagging. +func (mr *MockOssMockRecorder) DeleteObjectTagging(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteObjectTagging", reflect.TypeOf((*MockOss)(nil).DeleteObjectTagging), arg0, arg1) +} + +// DeleteObjects mocks base method. +func (m *MockOss) DeleteObjects(arg0 context.Context, arg1 *file.DeleteObjectsInput) (*file.DeleteObjectsOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteObjects", arg0, arg1) + ret0, _ := ret[0].(*file.DeleteObjectsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteObjects indicates an expected call of DeleteObjects. +func (mr *MockOssMockRecorder) DeleteObjects(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteObjects", reflect.TypeOf((*MockOss)(nil).DeleteObjects), arg0, arg1) +} + +// GetObject mocks base method. +func (m *MockOss) GetObject(arg0 context.Context, arg1 *file.GetObjectInput) (*file.GetObjectOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetObject", arg0, arg1) + ret0, _ := ret[0].(*file.GetObjectOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetObject indicates an expected call of GetObject. +func (mr *MockOssMockRecorder) GetObject(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObject", reflect.TypeOf((*MockOss)(nil).GetObject), arg0, arg1) +} + +// GetObjectCannedAcl mocks base method. +func (m *MockOss) GetObjectCannedAcl(arg0 context.Context, arg1 *file.GetObjectCannedAclInput) (*file.GetObjectCannedAclOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetObjectCannedAcl", arg0, arg1) + ret0, _ := ret[0].(*file.GetObjectCannedAclOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetObjectCannedAcl indicates an expected call of GetObjectCannedAcl. +func (mr *MockOssMockRecorder) GetObjectCannedAcl(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObjectCannedAcl", reflect.TypeOf((*MockOss)(nil).GetObjectCannedAcl), arg0, arg1) +} + +// GetObjectTagging mocks base method. +func (m *MockOss) GetObjectTagging(arg0 context.Context, arg1 *file.GetObjectTaggingInput) (*file.GetObjectTaggingOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetObjectTagging", arg0, arg1) + ret0, _ := ret[0].(*file.GetObjectTaggingOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetObjectTagging indicates an expected call of GetObjectTagging. +func (mr *MockOssMockRecorder) GetObjectTagging(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObjectTagging", reflect.TypeOf((*MockOss)(nil).GetObjectTagging), arg0, arg1) +} + +// HeadObject mocks base method. +func (m *MockOss) HeadObject(arg0 context.Context, arg1 *file.HeadObjectInput) (*file.HeadObjectOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HeadObject", arg0, arg1) + ret0, _ := ret[0].(*file.HeadObjectOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// HeadObject indicates an expected call of HeadObject. +func (mr *MockOssMockRecorder) HeadObject(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HeadObject", reflect.TypeOf((*MockOss)(nil).HeadObject), arg0, arg1) +} + +// InitClient mocks base method. +func (m *MockOss) InitClient(arg0 context.Context, arg1 *file.InitRequest) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InitClient", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// InitClient indicates an expected call of InitClient. +func (mr *MockOssMockRecorder) InitClient(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InitClient", reflect.TypeOf((*MockOss)(nil).InitClient), arg0, arg1) +} + +// InitConfig mocks base method. +func (m *MockOss) InitConfig(arg0 context.Context, arg1 *file.FileConfig) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InitConfig", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// InitConfig indicates an expected call of InitConfig. +func (mr *MockOssMockRecorder) InitConfig(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InitConfig", reflect.TypeOf((*MockOss)(nil).InitConfig), arg0, arg1) +} + +// IsObjectExist mocks base method. +func (m *MockOss) IsObjectExist(arg0 context.Context, arg1 *file.IsObjectExistInput) (*file.IsObjectExistOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsObjectExist", arg0, arg1) + ret0, _ := ret[0].(*file.IsObjectExistOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// IsObjectExist indicates an expected call of IsObjectExist. +func (mr *MockOssMockRecorder) IsObjectExist(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsObjectExist", reflect.TypeOf((*MockOss)(nil).IsObjectExist), arg0, arg1) +} + +// ListMultipartUploads mocks base method. +func (m *MockOss) ListMultipartUploads(arg0 context.Context, arg1 *file.ListMultipartUploadsInput) (*file.ListMultipartUploadsOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListMultipartUploads", arg0, arg1) + ret0, _ := ret[0].(*file.ListMultipartUploadsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListMultipartUploads indicates an expected call of ListMultipartUploads. +func (mr *MockOssMockRecorder) ListMultipartUploads(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListMultipartUploads", reflect.TypeOf((*MockOss)(nil).ListMultipartUploads), arg0, arg1) +} + +// ListObjectVersions mocks base method. +func (m *MockOss) ListObjectVersions(arg0 context.Context, arg1 *file.ListObjectVersionsInput) (*file.ListObjectVersionsOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListObjectVersions", arg0, arg1) + ret0, _ := ret[0].(*file.ListObjectVersionsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListObjectVersions indicates an expected call of ListObjectVersions. +func (mr *MockOssMockRecorder) ListObjectVersions(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListObjectVersions", reflect.TypeOf((*MockOss)(nil).ListObjectVersions), arg0, arg1) +} + +// ListObjects mocks base method. +func (m *MockOss) ListObjects(arg0 context.Context, arg1 *file.ListObjectsInput) (*file.ListObjectsOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListObjects", arg0, arg1) + ret0, _ := ret[0].(*file.ListObjectsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListObjects indicates an expected call of ListObjects. +func (mr *MockOssMockRecorder) ListObjects(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListObjects", reflect.TypeOf((*MockOss)(nil).ListObjects), arg0, arg1) +} + +// ListParts mocks base method. +func (m *MockOss) ListParts(arg0 context.Context, arg1 *file.ListPartsInput) (*file.ListPartsOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListParts", arg0, arg1) + ret0, _ := ret[0].(*file.ListPartsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListParts indicates an expected call of ListParts. +func (mr *MockOssMockRecorder) ListParts(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListParts", reflect.TypeOf((*MockOss)(nil).ListParts), arg0, arg1) +} + +// PutObject mocks base method. +func (m *MockOss) PutObject(arg0 context.Context, arg1 *file.PutObjectInput) (*file.PutObjectOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PutObject", arg0, arg1) + ret0, _ := ret[0].(*file.PutObjectOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PutObject indicates an expected call of PutObject. +func (mr *MockOssMockRecorder) PutObject(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutObject", reflect.TypeOf((*MockOss)(nil).PutObject), arg0, arg1) +} + +// PutObjectCannedAcl mocks base method. +func (m *MockOss) PutObjectCannedAcl(arg0 context.Context, arg1 *file.PutObjectCannedAclInput) (*file.PutObjectCannedAclOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PutObjectCannedAcl", arg0, arg1) + ret0, _ := ret[0].(*file.PutObjectCannedAclOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PutObjectCannedAcl indicates an expected call of PutObjectCannedAcl. +func (mr *MockOssMockRecorder) PutObjectCannedAcl(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutObjectCannedAcl", reflect.TypeOf((*MockOss)(nil).PutObjectCannedAcl), arg0, arg1) +} + +// PutObjectTagging mocks base method. +func (m *MockOss) PutObjectTagging(arg0 context.Context, arg1 *file.PutObjectTaggingInput) (*file.PutObjectTaggingOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PutObjectTagging", arg0, arg1) + ret0, _ := ret[0].(*file.PutObjectTaggingOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PutObjectTagging indicates an expected call of PutObjectTagging. +func (mr *MockOssMockRecorder) PutObjectTagging(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutObjectTagging", reflect.TypeOf((*MockOss)(nil).PutObjectTagging), arg0, arg1) +} + +// RestoreObject mocks base method. +func (m *MockOss) RestoreObject(arg0 context.Context, arg1 *file.RestoreObjectInput) (*file.RestoreObjectOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RestoreObject", arg0, arg1) + ret0, _ := ret[0].(*file.RestoreObjectOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RestoreObject indicates an expected call of RestoreObject. +func (mr *MockOssMockRecorder) RestoreObject(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RestoreObject", reflect.TypeOf((*MockOss)(nil).RestoreObject), arg0, arg1) +} + +// SignURL mocks base method. +func (m *MockOss) SignURL(arg0 context.Context, arg1 *file.SignURLInput) (*file.SignURLOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SignURL", arg0, arg1) + ret0, _ := ret[0].(*file.SignURLOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SignURL indicates an expected call of SignURL. +func (mr *MockOssMockRecorder) SignURL(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SignURL", reflect.TypeOf((*MockOss)(nil).SignURL), arg0, arg1) +} + +// UpdateDownLoadBandwidthRateLimit mocks base method. +func (m *MockOss) UpdateDownLoadBandwidthRateLimit(arg0 context.Context, arg1 *file.UpdateBandwidthRateLimitInput) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateDownLoadBandwidthRateLimit", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// UpdateDownLoadBandwidthRateLimit indicates an expected call of UpdateDownLoadBandwidthRateLimit. +func (mr *MockOssMockRecorder) UpdateDownLoadBandwidthRateLimit(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDownLoadBandwidthRateLimit", reflect.TypeOf((*MockOss)(nil).UpdateDownLoadBandwidthRateLimit), arg0, arg1) +} + +// UpdateUpLoadBandwidthRateLimit mocks base method. +func (m *MockOss) UpdateUpLoadBandwidthRateLimit(arg0 context.Context, arg1 *file.UpdateBandwidthRateLimitInput) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateUpLoadBandwidthRateLimit", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// UpdateUpLoadBandwidthRateLimit indicates an expected call of UpdateUpLoadBandwidthRateLimit. +func (mr *MockOssMockRecorder) UpdateUpLoadBandwidthRateLimit(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateUpLoadBandwidthRateLimit", reflect.TypeOf((*MockOss)(nil).UpdateUpLoadBandwidthRateLimit), arg0, arg1) +} + +// UploadPart mocks base method. +func (m *MockOss) UploadPart(arg0 context.Context, arg1 *file.UploadPartInput) (*file.UploadPartOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UploadPart", arg0, arg1) + ret0, _ := ret[0].(*file.UploadPartOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UploadPart indicates an expected call of UploadPart. +func (mr *MockOssMockRecorder) UploadPart(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UploadPart", reflect.TypeOf((*MockOss)(nil).UploadPart), arg0, arg1) +} + +// UploadPartCopy mocks base method. +func (m *MockOss) UploadPartCopy(arg0 context.Context, arg1 *file.UploadPartCopyInput) (*file.UploadPartCopyOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UploadPartCopy", arg0, arg1) + ret0, _ := ret[0].(*file.UploadPartCopyOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UploadPartCopy indicates an expected call of UploadPartCopy. +func (mr *MockOssMockRecorder) UploadPartCopy(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UploadPartCopy", reflect.TypeOf((*MockOss)(nil).UploadPartCopy), arg0, arg1) +} From 8e5fa59c0e8c36f765cdb741122a6968991565b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 27 Jun 2022 17:48:11 +0800 Subject: [PATCH 048/126] fix conflict --- pkg/mock/components/oss/oss.go | 1 + pkg/mock/runtime/oss/oss.go | 2094 ++++++++++++++++++++++++++++++++ 2 files changed, 2095 insertions(+) create mode 100644 pkg/mock/runtime/oss/oss.go diff --git a/pkg/mock/components/oss/oss.go b/pkg/mock/components/oss/oss.go index 96e5549601..e4eec70f94 100644 --- a/pkg/mock/components/oss/oss.go +++ b/pkg/mock/components/oss/oss.go @@ -9,6 +9,7 @@ import ( reflect "reflect" gomock "github.com/golang/mock/gomock" + file "mosn.io/layotto/components/file" ) diff --git a/pkg/mock/runtime/oss/oss.go b/pkg/mock/runtime/oss/oss.go new file mode 100644 index 0000000000..5cb92da3d6 --- /dev/null +++ b/pkg/mock/runtime/oss/oss.go @@ -0,0 +1,2094 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: oss_grpc.pb.go + +// Package mock_s3 is a generated GoMock package. +package mock_s3 + +import ( + context "context" + reflect "reflect" + + gomock "github.com/golang/mock/gomock" + grpc "google.golang.org/grpc" + metadata "google.golang.org/grpc/metadata" + emptypb "google.golang.org/protobuf/types/known/emptypb" + + v1 "mosn.io/layotto/spec/proto/extension/v1" +) + +// MockObjectStorageServiceClient is a mock of ObjectStorageServiceClient interface. +type MockObjectStorageServiceClient struct { + ctrl *gomock.Controller + recorder *MockObjectStorageServiceClientMockRecorder +} + +// MockObjectStorageServiceClientMockRecorder is the mock recorder for MockObjectStorageServiceClient. +type MockObjectStorageServiceClientMockRecorder struct { + mock *MockObjectStorageServiceClient +} + +// NewMockObjectStorageServiceClient creates a new mock instance. +func NewMockObjectStorageServiceClient(ctrl *gomock.Controller) *MockObjectStorageServiceClient { + mock := &MockObjectStorageServiceClient{ctrl: ctrl} + mock.recorder = &MockObjectStorageServiceClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockObjectStorageServiceClient) EXPECT() *MockObjectStorageServiceClientMockRecorder { + return m.recorder +} + +// AbortMultipartUpload mocks base method. +func (m *MockObjectStorageServiceClient) AbortMultipartUpload(ctx context.Context, in *v1.AbortMultipartUploadInput, opts ...grpc.CallOption) (*v1.AbortMultipartUploadOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "AbortMultipartUpload", varargs...) + ret0, _ := ret[0].(*v1.AbortMultipartUploadOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AbortMultipartUpload indicates an expected call of AbortMultipartUpload. +func (mr *MockObjectStorageServiceClientMockRecorder) AbortMultipartUpload(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AbortMultipartUpload", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).AbortMultipartUpload), varargs...) +} + +// AppendObject mocks base method. +func (m *MockObjectStorageServiceClient) AppendObject(ctx context.Context, opts ...grpc.CallOption) (v1.ObjectStorageService_AppendObjectClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "AppendObject", varargs...) + ret0, _ := ret[0].(v1.ObjectStorageService_AppendObjectClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AppendObject indicates an expected call of AppendObject. +func (mr *MockObjectStorageServiceClientMockRecorder) AppendObject(ctx interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AppendObject", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).AppendObject), varargs...) +} + +// CompleteMultipartUpload mocks base method. +func (m *MockObjectStorageServiceClient) CompleteMultipartUpload(ctx context.Context, in *v1.CompleteMultipartUploadInput, opts ...grpc.CallOption) (*v1.CompleteMultipartUploadOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "CompleteMultipartUpload", varargs...) + ret0, _ := ret[0].(*v1.CompleteMultipartUploadOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CompleteMultipartUpload indicates an expected call of CompleteMultipartUpload. +func (mr *MockObjectStorageServiceClientMockRecorder) CompleteMultipartUpload(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CompleteMultipartUpload", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).CompleteMultipartUpload), varargs...) +} + +// CopyObject mocks base method. +func (m *MockObjectStorageServiceClient) CopyObject(ctx context.Context, in *v1.CopyObjectInput, opts ...grpc.CallOption) (*v1.CopyObjectOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "CopyObject", varargs...) + ret0, _ := ret[0].(*v1.CopyObjectOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CopyObject indicates an expected call of CopyObject. +func (mr *MockObjectStorageServiceClientMockRecorder) CopyObject(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CopyObject", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).CopyObject), varargs...) +} + +// CreateMultipartUpload mocks base method. +func (m *MockObjectStorageServiceClient) CreateMultipartUpload(ctx context.Context, in *v1.CreateMultipartUploadInput, opts ...grpc.CallOption) (*v1.CreateMultipartUploadOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "CreateMultipartUpload", varargs...) + ret0, _ := ret[0].(*v1.CreateMultipartUploadOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateMultipartUpload indicates an expected call of CreateMultipartUpload. +func (mr *MockObjectStorageServiceClientMockRecorder) CreateMultipartUpload(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateMultipartUpload", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).CreateMultipartUpload), varargs...) +} + +// DeleteObject mocks base method. +func (m *MockObjectStorageServiceClient) DeleteObject(ctx context.Context, in *v1.DeleteObjectInput, opts ...grpc.CallOption) (*v1.DeleteObjectOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "DeleteObject", varargs...) + ret0, _ := ret[0].(*v1.DeleteObjectOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteObject indicates an expected call of DeleteObject. +func (mr *MockObjectStorageServiceClientMockRecorder) DeleteObject(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteObject", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).DeleteObject), varargs...) +} + +// DeleteObjectTagging mocks base method. +func (m *MockObjectStorageServiceClient) DeleteObjectTagging(ctx context.Context, in *v1.DeleteObjectTaggingInput, opts ...grpc.CallOption) (*v1.DeleteObjectTaggingOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "DeleteObjectTagging", varargs...) + ret0, _ := ret[0].(*v1.DeleteObjectTaggingOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteObjectTagging indicates an expected call of DeleteObjectTagging. +func (mr *MockObjectStorageServiceClientMockRecorder) DeleteObjectTagging(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteObjectTagging", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).DeleteObjectTagging), varargs...) +} + +// DeleteObjects mocks base method. +func (m *MockObjectStorageServiceClient) DeleteObjects(ctx context.Context, in *v1.DeleteObjectsInput, opts ...grpc.CallOption) (*v1.DeleteObjectsOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "DeleteObjects", varargs...) + ret0, _ := ret[0].(*v1.DeleteObjectsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteObjects indicates an expected call of DeleteObjects. +func (mr *MockObjectStorageServiceClientMockRecorder) DeleteObjects(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteObjects", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).DeleteObjects), varargs...) +} + +// GetObject mocks base method. +func (m *MockObjectStorageServiceClient) GetObject(ctx context.Context, in *v1.GetObjectInput, opts ...grpc.CallOption) (v1.ObjectStorageService_GetObjectClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetObject", varargs...) + ret0, _ := ret[0].(v1.ObjectStorageService_GetObjectClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetObject indicates an expected call of GetObject. +func (mr *MockObjectStorageServiceClientMockRecorder) GetObject(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObject", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).GetObject), varargs...) +} + +// GetObjectCannedAcl mocks base method. +func (m *MockObjectStorageServiceClient) GetObjectCannedAcl(ctx context.Context, in *v1.GetObjectCannedAclInput, opts ...grpc.CallOption) (*v1.GetObjectCannedAclOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetObjectCannedAcl", varargs...) + ret0, _ := ret[0].(*v1.GetObjectCannedAclOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetObjectCannedAcl indicates an expected call of GetObjectCannedAcl. +func (mr *MockObjectStorageServiceClientMockRecorder) GetObjectCannedAcl(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObjectCannedAcl", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).GetObjectCannedAcl), varargs...) +} + +// GetObjectTagging mocks base method. +func (m *MockObjectStorageServiceClient) GetObjectTagging(ctx context.Context, in *v1.GetObjectTaggingInput, opts ...grpc.CallOption) (*v1.GetObjectTaggingOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetObjectTagging", varargs...) + ret0, _ := ret[0].(*v1.GetObjectTaggingOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetObjectTagging indicates an expected call of GetObjectTagging. +func (mr *MockObjectStorageServiceClientMockRecorder) GetObjectTagging(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObjectTagging", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).GetObjectTagging), varargs...) +} + +// HeadObject mocks base method. +func (m *MockObjectStorageServiceClient) HeadObject(ctx context.Context, in *v1.HeadObjectInput, opts ...grpc.CallOption) (*v1.HeadObjectOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "HeadObject", varargs...) + ret0, _ := ret[0].(*v1.HeadObjectOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// HeadObject indicates an expected call of HeadObject. +func (mr *MockObjectStorageServiceClientMockRecorder) HeadObject(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HeadObject", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).HeadObject), varargs...) +} + +// InitClient mocks base method. +func (m *MockObjectStorageServiceClient) InitClient(ctx context.Context, in *v1.InitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "InitClient", varargs...) + ret0, _ := ret[0].(*emptypb.Empty) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// InitClient indicates an expected call of InitClient. +func (mr *MockObjectStorageServiceClientMockRecorder) InitClient(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InitClient", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).InitClient), varargs...) +} + +// IsObjectExist mocks base method. +func (m *MockObjectStorageServiceClient) IsObjectExist(ctx context.Context, in *v1.IsObjectExistInput, opts ...grpc.CallOption) (*v1.IsObjectExistOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "IsObjectExist", varargs...) + ret0, _ := ret[0].(*v1.IsObjectExistOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// IsObjectExist indicates an expected call of IsObjectExist. +func (mr *MockObjectStorageServiceClientMockRecorder) IsObjectExist(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsObjectExist", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).IsObjectExist), varargs...) +} + +// ListMultipartUploads mocks base method. +func (m *MockObjectStorageServiceClient) ListMultipartUploads(ctx context.Context, in *v1.ListMultipartUploadsInput, opts ...grpc.CallOption) (*v1.ListMultipartUploadsOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListMultipartUploads", varargs...) + ret0, _ := ret[0].(*v1.ListMultipartUploadsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListMultipartUploads indicates an expected call of ListMultipartUploads. +func (mr *MockObjectStorageServiceClientMockRecorder) ListMultipartUploads(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListMultipartUploads", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).ListMultipartUploads), varargs...) +} + +// ListObjectVersions mocks base method. +func (m *MockObjectStorageServiceClient) ListObjectVersions(ctx context.Context, in *v1.ListObjectVersionsInput, opts ...grpc.CallOption) (*v1.ListObjectVersionsOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListObjectVersions", varargs...) + ret0, _ := ret[0].(*v1.ListObjectVersionsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListObjectVersions indicates an expected call of ListObjectVersions. +func (mr *MockObjectStorageServiceClientMockRecorder) ListObjectVersions(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListObjectVersions", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).ListObjectVersions), varargs...) +} + +// ListObjects mocks base method. +func (m *MockObjectStorageServiceClient) ListObjects(ctx context.Context, in *v1.ListObjectsInput, opts ...grpc.CallOption) (*v1.ListObjectsOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListObjects", varargs...) + ret0, _ := ret[0].(*v1.ListObjectsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListObjects indicates an expected call of ListObjects. +func (mr *MockObjectStorageServiceClientMockRecorder) ListObjects(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListObjects", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).ListObjects), varargs...) +} + +// ListParts mocks base method. +func (m *MockObjectStorageServiceClient) ListParts(ctx context.Context, in *v1.ListPartsInput, opts ...grpc.CallOption) (*v1.ListPartsOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListParts", varargs...) + ret0, _ := ret[0].(*v1.ListPartsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListParts indicates an expected call of ListParts. +func (mr *MockObjectStorageServiceClientMockRecorder) ListParts(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListParts", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).ListParts), varargs...) +} + +// PutObject mocks base method. +func (m *MockObjectStorageServiceClient) PutObject(ctx context.Context, opts ...grpc.CallOption) (v1.ObjectStorageService_PutObjectClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "PutObject", varargs...) + ret0, _ := ret[0].(v1.ObjectStorageService_PutObjectClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PutObject indicates an expected call of PutObject. +func (mr *MockObjectStorageServiceClientMockRecorder) PutObject(ctx interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutObject", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).PutObject), varargs...) +} + +// PutObjectCannedAcl mocks base method. +func (m *MockObjectStorageServiceClient) PutObjectCannedAcl(ctx context.Context, in *v1.PutObjectCannedAclInput, opts ...grpc.CallOption) (*v1.PutObjectCannedAclOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "PutObjectCannedAcl", varargs...) + ret0, _ := ret[0].(*v1.PutObjectCannedAclOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PutObjectCannedAcl indicates an expected call of PutObjectCannedAcl. +func (mr *MockObjectStorageServiceClientMockRecorder) PutObjectCannedAcl(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutObjectCannedAcl", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).PutObjectCannedAcl), varargs...) +} + +// PutObjectTagging mocks base method. +func (m *MockObjectStorageServiceClient) PutObjectTagging(ctx context.Context, in *v1.PutObjectTaggingInput, opts ...grpc.CallOption) (*v1.PutObjectTaggingOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "PutObjectTagging", varargs...) + ret0, _ := ret[0].(*v1.PutObjectTaggingOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PutObjectTagging indicates an expected call of PutObjectTagging. +func (mr *MockObjectStorageServiceClientMockRecorder) PutObjectTagging(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutObjectTagging", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).PutObjectTagging), varargs...) +} + +// RestoreObject mocks base method. +func (m *MockObjectStorageServiceClient) RestoreObject(ctx context.Context, in *v1.RestoreObjectInput, opts ...grpc.CallOption) (*v1.RestoreObjectOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "RestoreObject", varargs...) + ret0, _ := ret[0].(*v1.RestoreObjectOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RestoreObject indicates an expected call of RestoreObject. +func (mr *MockObjectStorageServiceClientMockRecorder) RestoreObject(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RestoreObject", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).RestoreObject), varargs...) +} + +// SignURL mocks base method. +func (m *MockObjectStorageServiceClient) SignURL(ctx context.Context, in *v1.SignURLInput, opts ...grpc.CallOption) (*v1.SignURLOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "SignURL", varargs...) + ret0, _ := ret[0].(*v1.SignURLOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SignURL indicates an expected call of SignURL. +func (mr *MockObjectStorageServiceClientMockRecorder) SignURL(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SignURL", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).SignURL), varargs...) +} + +// UpdateDownLoadBandwidthRateLimit mocks base method. +func (m *MockObjectStorageServiceClient) UpdateDownLoadBandwidthRateLimit(ctx context.Context, in *v1.UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "UpdateDownLoadBandwidthRateLimit", varargs...) + ret0, _ := ret[0].(*emptypb.Empty) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateDownLoadBandwidthRateLimit indicates an expected call of UpdateDownLoadBandwidthRateLimit. +func (mr *MockObjectStorageServiceClientMockRecorder) UpdateDownLoadBandwidthRateLimit(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDownLoadBandwidthRateLimit", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).UpdateDownLoadBandwidthRateLimit), varargs...) +} + +// UpdateUpLoadBandwidthRateLimit mocks base method. +func (m *MockObjectStorageServiceClient) UpdateUpLoadBandwidthRateLimit(ctx context.Context, in *v1.UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "UpdateUpLoadBandwidthRateLimit", varargs...) + ret0, _ := ret[0].(*emptypb.Empty) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateUpLoadBandwidthRateLimit indicates an expected call of UpdateUpLoadBandwidthRateLimit. +func (mr *MockObjectStorageServiceClientMockRecorder) UpdateUpLoadBandwidthRateLimit(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateUpLoadBandwidthRateLimit", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).UpdateUpLoadBandwidthRateLimit), varargs...) +} + +// UploadPart mocks base method. +func (m *MockObjectStorageServiceClient) UploadPart(ctx context.Context, opts ...grpc.CallOption) (v1.ObjectStorageService_UploadPartClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "UploadPart", varargs...) + ret0, _ := ret[0].(v1.ObjectStorageService_UploadPartClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UploadPart indicates an expected call of UploadPart. +func (mr *MockObjectStorageServiceClientMockRecorder) UploadPart(ctx interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UploadPart", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).UploadPart), varargs...) +} + +// UploadPartCopy mocks base method. +func (m *MockObjectStorageServiceClient) UploadPartCopy(ctx context.Context, in *v1.UploadPartCopyInput, opts ...grpc.CallOption) (*v1.UploadPartCopyOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "UploadPartCopy", varargs...) + ret0, _ := ret[0].(*v1.UploadPartCopyOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UploadPartCopy indicates an expected call of UploadPartCopy. +func (mr *MockObjectStorageServiceClientMockRecorder) UploadPartCopy(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UploadPartCopy", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).UploadPartCopy), varargs...) +} + +// MockObjectStorageService_PutObjectClient is a mock of ObjectStorageService_PutObjectClient interface. +type MockObjectStorageService_PutObjectClient struct { + ctrl *gomock.Controller + recorder *MockObjectStorageService_PutObjectClientMockRecorder +} + +// MockObjectStorageService_PutObjectClientMockRecorder is the mock recorder for MockObjectStorageService_PutObjectClient. +type MockObjectStorageService_PutObjectClientMockRecorder struct { + mock *MockObjectStorageService_PutObjectClient +} + +// NewMockObjectStorageService_PutObjectClient creates a new mock instance. +func NewMockObjectStorageService_PutObjectClient(ctrl *gomock.Controller) *MockObjectStorageService_PutObjectClient { + mock := &MockObjectStorageService_PutObjectClient{ctrl: ctrl} + mock.recorder = &MockObjectStorageService_PutObjectClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockObjectStorageService_PutObjectClient) EXPECT() *MockObjectStorageService_PutObjectClientMockRecorder { + return m.recorder +} + +// CloseAndRecv mocks base method. +func (m *MockObjectStorageService_PutObjectClient) CloseAndRecv() (*v1.PutObjectOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CloseAndRecv") + ret0, _ := ret[0].(*v1.PutObjectOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CloseAndRecv indicates an expected call of CloseAndRecv. +func (mr *MockObjectStorageService_PutObjectClientMockRecorder) CloseAndRecv() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CloseAndRecv", reflect.TypeOf((*MockObjectStorageService_PutObjectClient)(nil).CloseAndRecv)) +} + +// CloseSend mocks base method. +func (m *MockObjectStorageService_PutObjectClient) CloseSend() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CloseSend") + ret0, _ := ret[0].(error) + return ret0 +} + +// CloseSend indicates an expected call of CloseSend. +func (mr *MockObjectStorageService_PutObjectClientMockRecorder) CloseSend() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CloseSend", reflect.TypeOf((*MockObjectStorageService_PutObjectClient)(nil).CloseSend)) +} + +// Context mocks base method. +func (m *MockObjectStorageService_PutObjectClient) Context() context.Context { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Context") + ret0, _ := ret[0].(context.Context) + return ret0 +} + +// Context indicates an expected call of Context. +func (mr *MockObjectStorageService_PutObjectClientMockRecorder) Context() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Context", reflect.TypeOf((*MockObjectStorageService_PutObjectClient)(nil).Context)) +} + +// Header mocks base method. +func (m *MockObjectStorageService_PutObjectClient) Header() (metadata.MD, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Header") + ret0, _ := ret[0].(metadata.MD) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Header indicates an expected call of Header. +func (mr *MockObjectStorageService_PutObjectClientMockRecorder) Header() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Header", reflect.TypeOf((*MockObjectStorageService_PutObjectClient)(nil).Header)) +} + +// RecvMsg mocks base method. +func (m_2 *MockObjectStorageService_PutObjectClient) RecvMsg(m interface{}) error { + m_2.ctrl.T.Helper() + ret := m_2.ctrl.Call(m_2, "RecvMsg", m) + ret0, _ := ret[0].(error) + return ret0 +} + +// RecvMsg indicates an expected call of RecvMsg. +func (mr *MockObjectStorageService_PutObjectClientMockRecorder) RecvMsg(m interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecvMsg", reflect.TypeOf((*MockObjectStorageService_PutObjectClient)(nil).RecvMsg), m) +} + +// Send mocks base method. +func (m *MockObjectStorageService_PutObjectClient) Send(arg0 *v1.PutObjectInput) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Send", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Send indicates an expected call of Send. +func (mr *MockObjectStorageService_PutObjectClientMockRecorder) Send(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Send", reflect.TypeOf((*MockObjectStorageService_PutObjectClient)(nil).Send), arg0) +} + +// SendMsg mocks base method. +func (m_2 *MockObjectStorageService_PutObjectClient) SendMsg(m interface{}) error { + m_2.ctrl.T.Helper() + ret := m_2.ctrl.Call(m_2, "SendMsg", m) + ret0, _ := ret[0].(error) + return ret0 +} + +// SendMsg indicates an expected call of SendMsg. +func (mr *MockObjectStorageService_PutObjectClientMockRecorder) SendMsg(m interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendMsg", reflect.TypeOf((*MockObjectStorageService_PutObjectClient)(nil).SendMsg), m) +} + +// Trailer mocks base method. +func (m *MockObjectStorageService_PutObjectClient) Trailer() metadata.MD { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Trailer") + ret0, _ := ret[0].(metadata.MD) + return ret0 +} + +// Trailer indicates an expected call of Trailer. +func (mr *MockObjectStorageService_PutObjectClientMockRecorder) Trailer() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Trailer", reflect.TypeOf((*MockObjectStorageService_PutObjectClient)(nil).Trailer)) +} + +// MockObjectStorageService_GetObjectClient is a mock of ObjectStorageService_GetObjectClient interface. +type MockObjectStorageService_GetObjectClient struct { + ctrl *gomock.Controller + recorder *MockObjectStorageService_GetObjectClientMockRecorder +} + +// MockObjectStorageService_GetObjectClientMockRecorder is the mock recorder for MockObjectStorageService_GetObjectClient. +type MockObjectStorageService_GetObjectClientMockRecorder struct { + mock *MockObjectStorageService_GetObjectClient +} + +// NewMockObjectStorageService_GetObjectClient creates a new mock instance. +func NewMockObjectStorageService_GetObjectClient(ctrl *gomock.Controller) *MockObjectStorageService_GetObjectClient { + mock := &MockObjectStorageService_GetObjectClient{ctrl: ctrl} + mock.recorder = &MockObjectStorageService_GetObjectClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockObjectStorageService_GetObjectClient) EXPECT() *MockObjectStorageService_GetObjectClientMockRecorder { + return m.recorder +} + +// CloseSend mocks base method. +func (m *MockObjectStorageService_GetObjectClient) CloseSend() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CloseSend") + ret0, _ := ret[0].(error) + return ret0 +} + +// CloseSend indicates an expected call of CloseSend. +func (mr *MockObjectStorageService_GetObjectClientMockRecorder) CloseSend() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CloseSend", reflect.TypeOf((*MockObjectStorageService_GetObjectClient)(nil).CloseSend)) +} + +// Context mocks base method. +func (m *MockObjectStorageService_GetObjectClient) Context() context.Context { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Context") + ret0, _ := ret[0].(context.Context) + return ret0 +} + +// Context indicates an expected call of Context. +func (mr *MockObjectStorageService_GetObjectClientMockRecorder) Context() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Context", reflect.TypeOf((*MockObjectStorageService_GetObjectClient)(nil).Context)) +} + +// Header mocks base method. +func (m *MockObjectStorageService_GetObjectClient) Header() (metadata.MD, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Header") + ret0, _ := ret[0].(metadata.MD) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Header indicates an expected call of Header. +func (mr *MockObjectStorageService_GetObjectClientMockRecorder) Header() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Header", reflect.TypeOf((*MockObjectStorageService_GetObjectClient)(nil).Header)) +} + +// Recv mocks base method. +func (m *MockObjectStorageService_GetObjectClient) Recv() (*v1.GetObjectOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Recv") + ret0, _ := ret[0].(*v1.GetObjectOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Recv indicates an expected call of Recv. +func (mr *MockObjectStorageService_GetObjectClientMockRecorder) Recv() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Recv", reflect.TypeOf((*MockObjectStorageService_GetObjectClient)(nil).Recv)) +} + +// RecvMsg mocks base method. +func (m_2 *MockObjectStorageService_GetObjectClient) RecvMsg(m interface{}) error { + m_2.ctrl.T.Helper() + ret := m_2.ctrl.Call(m_2, "RecvMsg", m) + ret0, _ := ret[0].(error) + return ret0 +} + +// RecvMsg indicates an expected call of RecvMsg. +func (mr *MockObjectStorageService_GetObjectClientMockRecorder) RecvMsg(m interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecvMsg", reflect.TypeOf((*MockObjectStorageService_GetObjectClient)(nil).RecvMsg), m) +} + +// SendMsg mocks base method. +func (m_2 *MockObjectStorageService_GetObjectClient) SendMsg(m interface{}) error { + m_2.ctrl.T.Helper() + ret := m_2.ctrl.Call(m_2, "SendMsg", m) + ret0, _ := ret[0].(error) + return ret0 +} + +// SendMsg indicates an expected call of SendMsg. +func (mr *MockObjectStorageService_GetObjectClientMockRecorder) SendMsg(m interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendMsg", reflect.TypeOf((*MockObjectStorageService_GetObjectClient)(nil).SendMsg), m) +} + +// Trailer mocks base method. +func (m *MockObjectStorageService_GetObjectClient) Trailer() metadata.MD { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Trailer") + ret0, _ := ret[0].(metadata.MD) + return ret0 +} + +// Trailer indicates an expected call of Trailer. +func (mr *MockObjectStorageService_GetObjectClientMockRecorder) Trailer() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Trailer", reflect.TypeOf((*MockObjectStorageService_GetObjectClient)(nil).Trailer)) +} + +// MockObjectStorageService_UploadPartClient is a mock of ObjectStorageService_UploadPartClient interface. +type MockObjectStorageService_UploadPartClient struct { + ctrl *gomock.Controller + recorder *MockObjectStorageService_UploadPartClientMockRecorder +} + +// MockObjectStorageService_UploadPartClientMockRecorder is the mock recorder for MockObjectStorageService_UploadPartClient. +type MockObjectStorageService_UploadPartClientMockRecorder struct { + mock *MockObjectStorageService_UploadPartClient +} + +// NewMockObjectStorageService_UploadPartClient creates a new mock instance. +func NewMockObjectStorageService_UploadPartClient(ctrl *gomock.Controller) *MockObjectStorageService_UploadPartClient { + mock := &MockObjectStorageService_UploadPartClient{ctrl: ctrl} + mock.recorder = &MockObjectStorageService_UploadPartClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockObjectStorageService_UploadPartClient) EXPECT() *MockObjectStorageService_UploadPartClientMockRecorder { + return m.recorder +} + +// CloseAndRecv mocks base method. +func (m *MockObjectStorageService_UploadPartClient) CloseAndRecv() (*v1.UploadPartOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CloseAndRecv") + ret0, _ := ret[0].(*v1.UploadPartOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CloseAndRecv indicates an expected call of CloseAndRecv. +func (mr *MockObjectStorageService_UploadPartClientMockRecorder) CloseAndRecv() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CloseAndRecv", reflect.TypeOf((*MockObjectStorageService_UploadPartClient)(nil).CloseAndRecv)) +} + +// CloseSend mocks base method. +func (m *MockObjectStorageService_UploadPartClient) CloseSend() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CloseSend") + ret0, _ := ret[0].(error) + return ret0 +} + +// CloseSend indicates an expected call of CloseSend. +func (mr *MockObjectStorageService_UploadPartClientMockRecorder) CloseSend() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CloseSend", reflect.TypeOf((*MockObjectStorageService_UploadPartClient)(nil).CloseSend)) +} + +// Context mocks base method. +func (m *MockObjectStorageService_UploadPartClient) Context() context.Context { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Context") + ret0, _ := ret[0].(context.Context) + return ret0 +} + +// Context indicates an expected call of Context. +func (mr *MockObjectStorageService_UploadPartClientMockRecorder) Context() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Context", reflect.TypeOf((*MockObjectStorageService_UploadPartClient)(nil).Context)) +} + +// Header mocks base method. +func (m *MockObjectStorageService_UploadPartClient) Header() (metadata.MD, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Header") + ret0, _ := ret[0].(metadata.MD) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Header indicates an expected call of Header. +func (mr *MockObjectStorageService_UploadPartClientMockRecorder) Header() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Header", reflect.TypeOf((*MockObjectStorageService_UploadPartClient)(nil).Header)) +} + +// RecvMsg mocks base method. +func (m_2 *MockObjectStorageService_UploadPartClient) RecvMsg(m interface{}) error { + m_2.ctrl.T.Helper() + ret := m_2.ctrl.Call(m_2, "RecvMsg", m) + ret0, _ := ret[0].(error) + return ret0 +} + +// RecvMsg indicates an expected call of RecvMsg. +func (mr *MockObjectStorageService_UploadPartClientMockRecorder) RecvMsg(m interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecvMsg", reflect.TypeOf((*MockObjectStorageService_UploadPartClient)(nil).RecvMsg), m) +} + +// Send mocks base method. +func (m *MockObjectStorageService_UploadPartClient) Send(arg0 *v1.UploadPartInput) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Send", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Send indicates an expected call of Send. +func (mr *MockObjectStorageService_UploadPartClientMockRecorder) Send(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Send", reflect.TypeOf((*MockObjectStorageService_UploadPartClient)(nil).Send), arg0) +} + +// SendMsg mocks base method. +func (m_2 *MockObjectStorageService_UploadPartClient) SendMsg(m interface{}) error { + m_2.ctrl.T.Helper() + ret := m_2.ctrl.Call(m_2, "SendMsg", m) + ret0, _ := ret[0].(error) + return ret0 +} + +// SendMsg indicates an expected call of SendMsg. +func (mr *MockObjectStorageService_UploadPartClientMockRecorder) SendMsg(m interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendMsg", reflect.TypeOf((*MockObjectStorageService_UploadPartClient)(nil).SendMsg), m) +} + +// Trailer mocks base method. +func (m *MockObjectStorageService_UploadPartClient) Trailer() metadata.MD { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Trailer") + ret0, _ := ret[0].(metadata.MD) + return ret0 +} + +// Trailer indicates an expected call of Trailer. +func (mr *MockObjectStorageService_UploadPartClientMockRecorder) Trailer() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Trailer", reflect.TypeOf((*MockObjectStorageService_UploadPartClient)(nil).Trailer)) +} + +// MockObjectStorageService_AppendObjectClient is a mock of ObjectStorageService_AppendObjectClient interface. +type MockObjectStorageService_AppendObjectClient struct { + ctrl *gomock.Controller + recorder *MockObjectStorageService_AppendObjectClientMockRecorder +} + +// MockObjectStorageService_AppendObjectClientMockRecorder is the mock recorder for MockObjectStorageService_AppendObjectClient. +type MockObjectStorageService_AppendObjectClientMockRecorder struct { + mock *MockObjectStorageService_AppendObjectClient +} + +// NewMockObjectStorageService_AppendObjectClient creates a new mock instance. +func NewMockObjectStorageService_AppendObjectClient(ctrl *gomock.Controller) *MockObjectStorageService_AppendObjectClient { + mock := &MockObjectStorageService_AppendObjectClient{ctrl: ctrl} + mock.recorder = &MockObjectStorageService_AppendObjectClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockObjectStorageService_AppendObjectClient) EXPECT() *MockObjectStorageService_AppendObjectClientMockRecorder { + return m.recorder +} + +// CloseAndRecv mocks base method. +func (m *MockObjectStorageService_AppendObjectClient) CloseAndRecv() (*v1.AppendObjectOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CloseAndRecv") + ret0, _ := ret[0].(*v1.AppendObjectOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CloseAndRecv indicates an expected call of CloseAndRecv. +func (mr *MockObjectStorageService_AppendObjectClientMockRecorder) CloseAndRecv() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CloseAndRecv", reflect.TypeOf((*MockObjectStorageService_AppendObjectClient)(nil).CloseAndRecv)) +} + +// CloseSend mocks base method. +func (m *MockObjectStorageService_AppendObjectClient) CloseSend() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CloseSend") + ret0, _ := ret[0].(error) + return ret0 +} + +// CloseSend indicates an expected call of CloseSend. +func (mr *MockObjectStorageService_AppendObjectClientMockRecorder) CloseSend() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CloseSend", reflect.TypeOf((*MockObjectStorageService_AppendObjectClient)(nil).CloseSend)) +} + +// Context mocks base method. +func (m *MockObjectStorageService_AppendObjectClient) Context() context.Context { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Context") + ret0, _ := ret[0].(context.Context) + return ret0 +} + +// Context indicates an expected call of Context. +func (mr *MockObjectStorageService_AppendObjectClientMockRecorder) Context() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Context", reflect.TypeOf((*MockObjectStorageService_AppendObjectClient)(nil).Context)) +} + +// Header mocks base method. +func (m *MockObjectStorageService_AppendObjectClient) Header() (metadata.MD, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Header") + ret0, _ := ret[0].(metadata.MD) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Header indicates an expected call of Header. +func (mr *MockObjectStorageService_AppendObjectClientMockRecorder) Header() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Header", reflect.TypeOf((*MockObjectStorageService_AppendObjectClient)(nil).Header)) +} + +// RecvMsg mocks base method. +func (m_2 *MockObjectStorageService_AppendObjectClient) RecvMsg(m interface{}) error { + m_2.ctrl.T.Helper() + ret := m_2.ctrl.Call(m_2, "RecvMsg", m) + ret0, _ := ret[0].(error) + return ret0 +} + +// RecvMsg indicates an expected call of RecvMsg. +func (mr *MockObjectStorageService_AppendObjectClientMockRecorder) RecvMsg(m interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecvMsg", reflect.TypeOf((*MockObjectStorageService_AppendObjectClient)(nil).RecvMsg), m) +} + +// Send mocks base method. +func (m *MockObjectStorageService_AppendObjectClient) Send(arg0 *v1.AppendObjectInput) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Send", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Send indicates an expected call of Send. +func (mr *MockObjectStorageService_AppendObjectClientMockRecorder) Send(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Send", reflect.TypeOf((*MockObjectStorageService_AppendObjectClient)(nil).Send), arg0) +} + +// SendMsg mocks base method. +func (m_2 *MockObjectStorageService_AppendObjectClient) SendMsg(m interface{}) error { + m_2.ctrl.T.Helper() + ret := m_2.ctrl.Call(m_2, "SendMsg", m) + ret0, _ := ret[0].(error) + return ret0 +} + +// SendMsg indicates an expected call of SendMsg. +func (mr *MockObjectStorageService_AppendObjectClientMockRecorder) SendMsg(m interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendMsg", reflect.TypeOf((*MockObjectStorageService_AppendObjectClient)(nil).SendMsg), m) +} + +// Trailer mocks base method. +func (m *MockObjectStorageService_AppendObjectClient) Trailer() metadata.MD { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Trailer") + ret0, _ := ret[0].(metadata.MD) + return ret0 +} + +// Trailer indicates an expected call of Trailer. +func (mr *MockObjectStorageService_AppendObjectClientMockRecorder) Trailer() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Trailer", reflect.TypeOf((*MockObjectStorageService_AppendObjectClient)(nil).Trailer)) +} + +// MockObjectStorageServiceServer is a mock of ObjectStorageServiceServer interface. +type MockObjectStorageServiceServer struct { + ctrl *gomock.Controller + recorder *MockObjectStorageServiceServerMockRecorder +} + +// MockObjectStorageServiceServerMockRecorder is the mock recorder for MockObjectStorageServiceServer. +type MockObjectStorageServiceServerMockRecorder struct { + mock *MockObjectStorageServiceServer +} + +// NewMockObjectStorageServiceServer creates a new mock instance. +func NewMockObjectStorageServiceServer(ctrl *gomock.Controller) *MockObjectStorageServiceServer { + mock := &MockObjectStorageServiceServer{ctrl: ctrl} + mock.recorder = &MockObjectStorageServiceServerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockObjectStorageServiceServer) EXPECT() *MockObjectStorageServiceServerMockRecorder { + return m.recorder +} + +// AbortMultipartUpload mocks base method. +func (m *MockObjectStorageServiceServer) AbortMultipartUpload(arg0 context.Context, arg1 *v1.AbortMultipartUploadInput) (*v1.AbortMultipartUploadOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AbortMultipartUpload", arg0, arg1) + ret0, _ := ret[0].(*v1.AbortMultipartUploadOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AbortMultipartUpload indicates an expected call of AbortMultipartUpload. +func (mr *MockObjectStorageServiceServerMockRecorder) AbortMultipartUpload(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AbortMultipartUpload", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).AbortMultipartUpload), arg0, arg1) +} + +// AppendObject mocks base method. +func (m *MockObjectStorageServiceServer) AppendObject(arg0 v1.ObjectStorageService_AppendObjectServer) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AppendObject", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// AppendObject indicates an expected call of AppendObject. +func (mr *MockObjectStorageServiceServerMockRecorder) AppendObject(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AppendObject", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).AppendObject), arg0) +} + +// CompleteMultipartUpload mocks base method. +func (m *MockObjectStorageServiceServer) CompleteMultipartUpload(arg0 context.Context, arg1 *v1.CompleteMultipartUploadInput) (*v1.CompleteMultipartUploadOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CompleteMultipartUpload", arg0, arg1) + ret0, _ := ret[0].(*v1.CompleteMultipartUploadOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CompleteMultipartUpload indicates an expected call of CompleteMultipartUpload. +func (mr *MockObjectStorageServiceServerMockRecorder) CompleteMultipartUpload(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CompleteMultipartUpload", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).CompleteMultipartUpload), arg0, arg1) +} + +// CopyObject mocks base method. +func (m *MockObjectStorageServiceServer) CopyObject(arg0 context.Context, arg1 *v1.CopyObjectInput) (*v1.CopyObjectOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CopyObject", arg0, arg1) + ret0, _ := ret[0].(*v1.CopyObjectOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CopyObject indicates an expected call of CopyObject. +func (mr *MockObjectStorageServiceServerMockRecorder) CopyObject(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CopyObject", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).CopyObject), arg0, arg1) +} + +// CreateMultipartUpload mocks base method. +func (m *MockObjectStorageServiceServer) CreateMultipartUpload(arg0 context.Context, arg1 *v1.CreateMultipartUploadInput) (*v1.CreateMultipartUploadOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateMultipartUpload", arg0, arg1) + ret0, _ := ret[0].(*v1.CreateMultipartUploadOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateMultipartUpload indicates an expected call of CreateMultipartUpload. +func (mr *MockObjectStorageServiceServerMockRecorder) CreateMultipartUpload(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateMultipartUpload", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).CreateMultipartUpload), arg0, arg1) +} + +// DeleteObject mocks base method. +func (m *MockObjectStorageServiceServer) DeleteObject(arg0 context.Context, arg1 *v1.DeleteObjectInput) (*v1.DeleteObjectOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteObject", arg0, arg1) + ret0, _ := ret[0].(*v1.DeleteObjectOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteObject indicates an expected call of DeleteObject. +func (mr *MockObjectStorageServiceServerMockRecorder) DeleteObject(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteObject", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).DeleteObject), arg0, arg1) +} + +// DeleteObjectTagging mocks base method. +func (m *MockObjectStorageServiceServer) DeleteObjectTagging(arg0 context.Context, arg1 *v1.DeleteObjectTaggingInput) (*v1.DeleteObjectTaggingOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteObjectTagging", arg0, arg1) + ret0, _ := ret[0].(*v1.DeleteObjectTaggingOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteObjectTagging indicates an expected call of DeleteObjectTagging. +func (mr *MockObjectStorageServiceServerMockRecorder) DeleteObjectTagging(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteObjectTagging", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).DeleteObjectTagging), arg0, arg1) +} + +// DeleteObjects mocks base method. +func (m *MockObjectStorageServiceServer) DeleteObjects(arg0 context.Context, arg1 *v1.DeleteObjectsInput) (*v1.DeleteObjectsOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteObjects", arg0, arg1) + ret0, _ := ret[0].(*v1.DeleteObjectsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteObjects indicates an expected call of DeleteObjects. +func (mr *MockObjectStorageServiceServerMockRecorder) DeleteObjects(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteObjects", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).DeleteObjects), arg0, arg1) +} + +// GetObject mocks base method. +func (m *MockObjectStorageServiceServer) GetObject(arg0 *v1.GetObjectInput, arg1 v1.ObjectStorageService_GetObjectServer) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetObject", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// GetObject indicates an expected call of GetObject. +func (mr *MockObjectStorageServiceServerMockRecorder) GetObject(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObject", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).GetObject), arg0, arg1) +} + +// GetObjectCannedAcl mocks base method. +func (m *MockObjectStorageServiceServer) GetObjectCannedAcl(arg0 context.Context, arg1 *v1.GetObjectCannedAclInput) (*v1.GetObjectCannedAclOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetObjectCannedAcl", arg0, arg1) + ret0, _ := ret[0].(*v1.GetObjectCannedAclOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetObjectCannedAcl indicates an expected call of GetObjectCannedAcl. +func (mr *MockObjectStorageServiceServerMockRecorder) GetObjectCannedAcl(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObjectCannedAcl", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).GetObjectCannedAcl), arg0, arg1) +} + +// GetObjectTagging mocks base method. +func (m *MockObjectStorageServiceServer) GetObjectTagging(arg0 context.Context, arg1 *v1.GetObjectTaggingInput) (*v1.GetObjectTaggingOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetObjectTagging", arg0, arg1) + ret0, _ := ret[0].(*v1.GetObjectTaggingOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetObjectTagging indicates an expected call of GetObjectTagging. +func (mr *MockObjectStorageServiceServerMockRecorder) GetObjectTagging(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObjectTagging", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).GetObjectTagging), arg0, arg1) +} + +// HeadObject mocks base method. +func (m *MockObjectStorageServiceServer) HeadObject(arg0 context.Context, arg1 *v1.HeadObjectInput) (*v1.HeadObjectOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HeadObject", arg0, arg1) + ret0, _ := ret[0].(*v1.HeadObjectOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// HeadObject indicates an expected call of HeadObject. +func (mr *MockObjectStorageServiceServerMockRecorder) HeadObject(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HeadObject", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).HeadObject), arg0, arg1) +} + +// InitClient mocks base method. +func (m *MockObjectStorageServiceServer) InitClient(arg0 context.Context, arg1 *v1.InitInput) (*emptypb.Empty, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InitClient", arg0, arg1) + ret0, _ := ret[0].(*emptypb.Empty) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// InitClient indicates an expected call of InitClient. +func (mr *MockObjectStorageServiceServerMockRecorder) InitClient(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InitClient", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).InitClient), arg0, arg1) +} + +// IsObjectExist mocks base method. +func (m *MockObjectStorageServiceServer) IsObjectExist(arg0 context.Context, arg1 *v1.IsObjectExistInput) (*v1.IsObjectExistOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsObjectExist", arg0, arg1) + ret0, _ := ret[0].(*v1.IsObjectExistOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// IsObjectExist indicates an expected call of IsObjectExist. +func (mr *MockObjectStorageServiceServerMockRecorder) IsObjectExist(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsObjectExist", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).IsObjectExist), arg0, arg1) +} + +// ListMultipartUploads mocks base method. +func (m *MockObjectStorageServiceServer) ListMultipartUploads(arg0 context.Context, arg1 *v1.ListMultipartUploadsInput) (*v1.ListMultipartUploadsOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListMultipartUploads", arg0, arg1) + ret0, _ := ret[0].(*v1.ListMultipartUploadsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListMultipartUploads indicates an expected call of ListMultipartUploads. +func (mr *MockObjectStorageServiceServerMockRecorder) ListMultipartUploads(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListMultipartUploads", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).ListMultipartUploads), arg0, arg1) +} + +// ListObjectVersions mocks base method. +func (m *MockObjectStorageServiceServer) ListObjectVersions(arg0 context.Context, arg1 *v1.ListObjectVersionsInput) (*v1.ListObjectVersionsOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListObjectVersions", arg0, arg1) + ret0, _ := ret[0].(*v1.ListObjectVersionsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListObjectVersions indicates an expected call of ListObjectVersions. +func (mr *MockObjectStorageServiceServerMockRecorder) ListObjectVersions(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListObjectVersions", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).ListObjectVersions), arg0, arg1) +} + +// ListObjects mocks base method. +func (m *MockObjectStorageServiceServer) ListObjects(arg0 context.Context, arg1 *v1.ListObjectsInput) (*v1.ListObjectsOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListObjects", arg0, arg1) + ret0, _ := ret[0].(*v1.ListObjectsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListObjects indicates an expected call of ListObjects. +func (mr *MockObjectStorageServiceServerMockRecorder) ListObjects(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListObjects", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).ListObjects), arg0, arg1) +} + +// ListParts mocks base method. +func (m *MockObjectStorageServiceServer) ListParts(arg0 context.Context, arg1 *v1.ListPartsInput) (*v1.ListPartsOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListParts", arg0, arg1) + ret0, _ := ret[0].(*v1.ListPartsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListParts indicates an expected call of ListParts. +func (mr *MockObjectStorageServiceServerMockRecorder) ListParts(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListParts", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).ListParts), arg0, arg1) +} + +// PutObject mocks base method. +func (m *MockObjectStorageServiceServer) PutObject(arg0 v1.ObjectStorageService_PutObjectServer) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PutObject", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// PutObject indicates an expected call of PutObject. +func (mr *MockObjectStorageServiceServerMockRecorder) PutObject(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutObject", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).PutObject), arg0) +} + +// PutObjectCannedAcl mocks base method. +func (m *MockObjectStorageServiceServer) PutObjectCannedAcl(arg0 context.Context, arg1 *v1.PutObjectCannedAclInput) (*v1.PutObjectCannedAclOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PutObjectCannedAcl", arg0, arg1) + ret0, _ := ret[0].(*v1.PutObjectCannedAclOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PutObjectCannedAcl indicates an expected call of PutObjectCannedAcl. +func (mr *MockObjectStorageServiceServerMockRecorder) PutObjectCannedAcl(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutObjectCannedAcl", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).PutObjectCannedAcl), arg0, arg1) +} + +// PutObjectTagging mocks base method. +func (m *MockObjectStorageServiceServer) PutObjectTagging(arg0 context.Context, arg1 *v1.PutObjectTaggingInput) (*v1.PutObjectTaggingOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PutObjectTagging", arg0, arg1) + ret0, _ := ret[0].(*v1.PutObjectTaggingOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PutObjectTagging indicates an expected call of PutObjectTagging. +func (mr *MockObjectStorageServiceServerMockRecorder) PutObjectTagging(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutObjectTagging", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).PutObjectTagging), arg0, arg1) +} + +// RestoreObject mocks base method. +func (m *MockObjectStorageServiceServer) RestoreObject(arg0 context.Context, arg1 *v1.RestoreObjectInput) (*v1.RestoreObjectOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RestoreObject", arg0, arg1) + ret0, _ := ret[0].(*v1.RestoreObjectOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RestoreObject indicates an expected call of RestoreObject. +func (mr *MockObjectStorageServiceServerMockRecorder) RestoreObject(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RestoreObject", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).RestoreObject), arg0, arg1) +} + +// SignURL mocks base method. +func (m *MockObjectStorageServiceServer) SignURL(arg0 context.Context, arg1 *v1.SignURLInput) (*v1.SignURLOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SignURL", arg0, arg1) + ret0, _ := ret[0].(*v1.SignURLOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SignURL indicates an expected call of SignURL. +func (mr *MockObjectStorageServiceServerMockRecorder) SignURL(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SignURL", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).SignURL), arg0, arg1) +} + +// UpdateDownLoadBandwidthRateLimit mocks base method. +func (m *MockObjectStorageServiceServer) UpdateDownLoadBandwidthRateLimit(arg0 context.Context, arg1 *v1.UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateDownLoadBandwidthRateLimit", arg0, arg1) + ret0, _ := ret[0].(*emptypb.Empty) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateDownLoadBandwidthRateLimit indicates an expected call of UpdateDownLoadBandwidthRateLimit. +func (mr *MockObjectStorageServiceServerMockRecorder) UpdateDownLoadBandwidthRateLimit(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDownLoadBandwidthRateLimit", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).UpdateDownLoadBandwidthRateLimit), arg0, arg1) +} + +// UpdateUpLoadBandwidthRateLimit mocks base method. +func (m *MockObjectStorageServiceServer) UpdateUpLoadBandwidthRateLimit(arg0 context.Context, arg1 *v1.UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateUpLoadBandwidthRateLimit", arg0, arg1) + ret0, _ := ret[0].(*emptypb.Empty) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateUpLoadBandwidthRateLimit indicates an expected call of UpdateUpLoadBandwidthRateLimit. +func (mr *MockObjectStorageServiceServerMockRecorder) UpdateUpLoadBandwidthRateLimit(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateUpLoadBandwidthRateLimit", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).UpdateUpLoadBandwidthRateLimit), arg0, arg1) +} + +// UploadPart mocks base method. +func (m *MockObjectStorageServiceServer) UploadPart(arg0 v1.ObjectStorageService_UploadPartServer) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UploadPart", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// UploadPart indicates an expected call of UploadPart. +func (mr *MockObjectStorageServiceServerMockRecorder) UploadPart(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UploadPart", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).UploadPart), arg0) +} + +// UploadPartCopy mocks base method. +func (m *MockObjectStorageServiceServer) UploadPartCopy(arg0 context.Context, arg1 *v1.UploadPartCopyInput) (*v1.UploadPartCopyOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UploadPartCopy", arg0, arg1) + ret0, _ := ret[0].(*v1.UploadPartCopyOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UploadPartCopy indicates an expected call of UploadPartCopy. +func (mr *MockObjectStorageServiceServerMockRecorder) UploadPartCopy(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UploadPartCopy", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).UploadPartCopy), arg0, arg1) +} + +// MockUnsafeObjectStorageServiceServer is a mock of UnsafeObjectStorageServiceServer interface. +type MockUnsafeObjectStorageServiceServer struct { + ctrl *gomock.Controller + recorder *MockUnsafeObjectStorageServiceServerMockRecorder +} + +// MockUnsafeObjectStorageServiceServerMockRecorder is the mock recorder for MockUnsafeObjectStorageServiceServer. +type MockUnsafeObjectStorageServiceServerMockRecorder struct { + mock *MockUnsafeObjectStorageServiceServer +} + +// NewMockUnsafeObjectStorageServiceServer creates a new mock instance. +func NewMockUnsafeObjectStorageServiceServer(ctrl *gomock.Controller) *MockUnsafeObjectStorageServiceServer { + mock := &MockUnsafeObjectStorageServiceServer{ctrl: ctrl} + mock.recorder = &MockUnsafeObjectStorageServiceServerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockUnsafeObjectStorageServiceServer) EXPECT() *MockUnsafeObjectStorageServiceServerMockRecorder { + return m.recorder +} + +// mustEmbedUnimplementedObjectStorageServiceServer mocks base method. +func (m *MockUnsafeObjectStorageServiceServer) mustEmbedUnimplementedObjectStorageServiceServer() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "mustEmbedUnimplementedObjectStorageServiceServer") +} + +// mustEmbedUnimplementedObjectStorageServiceServer indicates an expected call of mustEmbedUnimplementedObjectStorageServiceServer. +func (mr *MockUnsafeObjectStorageServiceServerMockRecorder) mustEmbedUnimplementedObjectStorageServiceServer() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "mustEmbedUnimplementedObjectStorageServiceServer", reflect.TypeOf((*MockUnsafeObjectStorageServiceServer)(nil).mustEmbedUnimplementedObjectStorageServiceServer)) +} + +// MockObjectStorageService_PutObjectServer is a mock of ObjectStorageService_PutObjectServer interface. +type MockObjectStorageService_PutObjectServer struct { + ctrl *gomock.Controller + recorder *MockObjectStorageService_PutObjectServerMockRecorder +} + +// MockObjectStorageService_PutObjectServerMockRecorder is the mock recorder for MockObjectStorageService_PutObjectServer. +type MockObjectStorageService_PutObjectServerMockRecorder struct { + mock *MockObjectStorageService_PutObjectServer +} + +// NewMockObjectStorageService_PutObjectServer creates a new mock instance. +func NewMockObjectStorageService_PutObjectServer(ctrl *gomock.Controller) *MockObjectStorageService_PutObjectServer { + mock := &MockObjectStorageService_PutObjectServer{ctrl: ctrl} + mock.recorder = &MockObjectStorageService_PutObjectServerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockObjectStorageService_PutObjectServer) EXPECT() *MockObjectStorageService_PutObjectServerMockRecorder { + return m.recorder +} + +// Context mocks base method. +func (m *MockObjectStorageService_PutObjectServer) Context() context.Context { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Context") + ret0, _ := ret[0].(context.Context) + return ret0 +} + +// Context indicates an expected call of Context. +func (mr *MockObjectStorageService_PutObjectServerMockRecorder) Context() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Context", reflect.TypeOf((*MockObjectStorageService_PutObjectServer)(nil).Context)) +} + +// Recv mocks base method. +func (m *MockObjectStorageService_PutObjectServer) Recv() (*v1.PutObjectInput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Recv") + ret0, _ := ret[0].(*v1.PutObjectInput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Recv indicates an expected call of Recv. +func (mr *MockObjectStorageService_PutObjectServerMockRecorder) Recv() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Recv", reflect.TypeOf((*MockObjectStorageService_PutObjectServer)(nil).Recv)) +} + +// RecvMsg mocks base method. +func (m_2 *MockObjectStorageService_PutObjectServer) RecvMsg(m interface{}) error { + m_2.ctrl.T.Helper() + ret := m_2.ctrl.Call(m_2, "RecvMsg", m) + ret0, _ := ret[0].(error) + return ret0 +} + +// RecvMsg indicates an expected call of RecvMsg. +func (mr *MockObjectStorageService_PutObjectServerMockRecorder) RecvMsg(m interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecvMsg", reflect.TypeOf((*MockObjectStorageService_PutObjectServer)(nil).RecvMsg), m) +} + +// SendAndClose mocks base method. +func (m *MockObjectStorageService_PutObjectServer) SendAndClose(arg0 *v1.PutObjectOutput) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SendAndClose", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// SendAndClose indicates an expected call of SendAndClose. +func (mr *MockObjectStorageService_PutObjectServerMockRecorder) SendAndClose(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendAndClose", reflect.TypeOf((*MockObjectStorageService_PutObjectServer)(nil).SendAndClose), arg0) +} + +// SendHeader mocks base method. +func (m *MockObjectStorageService_PutObjectServer) SendHeader(arg0 metadata.MD) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SendHeader", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// SendHeader indicates an expected call of SendHeader. +func (mr *MockObjectStorageService_PutObjectServerMockRecorder) SendHeader(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendHeader", reflect.TypeOf((*MockObjectStorageService_PutObjectServer)(nil).SendHeader), arg0) +} + +// SendMsg mocks base method. +func (m_2 *MockObjectStorageService_PutObjectServer) SendMsg(m interface{}) error { + m_2.ctrl.T.Helper() + ret := m_2.ctrl.Call(m_2, "SendMsg", m) + ret0, _ := ret[0].(error) + return ret0 +} + +// SendMsg indicates an expected call of SendMsg. +func (mr *MockObjectStorageService_PutObjectServerMockRecorder) SendMsg(m interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendMsg", reflect.TypeOf((*MockObjectStorageService_PutObjectServer)(nil).SendMsg), m) +} + +// SetHeader mocks base method. +func (m *MockObjectStorageService_PutObjectServer) SetHeader(arg0 metadata.MD) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHeader", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// SetHeader indicates an expected call of SetHeader. +func (mr *MockObjectStorageService_PutObjectServerMockRecorder) SetHeader(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHeader", reflect.TypeOf((*MockObjectStorageService_PutObjectServer)(nil).SetHeader), arg0) +} + +// SetTrailer mocks base method. +func (m *MockObjectStorageService_PutObjectServer) SetTrailer(arg0 metadata.MD) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetTrailer", arg0) +} + +// SetTrailer indicates an expected call of SetTrailer. +func (mr *MockObjectStorageService_PutObjectServerMockRecorder) SetTrailer(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTrailer", reflect.TypeOf((*MockObjectStorageService_PutObjectServer)(nil).SetTrailer), arg0) +} + +// MockObjectStorageService_GetObjectServer is a mock of ObjectStorageService_GetObjectServer interface. +type MockObjectStorageService_GetObjectServer struct { + ctrl *gomock.Controller + recorder *MockObjectStorageService_GetObjectServerMockRecorder +} + +// MockObjectStorageService_GetObjectServerMockRecorder is the mock recorder for MockObjectStorageService_GetObjectServer. +type MockObjectStorageService_GetObjectServerMockRecorder struct { + mock *MockObjectStorageService_GetObjectServer +} + +// NewMockObjectStorageService_GetObjectServer creates a new mock instance. +func NewMockObjectStorageService_GetObjectServer(ctrl *gomock.Controller) *MockObjectStorageService_GetObjectServer { + mock := &MockObjectStorageService_GetObjectServer{ctrl: ctrl} + mock.recorder = &MockObjectStorageService_GetObjectServerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockObjectStorageService_GetObjectServer) EXPECT() *MockObjectStorageService_GetObjectServerMockRecorder { + return m.recorder +} + +// Context mocks base method. +func (m *MockObjectStorageService_GetObjectServer) Context() context.Context { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Context") + ret0, _ := ret[0].(context.Context) + return ret0 +} + +// Context indicates an expected call of Context. +func (mr *MockObjectStorageService_GetObjectServerMockRecorder) Context() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Context", reflect.TypeOf((*MockObjectStorageService_GetObjectServer)(nil).Context)) +} + +// RecvMsg mocks base method. +func (m_2 *MockObjectStorageService_GetObjectServer) RecvMsg(m interface{}) error { + m_2.ctrl.T.Helper() + ret := m_2.ctrl.Call(m_2, "RecvMsg", m) + ret0, _ := ret[0].(error) + return ret0 +} + +// RecvMsg indicates an expected call of RecvMsg. +func (mr *MockObjectStorageService_GetObjectServerMockRecorder) RecvMsg(m interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecvMsg", reflect.TypeOf((*MockObjectStorageService_GetObjectServer)(nil).RecvMsg), m) +} + +// Send mocks base method. +func (m *MockObjectStorageService_GetObjectServer) Send(arg0 *v1.GetObjectOutput) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Send", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Send indicates an expected call of Send. +func (mr *MockObjectStorageService_GetObjectServerMockRecorder) Send(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Send", reflect.TypeOf((*MockObjectStorageService_GetObjectServer)(nil).Send), arg0) +} + +// SendHeader mocks base method. +func (m *MockObjectStorageService_GetObjectServer) SendHeader(arg0 metadata.MD) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SendHeader", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// SendHeader indicates an expected call of SendHeader. +func (mr *MockObjectStorageService_GetObjectServerMockRecorder) SendHeader(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendHeader", reflect.TypeOf((*MockObjectStorageService_GetObjectServer)(nil).SendHeader), arg0) +} + +// SendMsg mocks base method. +func (m_2 *MockObjectStorageService_GetObjectServer) SendMsg(m interface{}) error { + m_2.ctrl.T.Helper() + ret := m_2.ctrl.Call(m_2, "SendMsg", m) + ret0, _ := ret[0].(error) + return ret0 +} + +// SendMsg indicates an expected call of SendMsg. +func (mr *MockObjectStorageService_GetObjectServerMockRecorder) SendMsg(m interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendMsg", reflect.TypeOf((*MockObjectStorageService_GetObjectServer)(nil).SendMsg), m) +} + +// SetHeader mocks base method. +func (m *MockObjectStorageService_GetObjectServer) SetHeader(arg0 metadata.MD) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHeader", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// SetHeader indicates an expected call of SetHeader. +func (mr *MockObjectStorageService_GetObjectServerMockRecorder) SetHeader(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHeader", reflect.TypeOf((*MockObjectStorageService_GetObjectServer)(nil).SetHeader), arg0) +} + +// SetTrailer mocks base method. +func (m *MockObjectStorageService_GetObjectServer) SetTrailer(arg0 metadata.MD) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetTrailer", arg0) +} + +// SetTrailer indicates an expected call of SetTrailer. +func (mr *MockObjectStorageService_GetObjectServerMockRecorder) SetTrailer(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTrailer", reflect.TypeOf((*MockObjectStorageService_GetObjectServer)(nil).SetTrailer), arg0) +} + +// MockObjectStorageService_UploadPartServer is a mock of ObjectStorageService_UploadPartServer interface. +type MockObjectStorageService_UploadPartServer struct { + ctrl *gomock.Controller + recorder *MockObjectStorageService_UploadPartServerMockRecorder +} + +// MockObjectStorageService_UploadPartServerMockRecorder is the mock recorder for MockObjectStorageService_UploadPartServer. +type MockObjectStorageService_UploadPartServerMockRecorder struct { + mock *MockObjectStorageService_UploadPartServer +} + +// NewMockObjectStorageService_UploadPartServer creates a new mock instance. +func NewMockObjectStorageService_UploadPartServer(ctrl *gomock.Controller) *MockObjectStorageService_UploadPartServer { + mock := &MockObjectStorageService_UploadPartServer{ctrl: ctrl} + mock.recorder = &MockObjectStorageService_UploadPartServerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockObjectStorageService_UploadPartServer) EXPECT() *MockObjectStorageService_UploadPartServerMockRecorder { + return m.recorder +} + +// Context mocks base method. +func (m *MockObjectStorageService_UploadPartServer) Context() context.Context { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Context") + ret0, _ := ret[0].(context.Context) + return ret0 +} + +// Context indicates an expected call of Context. +func (mr *MockObjectStorageService_UploadPartServerMockRecorder) Context() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Context", reflect.TypeOf((*MockObjectStorageService_UploadPartServer)(nil).Context)) +} + +// Recv mocks base method. +func (m *MockObjectStorageService_UploadPartServer) Recv() (*v1.UploadPartInput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Recv") + ret0, _ := ret[0].(*v1.UploadPartInput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Recv indicates an expected call of Recv. +func (mr *MockObjectStorageService_UploadPartServerMockRecorder) Recv() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Recv", reflect.TypeOf((*MockObjectStorageService_UploadPartServer)(nil).Recv)) +} + +// RecvMsg mocks base method. +func (m_2 *MockObjectStorageService_UploadPartServer) RecvMsg(m interface{}) error { + m_2.ctrl.T.Helper() + ret := m_2.ctrl.Call(m_2, "RecvMsg", m) + ret0, _ := ret[0].(error) + return ret0 +} + +// RecvMsg indicates an expected call of RecvMsg. +func (mr *MockObjectStorageService_UploadPartServerMockRecorder) RecvMsg(m interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecvMsg", reflect.TypeOf((*MockObjectStorageService_UploadPartServer)(nil).RecvMsg), m) +} + +// SendAndClose mocks base method. +func (m *MockObjectStorageService_UploadPartServer) SendAndClose(arg0 *v1.UploadPartOutput) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SendAndClose", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// SendAndClose indicates an expected call of SendAndClose. +func (mr *MockObjectStorageService_UploadPartServerMockRecorder) SendAndClose(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendAndClose", reflect.TypeOf((*MockObjectStorageService_UploadPartServer)(nil).SendAndClose), arg0) +} + +// SendHeader mocks base method. +func (m *MockObjectStorageService_UploadPartServer) SendHeader(arg0 metadata.MD) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SendHeader", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// SendHeader indicates an expected call of SendHeader. +func (mr *MockObjectStorageService_UploadPartServerMockRecorder) SendHeader(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendHeader", reflect.TypeOf((*MockObjectStorageService_UploadPartServer)(nil).SendHeader), arg0) +} + +// SendMsg mocks base method. +func (m_2 *MockObjectStorageService_UploadPartServer) SendMsg(m interface{}) error { + m_2.ctrl.T.Helper() + ret := m_2.ctrl.Call(m_2, "SendMsg", m) + ret0, _ := ret[0].(error) + return ret0 +} + +// SendMsg indicates an expected call of SendMsg. +func (mr *MockObjectStorageService_UploadPartServerMockRecorder) SendMsg(m interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendMsg", reflect.TypeOf((*MockObjectStorageService_UploadPartServer)(nil).SendMsg), m) +} + +// SetHeader mocks base method. +func (m *MockObjectStorageService_UploadPartServer) SetHeader(arg0 metadata.MD) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHeader", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// SetHeader indicates an expected call of SetHeader. +func (mr *MockObjectStorageService_UploadPartServerMockRecorder) SetHeader(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHeader", reflect.TypeOf((*MockObjectStorageService_UploadPartServer)(nil).SetHeader), arg0) +} + +// SetTrailer mocks base method. +func (m *MockObjectStorageService_UploadPartServer) SetTrailer(arg0 metadata.MD) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetTrailer", arg0) +} + +// SetTrailer indicates an expected call of SetTrailer. +func (mr *MockObjectStorageService_UploadPartServerMockRecorder) SetTrailer(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTrailer", reflect.TypeOf((*MockObjectStorageService_UploadPartServer)(nil).SetTrailer), arg0) +} + +// MockObjectStorageService_AppendObjectServer is a mock of ObjectStorageService_AppendObjectServer interface. +type MockObjectStorageService_AppendObjectServer struct { + ctrl *gomock.Controller + recorder *MockObjectStorageService_AppendObjectServerMockRecorder +} + +// MockObjectStorageService_AppendObjectServerMockRecorder is the mock recorder for MockObjectStorageService_AppendObjectServer. +type MockObjectStorageService_AppendObjectServerMockRecorder struct { + mock *MockObjectStorageService_AppendObjectServer +} + +// NewMockObjectStorageService_AppendObjectServer creates a new mock instance. +func NewMockObjectStorageService_AppendObjectServer(ctrl *gomock.Controller) *MockObjectStorageService_AppendObjectServer { + mock := &MockObjectStorageService_AppendObjectServer{ctrl: ctrl} + mock.recorder = &MockObjectStorageService_AppendObjectServerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockObjectStorageService_AppendObjectServer) EXPECT() *MockObjectStorageService_AppendObjectServerMockRecorder { + return m.recorder +} + +// Context mocks base method. +func (m *MockObjectStorageService_AppendObjectServer) Context() context.Context { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Context") + ret0, _ := ret[0].(context.Context) + return ret0 +} + +// Context indicates an expected call of Context. +func (mr *MockObjectStorageService_AppendObjectServerMockRecorder) Context() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Context", reflect.TypeOf((*MockObjectStorageService_AppendObjectServer)(nil).Context)) +} + +// Recv mocks base method. +func (m *MockObjectStorageService_AppendObjectServer) Recv() (*v1.AppendObjectInput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Recv") + ret0, _ := ret[0].(*v1.AppendObjectInput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Recv indicates an expected call of Recv. +func (mr *MockObjectStorageService_AppendObjectServerMockRecorder) Recv() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Recv", reflect.TypeOf((*MockObjectStorageService_AppendObjectServer)(nil).Recv)) +} + +// RecvMsg mocks base method. +func (m_2 *MockObjectStorageService_AppendObjectServer) RecvMsg(m interface{}) error { + m_2.ctrl.T.Helper() + ret := m_2.ctrl.Call(m_2, "RecvMsg", m) + ret0, _ := ret[0].(error) + return ret0 +} + +// RecvMsg indicates an expected call of RecvMsg. +func (mr *MockObjectStorageService_AppendObjectServerMockRecorder) RecvMsg(m interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecvMsg", reflect.TypeOf((*MockObjectStorageService_AppendObjectServer)(nil).RecvMsg), m) +} + +// SendAndClose mocks base method. +func (m *MockObjectStorageService_AppendObjectServer) SendAndClose(arg0 *v1.AppendObjectOutput) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SendAndClose", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// SendAndClose indicates an expected call of SendAndClose. +func (mr *MockObjectStorageService_AppendObjectServerMockRecorder) SendAndClose(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendAndClose", reflect.TypeOf((*MockObjectStorageService_AppendObjectServer)(nil).SendAndClose), arg0) +} + +// SendHeader mocks base method. +func (m *MockObjectStorageService_AppendObjectServer) SendHeader(arg0 metadata.MD) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SendHeader", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// SendHeader indicates an expected call of SendHeader. +func (mr *MockObjectStorageService_AppendObjectServerMockRecorder) SendHeader(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendHeader", reflect.TypeOf((*MockObjectStorageService_AppendObjectServer)(nil).SendHeader), arg0) +} + +// SendMsg mocks base method. +func (m_2 *MockObjectStorageService_AppendObjectServer) SendMsg(m interface{}) error { + m_2.ctrl.T.Helper() + ret := m_2.ctrl.Call(m_2, "SendMsg", m) + ret0, _ := ret[0].(error) + return ret0 +} + +// SendMsg indicates an expected call of SendMsg. +func (mr *MockObjectStorageService_AppendObjectServerMockRecorder) SendMsg(m interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendMsg", reflect.TypeOf((*MockObjectStorageService_AppendObjectServer)(nil).SendMsg), m) +} + +// SetHeader mocks base method. +func (m *MockObjectStorageService_AppendObjectServer) SetHeader(arg0 metadata.MD) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHeader", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// SetHeader indicates an expected call of SetHeader. +func (mr *MockObjectStorageService_AppendObjectServerMockRecorder) SetHeader(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHeader", reflect.TypeOf((*MockObjectStorageService_AppendObjectServer)(nil).SetHeader), arg0) +} + +// SetTrailer mocks base method. +func (m *MockObjectStorageService_AppendObjectServer) SetTrailer(arg0 metadata.MD) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetTrailer", arg0) +} + +// SetTrailer indicates an expected call of SetTrailer. +func (mr *MockObjectStorageService_AppendObjectServerMockRecorder) SetTrailer(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTrailer", reflect.TypeOf((*MockObjectStorageService_AppendObjectServer)(nil).SetTrailer), arg0) +} From 37cb94aa22971ba49572d68968129e7062db7d68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 27 Jun 2022 17:57:54 +0800 Subject: [PATCH 049/126] fix configure ut --- pkg/runtime/config_test.go | 6 +++--- pkg/runtime/options_test.go | 2 -- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/pkg/runtime/config_test.go b/pkg/runtime/config_test.go index 688e2d8ca6..faa25e482a 100644 --- a/pkg/runtime/config_test.go +++ b/pkg/runtime/config_test.go @@ -17,9 +17,9 @@ import ( "encoding/json" "testing" - "github.com/stretchr/testify/assert" + "mosn.io/layotto/components/file" - "mosn.io/layotto/components/file/aliyun" + "github.com/stretchr/testify/assert" ) func TestConfig(t *testing.T) { @@ -43,7 +43,7 @@ func TestConfig(t *testing.T) { mscf, err := ParseRuntimeConfig([]byte(data)) assert.Nil(t, err) v := mscf.Files["aliOSS"] - m := make([]*aliyun.OssMetadata, 0) + m := make([]*file.OssMetadata, 0) err = json.Unmarshal(v.Metadata, &m) assert.Nil(t, err) for _, x := range m { diff --git a/pkg/runtime/options_test.go b/pkg/runtime/options_test.go index d5593676ae..62af28c0f8 100644 --- a/pkg/runtime/options_test.go +++ b/pkg/runtime/options_test.go @@ -22,8 +22,6 @@ import ( "github.com/stretchr/testify/assert" ) -var haha map[string]string - func TestWithErrInterceptor(t *testing.T) { cnt := 0 var f ErrInterceptor = func(err error, format string, args ...interface{}) { From 80b02ca406ae97f18af2a8ed5615289de877c874 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 27 Jun 2022 19:52:35 +0800 Subject: [PATCH 050/126] fix ut --- components/file/aliyun/file.go | 1 - components/file/aliyun/oss_test.go | 56 +++++++++++++++++++++++++++-- components/file/aws/file.go | 8 ++--- components/file/aws/oss.go | 9 ++--- components/file/aws/oss_test.go | 57 ------------------------------ 5 files changed, 63 insertions(+), 68 deletions(-) delete mode 100644 components/file/aws/oss_test.go diff --git a/components/file/aliyun/file.go b/components/file/aliyun/file.go index 75f5513139..3dc39e7249 100644 --- a/components/file/aliyun/file.go +++ b/components/file/aliyun/file.go @@ -32,7 +32,6 @@ import ( ) const ( - endpointKey = "endpoint" storageTypeKey = "storageType" ) diff --git a/components/file/aliyun/oss_test.go b/components/file/aliyun/oss_test.go index 652d44d1cc..3d30dac56e 100644 --- a/components/file/aliyun/oss_test.go +++ b/components/file/aliyun/oss_test.go @@ -27,13 +27,30 @@ import ( ) const ( - conf = `[ + confWithoutUidAndBucket = `[ { "endpoint": "endpoint_address", "accessKeyID": "accessKey", "accessKeySecret": "secret" } ]` + confWithUid = `[ + { + "uid": "123", + "endpoint": "endpoint_address", + "accessKeyID": "accessKey", + "accessKeySecret": "secret" + } + ]` + confWithUidAndBucket = `[ + { + "uid": "123", + "buckets": ["bucket1","bucket2"], + "endpoint": "endpoint_address", + "accessKeyID": "accessKey", + "accessKeySecret": "secret" + } + ]` ) func TestInitAliyunOss(t *testing.T) { @@ -42,5 +59,40 @@ func TestInitAliyunOss(t *testing.T) { clients, err := f([]byte("hello"), map[string]string{}) assert.Equal(t, err, file.ErrInvalid) assert.Nil(t, clients) - //oss.InitConfig(context.TODO(), file.FileConfig{}) + clients, err = f([]byte(confWithoutUidAndBucket), map[string]string{}) + assert.NotEqual(t, file.ErrInvalid, err) + assert.NotNil(t, clients) + client, ok := clients[""] + assert.Equal(t, true, ok) + assert.NotNil(t, client) + + clients, err = f([]byte(confWithUid), map[string]string{}) + assert.NotEqual(t, file.ErrInvalid, err) + assert.NotNil(t, clients) + client, ok = clients[""] + assert.Equal(t, false, ok) + assert.Nil(t, client) + client, ok = clients["123"] + assert.Equal(t, true, ok) + assert.NotNil(t, client) + + clients, err = f([]byte(confWithUidAndBucket), map[string]string{}) + assert.NotEqual(t, file.ErrInvalid, err) + assert.NotNil(t, clients) + client, ok = clients[""] + assert.Equal(t, false, ok) + assert.Nil(t, client) + + client, ok = clients["123"] + assert.Equal(t, true, ok) + assert.NotNil(t, client) + + client, ok = clients["bucket1"] + assert.Equal(t, true, ok) + assert.NotNil(t, client) + + client, ok = clients["bucket2"] + assert.Equal(t, true, ok) + assert.NotNil(t, client) + } diff --git a/components/file/aws/file.go b/components/file/aws/file.go index 25e4e7227e..861f071f09 100644 --- a/components/file/aws/file.go +++ b/components/file/aws/file.go @@ -150,13 +150,13 @@ func (a *AwsOss) Put(ctx context.Context, st *file.PutFileStu) error { } // selectClient choose aws client from exist client-map, key is endpoint, value is client instance. -func (s *AwsOss) selectClient(bucket string) (*s3.Client, error) { - if client, ok := s.client[bucket]; ok { +func (a *AwsOss) selectClient(bucket string) (*s3.Client, error) { + if client, ok := a.client[bucket]; ok { return client, nil } // if not specify endpoint, select default one - if len(s.client) == 1 { - for _, client := range s.client { + if len(a.client) == 1 { + for _, client := range a.client { return client, nil } } diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index de63b231a9..cac536578f 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -73,7 +73,7 @@ func AwsDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string) ( if _, ok := clients[bucketName]; ok { continue } - + clients[bucketName] = client } } return clients, nil @@ -574,6 +574,9 @@ func (a *AwsOss) HeadObject(ctx context.Context, req *file.HeadObjectInput) (*fi } input := &s3.HeadObjectInput{} err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + if err != nil { + return nil, err + } resp, err := client.HeadObject(ctx, input) if err != nil { return nil, err @@ -620,10 +623,8 @@ func (a *AwsOss) SignURL(ctx context.Context, req *file.SignURLInput) (*file.Sig } return &file.SignURLOutput{SignedUrl: resp.URL}, nil default: - return nil, errors.New(fmt.Sprintf("not supported method %+v now", req.Method)) + return nil, fmt.Errorf("not supported method %+v now", req.Method) } - - return nil, nil } func (a *AwsOss) UpdateDownLoadBandwidthRateLimit(ctx context.Context, req *file.UpdateBandwidthRateLimitInput) error { diff --git a/components/file/aws/oss_test.go b/components/file/aws/oss_test.go deleted file mode 100644 index 4a669e760a..0000000000 --- a/components/file/aws/oss_test.go +++ /dev/null @@ -1,57 +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 aws - -import ( - "fmt" - "testing" - - "github.com/jinzhu/copier" -) - -func TestCopyWithConverterStrToStrPointer(t *testing.T) { - type S1 struct { - name string - } - - type S2 struct { - name string - } - - type SrcStruct struct { - Field1 string - s *S1 - } - - type DestStruct struct { - Field1 *string - s *S2 - } - - src := SrcStruct{s: &S1{name: "s1"}} - - var dst DestStruct - - err := copier.Copy(&dst, &src) - - if err != nil { - t.Fatalf(`Should be able to copy from src to dst object. %v`, err) - return - } - - fmt.Println(dst.Field1, dst.s) -} From 624661b0f0e38cf28e8fa11106af3e262273702d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 27 Jun 2022 19:57:21 +0800 Subject: [PATCH 051/126] fix lint --- components/file/aws/file.go | 1 - 1 file changed, 1 deletion(-) diff --git a/components/file/aws/file.go b/components/file/aws/file.go index 861f071f09..4c325e3679 100644 --- a/components/file/aws/file.go +++ b/components/file/aws/file.go @@ -35,7 +35,6 @@ import ( ) const ( - endpointKey = "endpoint" defaultCredentialsSource = "provider" ) From f51f75bdbd2c59bfdfb570d21014ac1c8fcd05f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 28 Jun 2022 12:23:03 +0800 Subject: [PATCH 052/126] add ut coverage and fix some bug --- components/file/aliyun/option_test.go | 126 +++++++++++++++ components/file/aws/option.go | 2 +- components/file/aws/option_test.go | 36 +++++ components/file/oss.go | 23 ++- pkg/grpc/extension/s3/s3_test.go | 218 ++++++++++++++++++++++++-- 5 files changed, 382 insertions(+), 23 deletions(-) create mode 100644 components/file/aliyun/option_test.go create mode 100644 components/file/aws/option_test.go diff --git a/components/file/aliyun/option_test.go b/components/file/aliyun/option_test.go new file mode 100644 index 0000000000..3dcf556086 --- /dev/null +++ b/components/file/aliyun/option_test.go @@ -0,0 +1,126 @@ +package aliyun + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestOptionNil(t *testing.T) { + assert.Nil(t, Prefix("")) + assert.Nil(t, KeyMarker("")) + assert.Nil(t, MaxUploads(0)) + assert.Nil(t, Delimiter("")) + assert.Nil(t, UploadIDMarker("")) + assert.Nil(t, VersionId("")) + assert.Nil(t, ObjectACL("")) + assert.Nil(t, CacheControl("")) + assert.Nil(t, ContentEncoding("")) + assert.Nil(t, ACL("")) + assert.Nil(t, ContentType("")) + assert.Nil(t, ContentLength(0)) + assert.Nil(t, ContentDisposition("")) + assert.Nil(t, ContentLanguage("")) + assert.Nil(t, ContentMD5("")) + assert.Nil(t, Expires(0)) + assert.Nil(t, AcceptEncoding("")) + assert.Nil(t, IfModifiedSince(0)) + assert.Nil(t, IfMatch("")) + assert.Nil(t, IfNoneMatch("")) + assert.Nil(t, Range(0, 0)) + assert.Nil(t, CopySourceIfMatch("")) + assert.Nil(t, CopySourceIfNoneMatch("")) + assert.Nil(t, CopySourceIfModifiedSince(0)) + assert.Nil(t, CopySourceIfUnmodifiedSince(0)) + assert.Nil(t, MetadataDirective("")) + assert.Nil(t, ServerSideEncryption("")) + assert.Nil(t, ServerSideEncryptionKeyID("")) + assert.Nil(t, ServerSideDataEncryption("")) + assert.Nil(t, SSECAlgorithm("")) + assert.Nil(t, SSECKey("")) + assert.Nil(t, SSECKeyMd5("")) + assert.Nil(t, Origin("")) + assert.Nil(t, RangeBehavior("")) + assert.Nil(t, PartHashCtxHeader("")) + assert.Nil(t, PartNumberMarker(0)) + assert.Nil(t, PartHashCtxParam("")) + assert.Nil(t, PartMd5CtxHeader("")) + assert.Nil(t, PartMd5CtxParam("")) + assert.Nil(t, Marker("")) + assert.Nil(t, MaxKeys(0)) + assert.Nil(t, EncodingType("")) + assert.Nil(t, VersionId("")) + assert.Nil(t, VersionIdMarker("")) + assert.Nil(t, MaxParts(0)) + assert.Nil(t, StorageClass("")) + assert.Nil(t, ResponseContentDisposition("")) + assert.Nil(t, ResponseCacheControl("")) + assert.Nil(t, ResponseContentEncoding("")) + assert.Nil(t, ResponseContentLanguage("")) + assert.Nil(t, ResponseContentType("")) + assert.Nil(t, ResponseExpires("")) + assert.Nil(t, Process("")) + assert.Nil(t, TrafficLimitParam(0)) + assert.Nil(t, RequestPayer("")) +} + +func TestOptionNotNil(t *testing.T) { + assert.NotNil(t, Prefix(" ")) + assert.NotNil(t, KeyMarker(" ")) + assert.NotNil(t, MaxUploads(1)) + assert.NotNil(t, Delimiter(" ")) + assert.NotNil(t, UploadIDMarker(" ")) + assert.NotNil(t, VersionId(" ")) + assert.NotNil(t, ObjectACL(" ")) + assert.NotNil(t, CacheControl(" ")) + assert.NotNil(t, ContentEncoding(" ")) + assert.NotNil(t, ACL(" ")) + assert.NotNil(t, ContentType(" ")) + assert.NotNil(t, ContentLength(1)) + assert.NotNil(t, ContentDisposition(" ")) + assert.NotNil(t, ContentLanguage(" ")) + assert.NotNil(t, ContentMD5(" ")) + assert.NotNil(t, Expires(1)) + assert.NotNil(t, AcceptEncoding(" ")) + assert.NotNil(t, IfModifiedSince(1)) + assert.NotNil(t, IfMatch(" ")) + assert.NotNil(t, IfNoneMatch(" ")) + assert.NotNil(t, Range(1, 1)) + assert.NotNil(t, CopySourceIfMatch(" ")) + assert.NotNil(t, CopySourceIfNoneMatch(" ")) + assert.NotNil(t, CopySourceIfModifiedSince(1)) + assert.NotNil(t, CopySourceIfUnmodifiedSince(1)) + assert.NotNil(t, MetadataDirective(" ")) + assert.NotNil(t, Meta(" ", " ")) + assert.NotNil(t, ServerSideEncryption(" ")) + assert.NotNil(t, ServerSideEncryptionKeyID(" ")) + assert.NotNil(t, ServerSideDataEncryption(" ")) + assert.NotNil(t, SSECAlgorithm(" ")) + assert.NotNil(t, SSECKey(" ")) + assert.NotNil(t, SSECKeyMd5(" ")) + assert.NotNil(t, Origin(" ")) + assert.NotNil(t, RangeBehavior(" ")) + assert.NotNil(t, PartHashCtxHeader(" ")) + assert.NotNil(t, PartNumberMarker(1)) + assert.NotNil(t, PartHashCtxParam(" ")) + assert.NotNil(t, PartMd5CtxHeader(" ")) + assert.NotNil(t, PartMd5CtxParam(" ")) + assert.NotNil(t, Marker(" ")) + assert.NotNil(t, MaxKeys(1)) + assert.NotNil(t, EncodingType(" ")) + assert.NotNil(t, VersionId(" ")) + assert.NotNil(t, VersionIdMarker(" ")) + assert.NotNil(t, MaxParts(1)) + assert.NotNil(t, StorageClass(" ")) + assert.NotNil(t, ResponseContentDisposition(" ")) + assert.NotNil(t, ResponseCacheControl(" ")) + assert.NotNil(t, ResponseContentEncoding(" ")) + assert.NotNil(t, ResponseContentLanguage(" ")) + assert.NotNil(t, ResponseContentType(" ")) + assert.NotNil(t, ResponseExpires(" ")) + assert.NotNil(t, Process(" ")) + assert.NotNil(t, TrafficLimitParam(1)) + assert.NotNil(t, SetHeader(" ", " ")) + assert.NotNil(t, AddParam(" ", " ")) + assert.NotNil(t, RequestPayer(" ")) +} diff --git a/components/file/aws/option.go b/components/file/aws/option.go index 2fa4189bee..8011469507 100644 --- a/components/file/aws/option.go +++ b/components/file/aws/option.go @@ -45,7 +45,7 @@ var ( if !ok { return nil, errors.New("src type not matching") } - t := time.Unix(0, s) + t := time.Unix(s, 0) return &t, nil }, } diff --git a/components/file/aws/option_test.go b/components/file/aws/option_test.go new file mode 100644 index 0000000000..cba31857df --- /dev/null +++ b/components/file/aws/option_test.go @@ -0,0 +1,36 @@ +package aws + +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, TestString: ""} + destValue := &ValueWithTimer{} + err := copier.CopyWithOption(destValue, srcValue, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point, 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/file/oss.go b/components/file/oss.go index f0efd426c8..8edb27d3dc 100644 --- a/components/file/oss.go +++ b/components/file/oss.go @@ -153,19 +153,26 @@ type PutObjectTaggingOutput struct { } type DeleteObjectTaggingInput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` + VersionId string `json:"version_id,omitempty"` + ExpectedBucketOwner string `json:"expected_bucket_owner,omitempty"` } type DeleteObjectTaggingOutput struct { VersionId string `protobuf:"bytes,1,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } type GetObjectTaggingInput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` + VersionId string ` json:"version_id,omitempty"` + ExpectedBucketOwner string `json:"expected_bucket_owner,omitempty"` + RequestPayer string ` json:"request_payer,omitempty"` } type GetObjectTaggingOutput struct { - Tags map[string]string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Tags map[string]string `json:"tags,omitempty"` + VersionId string `json:"version_id,omitempty"` + ResultMetadata map[string]string `json:"result_metadata,omitempty"` } type CopySource struct { @@ -186,7 +193,7 @@ type CopyObjectInput struct { Metadata map[string]string `json:"metadata,omitempty"` } type CopyObjectOutput struct { - CopyObjectResult *CopyObjectResult `protobuf:"bytes,1,opt,name=CopyObjectResult,proto3" json:"CopyObjectResult,omitempty"` + CopyObjectResult *CopyObjectResult `json:"copy_object_result,omitempty"` } type CopyObjectResult struct { ETag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` @@ -194,8 +201,8 @@ type CopyObjectResult struct { } type DeleteObjectsInput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Delete *Delete `protobuf:"bytes,2,opt,name=Delete,proto3" json:"Delete,omitempty"` + Bucket string `json:"bucket,omitempty"` + Delete *Delete `json:"delete,omitempty"` } type Delete struct { Objects []*ObjectIdentifier `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` diff --git a/pkg/grpc/extension/s3/s3_test.go b/pkg/grpc/extension/s3/s3_test.go index c937a06225..2194a520c6 100644 --- a/pkg/grpc/extension/s3/s3_test.go +++ b/pkg/grpc/extension/s3/s3_test.go @@ -21,9 +21,11 @@ import ( "errors" "testing" + mockoss "mosn.io/layotto/pkg/mock/components/oss" + "mosn.io/pkg/buffer" - mock_s3 "mosn.io/layotto/pkg/mock/runtime/oss" + mocks3 "mosn.io/layotto/pkg/mock/runtime/oss" "github.com/stretchr/testify/assert" "google.golang.org/grpc/codes" @@ -36,8 +38,6 @@ import ( "github.com/golang/mock/gomock" - mock_oss "mosn.io/layotto/pkg/mock/components/oss" - "mosn.io/layotto/pkg/grpc" ) @@ -50,11 +50,13 @@ func (m *MockDataStream) Close() error { return nil } -func TestS3Server(t *testing.T) { +//TestInitClient +func TestInitClient(t *testing.T) { + // prepare oss server ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} ctrl := gomock.NewController(t) - mockoss := mock_oss.NewMockOss(ctrl) - ac.Oss["mockoss"] = mockoss + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss["mockossServer"] = mockossServer NewS3Server(ac) s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} @@ -63,29 +65,217 @@ func TestS3Server(t *testing.T) { ctx := context.TODO() _, err := s3Server.InitClient(ctx, initReq) assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) - mockoss.EXPECT().InitClient(ctx, &l8s3.InitRequest{Metadata: initReq.Metadata}).Return(nil) - initReq.StoreName = "mockoss" + mockossServer.EXPECT().InitClient(ctx, &l8s3.InitRequest{Metadata: initReq.Metadata}).Return(nil) + initReq.StoreName = "mockossServer" _, err = s3Server.InitClient(ctx, initReq) assert.Nil(t, err) - - mockoss.EXPECT().InitClient(ctx, &l8s3.InitRequest{Metadata: initReq.Metadata}).Return(errors.New("init fail")) + mockossServer.EXPECT().InitClient(ctx, &l8s3.InitRequest{Metadata: initReq.Metadata}).Return(errors.New("init fail")) _, err = s3Server.InitClient(ctx, initReq) assert.Equal(t, err.Error(), "init fail") +} + +// TestGetObject +func TestGetObject(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss["mockossServer"] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + // Test GetObject function - mockServer := mock_s3.NewMockObjectStorageService_GetObjectServer(ctrl) + ctx := context.TODO() + mockServer := mocks3.NewMockObjectStorageService_GetObjectServer(ctrl) getObjectReq := &s3.GetObjectInput{StoreName: "NoStore", Bucket: "layotto", Key: "object"} - err = s3Server.GetObject(getObjectReq, mockServer) + err := s3Server.GetObject(getObjectReq, mockServer) assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) iobuf := buffer.NewIoBufferBytes([]byte("hello")) dataStream := &MockDataStream{iobuf} output := &file.GetObjectOutput{Etag: "tag"} output.DataStream = dataStream mockServer.EXPECT().Context().Return(ctx) - mockoss.EXPECT().GetObject(ctx, &l8s3.GetObjectInput{Bucket: "layotto", Key: "object"}).Return(output, nil) - getObjectReq.StoreName = "mockoss" + mockossServer.EXPECT().GetObject(ctx, &l8s3.GetObjectInput{Bucket: "layotto", Key: "object"}).Return(output, nil) + getObjectReq.StoreName = "mockossServer" mockServer.EXPECT().Send(&s3.GetObjectOutput{Body: []byte("hello"), Etag: "tag"}).Times(1) err = s3Server.GetObject(getObjectReq, mockServer) assert.Nil(t, err) +} + +// TestDeleteObject +func TestDeleteObject(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss["mockossServer"] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + ctx := context.TODO() + deleteObjectReq := &s3.DeleteObjectInput{StoreName: "NoStore", Bucket: "layotto", Key: "object"} + _, err := s3Server.DeleteObject(ctx, deleteObjectReq) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + output := &l8s3.DeleteObjectOutput{DeleteMarker: false, VersionId: "123"} + mockossServer.EXPECT().DeleteObject(ctx, &l8s3.DeleteObjectInput{Bucket: "layotto", Key: "object"}).Return(output, nil) + deleteObjectReq.StoreName = "mockossServer" + resp, err := s3Server.DeleteObject(ctx, deleteObjectReq) + assert.Nil(t, err) + assert.Equal(t, false, resp.DeleteMarker) + assert.Equal(t, "123", resp.VersionId) +} + +//TestPutObjectTagging +func TestPutObjectTagging(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss["mockossServer"] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + ctx := context.TODO() + req := &s3.PutObjectTaggingInput{StoreName: "NoStore", Bucket: "layotto", Key: "object", Tags: map[string]string{"key": "value"}, VersionId: "123"} + _, err := s3Server.PutObjectTagging(ctx, req) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + output := &l8s3.PutObjectTaggingOutput{} + mockossServer.EXPECT().PutObjectTagging(ctx, &l8s3.PutObjectTaggingInput{Bucket: "layotto", Key: "object", VersionId: "123", Tags: map[string]string{"key": "value"}}).Return(output, nil) + req.StoreName = "mockossServer" + _, err = s3Server.PutObjectTagging(ctx, req) + assert.Nil(t, err) +} + +//TestDeleteObjectTagging +func TestDeleteObjectTagging(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss["mockossServer"] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + ctx := context.TODO() + req := &s3.DeleteObjectTaggingInput{StoreName: "NoStore", Bucket: "layotto", Key: "object", VersionId: "123"} + _, err := s3Server.DeleteObjectTagging(ctx, req) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + output := &l8s3.DeleteObjectTaggingOutput{VersionId: "123"} + mockossServer.EXPECT().DeleteObjectTagging(ctx, &l8s3.DeleteObjectTaggingInput{Bucket: "layotto", Key: "object", VersionId: "123"}).Return(output, nil) + req.StoreName = "mockossServer" + _, err = s3Server.DeleteObjectTagging(ctx, req) + assert.Nil(t, err) +} + +//TestGetObjectTagging +func TestGetObjectTagging(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss["mockossServer"] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + ctx := context.TODO() + req := &s3.GetObjectTaggingInput{StoreName: "NoStore", Bucket: "layotto", Key: "object", VersionId: "123"} + _, err := s3Server.GetObjectTagging(ctx, req) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + output := &l8s3.GetObjectTaggingOutput{Tags: map[string]string{"key": "value"}, VersionId: "123"} + mockossServer.EXPECT().GetObjectTagging(ctx, &l8s3.GetObjectTaggingInput{Bucket: "layotto", Key: "object", VersionId: "123"}).Return(output, nil) + req.StoreName = "mockossServer" + resp, err := s3Server.GetObjectTagging(ctx, req) + assert.Nil(t, err) + assert.Equal(t, "value", resp.Tags["key"]) + assert.Equal(t, "123", resp.VersionId) +} + +//TestCopyObject +func TestCopyObject(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss["mockossServer"] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + ctx := context.TODO() + req := &s3.CopyObjectInput{StoreName: "NoStore", Bucket: "layotto", Key: "object"} + _, err := s3Server.CopyObject(ctx, req) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + output := &l8s3.CopyObjectOutput{CopyObjectResult: &l8s3.CopyObjectResult{ETag: "etag"}} + mockossServer.EXPECT().CopyObject(ctx, &l8s3.CopyObjectInput{Bucket: "layotto", Key: "object"}).Return(output, nil) + req.StoreName = "mockossServer" + resp, err := s3Server.CopyObject(ctx, req) + assert.Nil(t, err) + assert.Equal(t, "etag", resp.CopyObjectResult.Etag) +} + +//TestDeleteObjects +func TestDeleteObjects(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss["mockossServer"] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + ctx := context.TODO() + req := &s3.DeleteObjectsInput{StoreName: "NoStore", Bucket: "layotto", Delete: &s3.Delete{Quiet: true, Objects: []*s3.ObjectIdentifier{{Key: "object", VersionId: "version"}}}} + _, err := s3Server.DeleteObjects(ctx, req) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + output := &l8s3.DeleteObjectsOutput{Deleted: []*l8s3.DeletedObject{{DeleteMarker: true, VersionId: "version"}}} + mockossServer.EXPECT().DeleteObjects(ctx, &l8s3.DeleteObjectsInput{Bucket: "layotto", Delete: &l8s3.Delete{Quiet: true, Objects: []*l8s3.ObjectIdentifier{{Key: "object", VersionId: "version"}}}}).Return(output, nil) + req.StoreName = "mockossServer" + resp, err := s3Server.DeleteObjects(ctx, req) + assert.Nil(t, err) + assert.Equal(t, true, resp.Deleted[0].DeleteMarker) + assert.Equal(t, "version", resp.Deleted[0].VersionId) +} + +//TestListObjects +func TestListObjects(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss["mockossServer"] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + ctx := context.TODO() + req := &s3.ListObjectsInput{ + StoreName: "NoStore", + Bucket: "layotto", + Delimiter: "delimiter", + EncodingType: "EncodingType", + ExpectedBucketOwner: "ExpectedBucketOwner", + Marker: "Marker", + MaxKeys: 1, + Prefix: "Prefix", + RequestPayer: "RequestPayer", + } + _, err := s3Server.ListObjects(ctx, req) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + output := &l8s3.ListObjectsOutput{Delimiter: "delimiter", IsTruncated: true} + mockossServer.EXPECT().ListObjects(ctx, + &l8s3.ListObjectsInput{ + Bucket: "layotto", + Delimiter: "delimiter", + EncodingType: "EncodingType", + ExpectedBucketOwner: "ExpectedBucketOwner", + Marker: "Marker", + MaxKeys: 1, + Prefix: "Prefix", + RequestPayer: "RequestPayer", + }, + ).Return(output, nil) + req.StoreName = "mockossServer" + resp, err := s3Server.ListObjects(ctx, req) + assert.Nil(t, err) + assert.Equal(t, true, resp.IsTruncated) + assert.Equal(t, "delimiter", resp.Delimiter) } From 3a8e31fbe96c7982d0bc0a0800ff0039891c864a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 28 Jun 2022 12:29:07 +0800 Subject: [PATCH 053/126] add licence for ut file --- components/file/aliyun/option_test.go | 16 ++++++++++++++++ components/file/aws/option_test.go | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/components/file/aliyun/option_test.go b/components/file/aliyun/option_test.go index 3dcf556086..b41d5e6b40 100644 --- a/components/file/aliyun/option_test.go +++ b/components/file/aliyun/option_test.go @@ -1,3 +1,19 @@ +/* +* 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 aliyun import ( diff --git a/components/file/aws/option_test.go b/components/file/aws/option_test.go index cba31857df..60534bc7e3 100644 --- a/components/file/aws/option_test.go +++ b/components/file/aws/option_test.go @@ -1,3 +1,19 @@ +/* +* 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 aws import ( From d1d2d34b01712f5614a460a08827481a3b9d3ca1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 28 Jun 2022 13:11:27 +0800 Subject: [PATCH 054/126] fix go lint of ut --- pkg/grpc/extension/s3/s3_test.go | 40 ++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/pkg/grpc/extension/s3/s3_test.go b/pkg/grpc/extension/s3/s3_test.go index 2194a520c6..62471452d7 100644 --- a/pkg/grpc/extension/s3/s3_test.go +++ b/pkg/grpc/extension/s3/s3_test.go @@ -41,6 +41,10 @@ import ( "mosn.io/layotto/pkg/grpc" ) +const ( + MOCKSERVER = "mockossServer" +) + type MockDataStream struct { buffer.IoBuffer } @@ -56,7 +60,7 @@ func TestInitClient(t *testing.T) { ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) - ac.Oss["mockossServer"] = mockossServer + ac.Oss[MOCKSERVER] = mockossServer NewS3Server(ac) s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} @@ -66,7 +70,7 @@ func TestInitClient(t *testing.T) { _, err := s3Server.InitClient(ctx, initReq) assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) mockossServer.EXPECT().InitClient(ctx, &l8s3.InitRequest{Metadata: initReq.Metadata}).Return(nil) - initReq.StoreName = "mockossServer" + initReq.StoreName = MOCKSERVER _, err = s3Server.InitClient(ctx, initReq) assert.Nil(t, err) mockossServer.EXPECT().InitClient(ctx, &l8s3.InitRequest{Metadata: initReq.Metadata}).Return(errors.New("init fail")) @@ -81,7 +85,7 @@ func TestGetObject(t *testing.T) { ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) - ac.Oss["mockossServer"] = mockossServer + ac.Oss[MOCKSERVER] = mockossServer NewS3Server(ac) s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} @@ -97,7 +101,7 @@ func TestGetObject(t *testing.T) { output.DataStream = dataStream mockServer.EXPECT().Context().Return(ctx) mockossServer.EXPECT().GetObject(ctx, &l8s3.GetObjectInput{Bucket: "layotto", Key: "object"}).Return(output, nil) - getObjectReq.StoreName = "mockossServer" + getObjectReq.StoreName = MOCKSERVER mockServer.EXPECT().Send(&s3.GetObjectOutput{Body: []byte("hello"), Etag: "tag"}).Times(1) err = s3Server.GetObject(getObjectReq, mockServer) assert.Nil(t, err) @@ -109,7 +113,7 @@ func TestDeleteObject(t *testing.T) { ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) - ac.Oss["mockossServer"] = mockossServer + ac.Oss[MOCKSERVER] = mockossServer NewS3Server(ac) s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} @@ -119,7 +123,7 @@ func TestDeleteObject(t *testing.T) { assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) output := &l8s3.DeleteObjectOutput{DeleteMarker: false, VersionId: "123"} mockossServer.EXPECT().DeleteObject(ctx, &l8s3.DeleteObjectInput{Bucket: "layotto", Key: "object"}).Return(output, nil) - deleteObjectReq.StoreName = "mockossServer" + deleteObjectReq.StoreName = MOCKSERVER resp, err := s3Server.DeleteObject(ctx, deleteObjectReq) assert.Nil(t, err) assert.Equal(t, false, resp.DeleteMarker) @@ -132,7 +136,7 @@ func TestPutObjectTagging(t *testing.T) { ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) - ac.Oss["mockossServer"] = mockossServer + ac.Oss[MOCKSERVER] = mockossServer NewS3Server(ac) s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} @@ -142,7 +146,7 @@ func TestPutObjectTagging(t *testing.T) { assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) output := &l8s3.PutObjectTaggingOutput{} mockossServer.EXPECT().PutObjectTagging(ctx, &l8s3.PutObjectTaggingInput{Bucket: "layotto", Key: "object", VersionId: "123", Tags: map[string]string{"key": "value"}}).Return(output, nil) - req.StoreName = "mockossServer" + req.StoreName = MOCKSERVER _, err = s3Server.PutObjectTagging(ctx, req) assert.Nil(t, err) } @@ -153,7 +157,7 @@ func TestDeleteObjectTagging(t *testing.T) { ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) - ac.Oss["mockossServer"] = mockossServer + ac.Oss[MOCKSERVER] = mockossServer NewS3Server(ac) s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} @@ -163,7 +167,7 @@ func TestDeleteObjectTagging(t *testing.T) { assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) output := &l8s3.DeleteObjectTaggingOutput{VersionId: "123"} mockossServer.EXPECT().DeleteObjectTagging(ctx, &l8s3.DeleteObjectTaggingInput{Bucket: "layotto", Key: "object", VersionId: "123"}).Return(output, nil) - req.StoreName = "mockossServer" + req.StoreName = MOCKSERVER _, err = s3Server.DeleteObjectTagging(ctx, req) assert.Nil(t, err) } @@ -174,7 +178,7 @@ func TestGetObjectTagging(t *testing.T) { ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) - ac.Oss["mockossServer"] = mockossServer + ac.Oss[MOCKSERVER] = mockossServer NewS3Server(ac) s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} @@ -184,7 +188,7 @@ func TestGetObjectTagging(t *testing.T) { assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) output := &l8s3.GetObjectTaggingOutput{Tags: map[string]string{"key": "value"}, VersionId: "123"} mockossServer.EXPECT().GetObjectTagging(ctx, &l8s3.GetObjectTaggingInput{Bucket: "layotto", Key: "object", VersionId: "123"}).Return(output, nil) - req.StoreName = "mockossServer" + req.StoreName = MOCKSERVER resp, err := s3Server.GetObjectTagging(ctx, req) assert.Nil(t, err) assert.Equal(t, "value", resp.Tags["key"]) @@ -197,7 +201,7 @@ func TestCopyObject(t *testing.T) { ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) - ac.Oss["mockossServer"] = mockossServer + ac.Oss[MOCKSERVER] = mockossServer NewS3Server(ac) s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} @@ -207,7 +211,7 @@ func TestCopyObject(t *testing.T) { assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) output := &l8s3.CopyObjectOutput{CopyObjectResult: &l8s3.CopyObjectResult{ETag: "etag"}} mockossServer.EXPECT().CopyObject(ctx, &l8s3.CopyObjectInput{Bucket: "layotto", Key: "object"}).Return(output, nil) - req.StoreName = "mockossServer" + req.StoreName = MOCKSERVER resp, err := s3Server.CopyObject(ctx, req) assert.Nil(t, err) assert.Equal(t, "etag", resp.CopyObjectResult.Etag) @@ -219,7 +223,7 @@ func TestDeleteObjects(t *testing.T) { ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) - ac.Oss["mockossServer"] = mockossServer + ac.Oss[MOCKSERVER] = mockossServer NewS3Server(ac) s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} @@ -229,7 +233,7 @@ func TestDeleteObjects(t *testing.T) { assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) output := &l8s3.DeleteObjectsOutput{Deleted: []*l8s3.DeletedObject{{DeleteMarker: true, VersionId: "version"}}} mockossServer.EXPECT().DeleteObjects(ctx, &l8s3.DeleteObjectsInput{Bucket: "layotto", Delete: &l8s3.Delete{Quiet: true, Objects: []*l8s3.ObjectIdentifier{{Key: "object", VersionId: "version"}}}}).Return(output, nil) - req.StoreName = "mockossServer" + req.StoreName = MOCKSERVER resp, err := s3Server.DeleteObjects(ctx, req) assert.Nil(t, err) assert.Equal(t, true, resp.Deleted[0].DeleteMarker) @@ -242,7 +246,7 @@ func TestListObjects(t *testing.T) { ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) - ac.Oss["mockossServer"] = mockossServer + ac.Oss[MOCKSERVER] = mockossServer NewS3Server(ac) s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} @@ -273,7 +277,7 @@ func TestListObjects(t *testing.T) { RequestPayer: "RequestPayer", }, ).Return(output, nil) - req.StoreName = "mockossServer" + req.StoreName = MOCKSERVER resp, err := s3Server.ListObjects(ctx, req) assert.Nil(t, err) assert.Equal(t, true, resp.IsTruncated) From 4faca6b30605ced32b3a3f98a4512094ea9387f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 28 Jun 2022 16:51:34 +0800 Subject: [PATCH 055/126] add ut for coverage --- components/file/aws/option.go | 24 +- components/file/aws/option_test.go | 4 +- components/file/aws/oss.go | 28 +- components/file/oss.go | 40 +-- pkg/grpc/extension/s3/s3_test.go | 490 +++++++++++++++++++++++++++++ 5 files changed, 529 insertions(+), 57 deletions(-) diff --git a/components/file/aws/option.go b/components/file/aws/option.go index 8011469507..7869a46acf 100644 --- a/components/file/aws/option.go +++ b/components/file/aws/option.go @@ -17,34 +17,17 @@ package aws import ( - "errors" "time" "github.com/jinzhu/copier" ) -var str = "'" var ( - str2point = copier.TypeConverter{ - SrcType: copier.String, - DstType: &str, - Fn: func(src interface{}) (interface{}, error) { - s, _ := src.(string) - // return nil on empty string - if s == "" { - return nil, nil - } - return &s, nil - }, - } int642time = copier.TypeConverter{ SrcType: int64(0), DstType: &time.Time{}, Fn: func(src interface{}) (interface{}, error) { - s, ok := src.(int64) - if !ok { - return nil, errors.New("src type not matching") - } + s, _ := src.(int64) t := time.Unix(s, 0) return &t, nil }, @@ -53,10 +36,7 @@ var ( SrcType: &time.Time{}, DstType: int64(0), Fn: func(src interface{}) (interface{}, error) { - s, ok := src.(*time.Time) - if !ok { - return nil, errors.New("src type not matching") - } + s, _ := src.(*time.Time) return s.Unix(), nil }, } diff --git a/components/file/aws/option_test.go b/components/file/aws/option_test.go index 60534bc7e3..4ea5f0f766 100644 --- a/components/file/aws/option_test.go +++ b/components/file/aws/option_test.go @@ -36,9 +36,9 @@ func TestCopierOption(t *testing.T) { TestInt64toTime *time.Time } timer := time.Now().Unix() - srcValue := &ValueWithInt64{TestInt64toTime: timer, TestString: ""} + srcValue := &ValueWithInt64{TestInt64toTime: timer} destValue := &ValueWithTimer{} - err := copier.CopyWithOption(destValue, srcValue, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point, int642time}}) + 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()) diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index cac536578f..b9a67ceeac 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -113,7 +113,7 @@ func (a *AwsOss) GetObject(ctx context.Context, req *file.GetObjectInput) (*file if err != nil { return nil, err } - err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) if err != nil { return nil, err } @@ -136,7 +136,7 @@ func (a *AwsOss) PutObject(ctx context.Context, req *file.PutObjectInput) (*file return nil, err } input := &s3.PutObjectInput{} - err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) if err != nil { return nil, err } @@ -176,7 +176,7 @@ func (a *AwsOss) PutObjectTagging(ctx context.Context, req *file.PutObjectTaggin return nil, err } input := &s3.PutObjectTaggingInput{Tagging: &types.Tagging{}} - err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) if err != nil { return nil, err } @@ -193,7 +193,7 @@ func (a *AwsOss) DeleteObjectTagging(ctx context.Context, req *file.DeleteObject return nil, err } input := &s3.DeleteObjectTaggingInput{} - err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) if err != nil { return nil, err } @@ -210,7 +210,7 @@ func (a *AwsOss) GetObjectTagging(ctx context.Context, req *file.GetObjectTaggin return nil, err } input := &s3.GetObjectTaggingInput{} - err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) if err != nil { return nil, err } @@ -259,7 +259,7 @@ func (a *AwsOss) DeleteObjects(ctx context.Context, req *file.DeleteObjectsInput } for _, v := range req.Delete.Objects { object := &types.ObjectIdentifier{} - err = copier.CopyWithOption(object, v, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + err = copier.CopyWithOption(object, v, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) if err != nil { return nil, err } @@ -286,7 +286,7 @@ func (a *AwsOss) ListObjects(ctx context.Context, req *file.ListObjectsInput) (* copier.Option{ IgnoreEmpty: true, DeepCopy: true, - Converters: []copier.TypeConverter{str2point}, + Converters: []copier.TypeConverter{}, }, ) if err != nil { @@ -390,7 +390,7 @@ func (a *AwsOss) UploadPart(ctx context.Context, req *file.UploadPartInput) (*fi return nil, err } input := &s3.UploadPartInput{} - err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) if err != nil { return nil, err } @@ -424,7 +424,7 @@ func (a *AwsOss) UploadPartCopy(ctx context.Context, req *file.UploadPartCopyInp copySource += "?versionId=" + req.CopySource.CopySourceVersionId } input := &s3.UploadPartCopyInput{} - err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) if err != nil { return nil, err } @@ -449,7 +449,7 @@ func (a *AwsOss) CompleteMultipartUpload(ctx context.Context, req *file.Complete copier.Option{ IgnoreEmpty: true, DeepCopy: true, - Converters: []copier.TypeConverter{str2point}, + Converters: []copier.TypeConverter{}, }, ) if err != nil { @@ -469,7 +469,7 @@ func (a *AwsOss) AbortMultipartUpload(ctx context.Context, req *file.AbortMultip return nil, err } input := &s3.AbortMultipartUploadInput{} - err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) if err != nil { return nil, err } @@ -489,7 +489,7 @@ func (a *AwsOss) ListMultipartUploads(ctx context.Context, req *file.ListMultipa } input := &s3.ListMultipartUploadsInput{} - err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) if err != nil { return nil, err } @@ -525,7 +525,7 @@ func (a *AwsOss) ListObjectVersions(ctx context.Context, req *file.ListObjectVer return nil, err } input := &s3.ListObjectVersionsInput{} - err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) if err != nil { return nil, err } @@ -573,7 +573,7 @@ func (a *AwsOss) HeadObject(ctx context.Context, req *file.HeadObjectInput) (*fi return nil, err } input := &s3.HeadObjectInput{} - err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{str2point}}) + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) if err != nil { return nil, err } diff --git a/components/file/oss.go b/components/file/oss.go index 8edb27d3dc..6139689abd 100644 --- a/components/file/oss.go +++ b/components/file/oss.go @@ -260,27 +260,30 @@ type Owner struct { } type GetObjectCannedAclInput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` + VersionId string `json:"version_id,omitempty"` } type GetObjectCannedAclOutput struct { - CannedAcl string `protobuf:"bytes,1,opt,name=canned_acl,json=cannedAcl,proto3" json:"canned_acl,omitempty"` - Owner *Owner `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,omitempty"` - RequestCharged string `protobuf:"bytes,3,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + CannedAcl string `json:"canned_acl,omitempty"` + Owner *Owner `json:"owner,omitempty"` + RequestCharged string `json:"request_charged,omitempty"` } type PutObjectCannedAclInput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - Acl string `protobuf:"bytes,3,opt,name=acl,proto3" json:"acl,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` + Acl string `json:"acl,omitempty"` + VersionId string `json:"version_id,omitempty"` } type PutObjectCannedAclOutput struct { RequestCharged string `protobuf:"bytes,1,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` } type RestoreObjectInput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` + VersionId string `json:"version_id,omitempty"` } type RestoreObjectOutput struct { RequestCharged string `protobuf:"bytes,1,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` @@ -359,14 +362,13 @@ type UploadPartOutput struct { } type UploadPartCopyInput struct { - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - CopySource *CopySource `protobuf:"bytes,4,opt,name=copy_source,json=copySource,proto3" json:"copy_source,omitempty"` - PartNumber int32 `protobuf:"varint,5,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` - UploadId string `protobuf:"bytes,6,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` - StartPosition int64 `protobuf:"varint,7,opt,name=start_position,json=startPosition,proto3" json:"start_position,omitempty"` - PartSize int64 `protobuf:"varint,8,opt,name=part_size,json=partSize,proto3" json:"part_size,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` + CopySource *CopySource `json:"copy_source,omitempty"` + PartNumber int32 `json:"part_number,omitempty"` + UploadId string `json:"upload_id,omitempty"` + StartPosition int64 `json:"start_position,omitempty"` + PartSize int64 `json:"part_size,omitempty"` } type UploadPartCopyOutput struct { BucketKeyEnabled bool `protobuf:"varint,1,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` @@ -521,7 +523,7 @@ type HeadObjectInput struct { } type HeadObjectOutput struct { // Metadata pertaining to the operation's result. - ResultMetadata map[string]string `json:"ResultMetadata,omitempty"` + ResultMetadata map[string]string `json:"result_metadata,omitempty"` } type IsObjectExistInput struct { diff --git a/pkg/grpc/extension/s3/s3_test.go b/pkg/grpc/extension/s3/s3_test.go index 62471452d7..cf9f627c6e 100644 --- a/pkg/grpc/extension/s3/s3_test.go +++ b/pkg/grpc/extension/s3/s3_test.go @@ -283,3 +283,493 @@ func TestListObjects(t *testing.T) { assert.Equal(t, true, resp.IsTruncated) assert.Equal(t, "delimiter", resp.Delimiter) } + +//TestGetObjectCannedAcl +func TestGetObjectCannedAcl(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss[MOCKSERVER] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + ctx := context.TODO() + req := &s3.GetObjectCannedAclInput{ + StoreName: "NoStore", + Bucket: "layotto", + Key: "key", + VersionId: "versionId", + } + _, err := s3Server.GetObjectCannedAcl(ctx, req) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + output := &l8s3.GetObjectCannedAclOutput{CannedAcl: "public-read-write", RequestCharged: "yes"} + mockossServer.EXPECT().GetObjectCannedAcl(ctx, + &l8s3.GetObjectCannedAclInput{ + Bucket: "layotto", + Key: "key", + VersionId: "versionId", + }, + ).Return(output, nil) + req.StoreName = MOCKSERVER + resp, err := s3Server.GetObjectCannedAcl(ctx, req) + assert.Nil(t, err) + assert.Equal(t, "public-read-write", resp.CannedAcl) + assert.Equal(t, "yes", resp.RequestCharged) +} + +//TestPutObjectCannedAcl +func TestPutObjectCannedAcl(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss[MOCKSERVER] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + ctx := context.TODO() + req := &s3.PutObjectCannedAclInput{ + StoreName: "NoStore", + Bucket: "layotto", + Key: "key", + VersionId: "versionId", + } + _, err := s3Server.PutObjectCannedAcl(ctx, req) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + output := &l8s3.PutObjectCannedAclOutput{RequestCharged: "yes"} + mockossServer.EXPECT().PutObjectCannedAcl(ctx, + &l8s3.PutObjectCannedAclInput{ + Bucket: "layotto", + Key: "key", + VersionId: "versionId", + }, + ).Return(output, nil) + req.StoreName = MOCKSERVER + resp, err := s3Server.PutObjectCannedAcl(ctx, req) + assert.Nil(t, err) + assert.Equal(t, "yes", resp.RequestCharged) +} + +//TestRestoreObject +func TestRestoreObject(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss[MOCKSERVER] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + ctx := context.TODO() + req := &s3.RestoreObjectInput{ + StoreName: "NoStore", + Bucket: "layotto", + Key: "key", + VersionId: "versionId", + } + _, err := s3Server.RestoreObject(ctx, req) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + output := &l8s3.RestoreObjectOutput{RestoreOutputPath: "yes", RequestCharged: "yes"} + mockossServer.EXPECT().RestoreObject(ctx, + &l8s3.RestoreObjectInput{ + Bucket: "layotto", + Key: "key", + VersionId: "versionId", + }, + ).Return(output, nil) + req.StoreName = MOCKSERVER + resp, err := s3Server.RestoreObject(ctx, req) + assert.Nil(t, err) + assert.Equal(t, "yes", resp.RequestCharged) + assert.Equal(t, "yes", resp.RestoreOutputPath) +} + +//TestCreateMultipartUpload +func TestCreateMultipartUpload(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss[MOCKSERVER] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + ctx := context.TODO() + req := &s3.CreateMultipartUploadInput{ + StoreName: "NoStore", + Bucket: "layotto", + Key: "key", + } + _, err := s3Server.CreateMultipartUpload(ctx, req) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + output := &l8s3.CreateMultipartUploadOutput{Bucket: "layotto", Key: "object", UploadId: "123"} + mockossServer.EXPECT().CreateMultipartUpload(ctx, + &l8s3.CreateMultipartUploadInput{ + Bucket: "layotto", + Key: "key", + }, + ).Return(output, nil) + req.StoreName = MOCKSERVER + resp, err := s3Server.CreateMultipartUpload(ctx, req) + assert.Nil(t, err) + assert.Equal(t, "123", resp.UploadId) + assert.Equal(t, "layotto", resp.Bucket) + assert.Equal(t, "object", resp.Key) +} + +//TestUploadPartCopy +func TestUploadPartCopy(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss[MOCKSERVER] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + ctx := context.TODO() + req := &s3.UploadPartCopyInput{ + StoreName: "NoStore", + Bucket: "layotto", + Key: "key", + } + _, err := s3Server.UploadPartCopy(ctx, req) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + output := &l8s3.UploadPartCopyOutput{BucketKeyEnabled: true, CopyPartResult: &l8s3.CopyPartResult{ETag: "123", LastModified: 456}} + mockossServer.EXPECT().UploadPartCopy(ctx, + &l8s3.UploadPartCopyInput{ + Bucket: "layotto", + Key: "key", + }, + ).Return(output, nil) + req.StoreName = MOCKSERVER + resp, err := s3Server.UploadPartCopy(ctx, req) + assert.Nil(t, err) + assert.Equal(t, "123", resp.CopyPartResult.Etag) + assert.Equal(t, int64(456), resp.CopyPartResult.LastModified) + assert.Equal(t, true, resp.BucketKeyEnabled) +} + +//TestCompleteMultipartUpload +func TestCompleteMultipartUpload(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss[MOCKSERVER] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + ctx := context.TODO() + req := &s3.CompleteMultipartUploadInput{ + StoreName: "NoStore", + Bucket: "layotto", + Key: "key", + UploadId: "123", + } + _, err := s3Server.CompleteMultipartUpload(ctx, req) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + output := &l8s3.CompleteMultipartUploadOutput{ + BucketKeyEnabled: true, + Expiration: "expiration", + ETag: "etag", + } + mockossServer.EXPECT().CompleteMultipartUpload(ctx, + &l8s3.CompleteMultipartUploadInput{ + Bucket: "layotto", + Key: "key", + UploadId: "123", + }, + ).Return(output, nil) + req.StoreName = MOCKSERVER + resp, err := s3Server.CompleteMultipartUpload(ctx, req) + assert.Nil(t, err) + assert.Equal(t, "expiration", resp.Expiration) + assert.Equal(t, "etag", resp.Etag) + assert.Equal(t, true, resp.BucketKeyEnabled) +} + +//TestAbortMultipartUpload +func TestAbortMultipartUpload(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss[MOCKSERVER] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + ctx := context.TODO() + req := &s3.AbortMultipartUploadInput{ + StoreName: "NoStore", + Bucket: "layotto", + Key: "key", + UploadId: "123", + } + _, err := s3Server.AbortMultipartUpload(ctx, req) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + output := &l8s3.AbortMultipartUploadOutput{ + RequestCharged: "true", + } + mockossServer.EXPECT().AbortMultipartUpload(ctx, + &l8s3.AbortMultipartUploadInput{ + Bucket: "layotto", + Key: "key", + UploadId: "123", + }, + ).Return(output, nil) + req.StoreName = MOCKSERVER + resp, err := s3Server.AbortMultipartUpload(ctx, req) + assert.Nil(t, err) + assert.Equal(t, "true", resp.RequestCharged) +} + +//TestListMultipartUploads +func TestListMultipartUploads(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss[MOCKSERVER] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + ctx := context.TODO() + req := &s3.ListMultipartUploadsInput{ + StoreName: "NoStore", + Bucket: "layotto", + } + _, err := s3Server.ListMultipartUploads(ctx, req) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + output := &l8s3.ListMultipartUploadsOutput{ + Bucket: "layotto", + } + mockossServer.EXPECT().ListMultipartUploads(ctx, + &l8s3.ListMultipartUploadsInput{ + Bucket: "layotto", + }, + ).Return(output, nil) + req.StoreName = MOCKSERVER + resp, err := s3Server.ListMultipartUploads(ctx, req) + assert.Nil(t, err) + assert.Equal(t, "layotto", resp.Bucket) +} + +//TestListObjectVersions +func TestListObjectVersions(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss[MOCKSERVER] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + ctx := context.TODO() + req := &s3.ListObjectVersionsInput{ + StoreName: "NoStore", + Bucket: "layotto", + KeyMarker: "marker", + } + _, err := s3Server.ListObjectVersions(ctx, req) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + output := &l8s3.ListObjectVersionsOutput{ + Delimiter: "layotto", + } + mockossServer.EXPECT().ListObjectVersions(ctx, + &l8s3.ListObjectVersionsInput{ + Bucket: "layotto", + KeyMarker: "marker", + }, + ).Return(output, nil) + req.StoreName = MOCKSERVER + resp, err := s3Server.ListObjectVersions(ctx, req) + assert.Nil(t, err) + assert.Equal(t, "layotto", resp.Delimiter) +} + +//TestHeadObject +func TestHeadObject(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss[MOCKSERVER] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + ctx := context.TODO() + req := &s3.HeadObjectInput{ + StoreName: "NoStore", + Bucket: "layotto", + Key: "object", + } + _, err := s3Server.HeadObject(ctx, req) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + output := &l8s3.HeadObjectOutput{ + ResultMetadata: map[string]string{"key": "value"}, + } + mockossServer.EXPECT().HeadObject(ctx, + &l8s3.HeadObjectInput{ + Bucket: "layotto", + Key: "object", + }, + ).Return(output, nil) + req.StoreName = MOCKSERVER + resp, err := s3Server.HeadObject(ctx, req) + assert.Nil(t, err) + assert.Equal(t, map[string]string{"key": "value"}, resp.ResultMetadata) +} + +//TestIsObjectExist +func TestIsObjectExist(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss[MOCKSERVER] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + ctx := context.TODO() + req := &s3.IsObjectExistInput{ + StoreName: "NoStore", + Bucket: "layotto", + Key: "object", + } + _, err := s3Server.IsObjectExist(ctx, req) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + output := &l8s3.IsObjectExistOutput{ + FileExist: true, + } + mockossServer.EXPECT().IsObjectExist(ctx, + &l8s3.IsObjectExistInput{ + Bucket: "layotto", + Key: "object", + }, + ).Return(output, nil) + req.StoreName = MOCKSERVER + resp, err := s3Server.IsObjectExist(ctx, req) + assert.Nil(t, err) + assert.Equal(t, true, resp.FileExist) +} + +//TestSignURL +func TestSignURL(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss[MOCKSERVER] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + ctx := context.TODO() + req := &s3.SignURLInput{ + StoreName: "NoStore", + Bucket: "layotto", + Key: "object", + } + _, err := s3Server.SignURL(ctx, req) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + output := &l8s3.SignURLOutput{ + SignedUrl: "http://object", + } + mockossServer.EXPECT().SignURL(ctx, + &l8s3.SignURLInput{ + Bucket: "layotto", + Key: "object", + }, + ).Return(output, nil) + req.StoreName = MOCKSERVER + resp, err := s3Server.SignURL(ctx, req) + assert.Nil(t, err) + assert.Equal(t, "http://object", resp.SignedUrl) +} + +//TestUpdateDownLoadBandwidthRateLimit +func TestUpdateDownLoadBandwidthRateLimit(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss[MOCKSERVER] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + ctx := context.TODO() + req := &s3.UpdateBandwidthRateLimitInput{ + StoreName: "NoStore", + AverageRateLimitInBitsPerSec: 1, + } + _, err := s3Server.UpdateDownLoadBandwidthRateLimit(ctx, req) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + mockossServer.EXPECT().UpdateDownLoadBandwidthRateLimit(ctx, + &l8s3.UpdateBandwidthRateLimitInput{ + AverageRateLimitInBitsPerSec: 1, + }, + ).Return(nil) + req.StoreName = MOCKSERVER + _, err = s3Server.UpdateDownLoadBandwidthRateLimit(ctx, req) + assert.Nil(t, err) +} + +//TestUpdateUpLoadBandwidthRateLimit +func TestUpdateUpLoadBandwidthRateLimit(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss[MOCKSERVER] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + ctx := context.TODO() + req := &s3.UpdateBandwidthRateLimitInput{ + StoreName: "NoStore", + AverageRateLimitInBitsPerSec: 1, + } + _, err := s3Server.UpdateUpLoadBandwidthRateLimit(ctx, req) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + mockossServer.EXPECT().UpdateUpLoadBandwidthRateLimit(ctx, + &l8s3.UpdateBandwidthRateLimitInput{ + AverageRateLimitInBitsPerSec: 1, + }, + ).Return(nil) + req.StoreName = MOCKSERVER + _, err = s3Server.UpdateUpLoadBandwidthRateLimit(ctx, req) + assert.Nil(t, err) +} + +//TestListParts +func TestListParts(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss[MOCKSERVER] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + ctx := context.TODO() + req := &s3.ListPartsInput{ + StoreName: "NoStore", + Bucket: "layotto", + } + _, err := s3Server.ListParts(ctx, req) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + output := &l8s3.ListPartsOutput{ + Bucket: "layotto", + Key: "object", + } + mockossServer.EXPECT().ListParts(ctx, + &l8s3.ListPartsInput{ + Bucket: "layotto", + }, + ).Return(output, nil) + req.StoreName = MOCKSERVER + resp, err := s3Server.ListParts(ctx, req) + assert.Nil(t, err) + assert.Equal(t, "layotto", resp.Bucket) +} From 98e41fd9140ddd6fc56a369fcf17250645000f81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 28 Jun 2022 17:30:25 +0800 Subject: [PATCH 056/126] add PutObject ut --- pkg/grpc/extension/s3/s3_test.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/pkg/grpc/extension/s3/s3_test.go b/pkg/grpc/extension/s3/s3_test.go index cf9f627c6e..0d4cb0d0e2 100644 --- a/pkg/grpc/extension/s3/s3_test.go +++ b/pkg/grpc/extension/s3/s3_test.go @@ -107,6 +107,34 @@ func TestGetObject(t *testing.T) { assert.Nil(t, err) } +// TestPutObject +func TestPutObject(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss[MOCKSERVER] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + // Test GetObject function + ctx := context.TODO() + mockServer := mocks3.NewMockObjectStorageService_PutObjectServer(ctrl) + putObjectReq := &s3.PutObjectInput{StoreName: "NoStore", Bucket: "layotto", Key: "object", Body: []byte("put")} + mockServer.EXPECT().Recv().Return(putObjectReq, nil) + err := s3Server.PutObject(mockServer) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + + putObjectReq.StoreName = MOCKSERVER + output := &file.PutObjectOutput{ETag: "tag"} + mockServer.EXPECT().Context().Return(ctx) + mockServer.EXPECT().Recv().Return(putObjectReq, nil) + mockServer.EXPECT().SendAndClose(&s3.PutObjectOutput{Etag: "tag"}).Times(1) + mockossServer.EXPECT().PutObject(ctx, &l8s3.PutObjectInput{DataStream: newPutObjectStreamReader(putObjectReq.Body, mockServer), Bucket: "layotto", Key: "object"}).Return(output, nil) + err = s3Server.PutObject(mockServer) + assert.Nil(t, err) +} + // TestDeleteObject func TestDeleteObject(t *testing.T) { // prepare oss server From bf07ae0fb6f69315ccc85bda88a4234e60775263 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 28 Jun 2022 17:52:32 +0800 Subject: [PATCH 057/126] add ut for append and uploadpart --- pkg/grpc/extension/s3/s3_test.go | 56 ++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/pkg/grpc/extension/s3/s3_test.go b/pkg/grpc/extension/s3/s3_test.go index 0d4cb0d0e2..8a9f990e09 100644 --- a/pkg/grpc/extension/s3/s3_test.go +++ b/pkg/grpc/extension/s3/s3_test.go @@ -135,6 +135,62 @@ func TestPutObject(t *testing.T) { assert.Nil(t, err) } +// TestUploadPart +func TestUploadPart(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss[MOCKSERVER] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + // Test GetObject function + ctx := context.TODO() + mockStream := mocks3.NewMockObjectStorageService_UploadPartServer(ctrl) + UploadPartReq := &s3.UploadPartInput{StoreName: "NoStore", Bucket: "layotto", Key: "object", Body: []byte("put")} + mockStream.EXPECT().Recv().Return(UploadPartReq, nil) + err := s3Server.UploadPart(mockStream) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + + UploadPartReq.StoreName = MOCKSERVER + output := &file.UploadPartOutput{ETag: "tag"} + mockStream.EXPECT().Context().Return(ctx) + mockStream.EXPECT().Recv().Return(UploadPartReq, nil) + mockStream.EXPECT().SendAndClose(&s3.UploadPartOutput{Etag: "tag"}).Times(1) + mockossServer.EXPECT().UploadPart(ctx, &l8s3.UploadPartInput{DataStream: newUploadPartStreamReader(UploadPartReq.Body, mockStream), Bucket: "layotto", Key: "object"}).Return(output, nil) + err = s3Server.UploadPart(mockStream) + assert.Nil(t, err) +} + +// TestAppendObject +func TestAppendObject(t *testing.T) { + // prepare oss server + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ctrl := gomock.NewController(t) + mockossServer := mockoss.NewMockOss(ctrl) + ac.Oss[MOCKSERVER] = mockossServer + NewS3Server(ac) + s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + + // Test GetObject function + ctx := context.TODO() + mockStream := mocks3.NewMockObjectStorageService_AppendObjectServer(ctrl) + req := &s3.AppendObjectInput{StoreName: "NoStore", Bucket: "layotto", Key: "object", Body: []byte("put")} + mockStream.EXPECT().Recv().Return(req, nil) + err := s3Server.AppendObject(mockStream) + assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) + + req.StoreName = MOCKSERVER + output := &file.AppendObjectOutput{AppendPosition: 123} + mockStream.EXPECT().Context().Return(ctx) + mockStream.EXPECT().Recv().Return(req, nil) + mockStream.EXPECT().SendAndClose(&s3.AppendObjectOutput{AppendPosition: 123}).Times(1) + mockossServer.EXPECT().AppendObject(ctx, &l8s3.AppendObjectInput{DataStream: newAppendObjectStreamReader(req.Body, mockStream), Bucket: "layotto", Key: "object"}).Return(output, nil) + err = s3Server.AppendObject(mockStream) + assert.Nil(t, err) +} + // TestDeleteObject func TestDeleteObject(t *testing.T) { // prepare oss server From afa97d522e3f0bb758f99d1ccc313ad674bffd8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 28 Jun 2022 20:22:12 +0800 Subject: [PATCH 058/126] add ut test coverage --- pkg/grpc/extension/s3/s3_test.go | 38 +++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/pkg/grpc/extension/s3/s3_test.go b/pkg/grpc/extension/s3/s3_test.go index 8a9f990e09..60505d046c 100644 --- a/pkg/grpc/extension/s3/s3_test.go +++ b/pkg/grpc/extension/s3/s3_test.go @@ -19,6 +19,7 @@ package s3 import ( "context" "errors" + "io" "testing" mockoss "mosn.io/layotto/pkg/mock/components/oss" @@ -119,20 +120,27 @@ func TestPutObject(t *testing.T) { // Test GetObject function ctx := context.TODO() - mockServer := mocks3.NewMockObjectStorageService_PutObjectServer(ctrl) + mockStream := mocks3.NewMockObjectStorageService_PutObjectServer(ctrl) putObjectReq := &s3.PutObjectInput{StoreName: "NoStore", Bucket: "layotto", Key: "object", Body: []byte("put")} - mockServer.EXPECT().Recv().Return(putObjectReq, nil) - err := s3Server.PutObject(mockServer) + mockStream.EXPECT().Recv().Return(putObjectReq, nil) + err := s3Server.PutObject(mockStream) assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) putObjectReq.StoreName = MOCKSERVER output := &file.PutObjectOutput{ETag: "tag"} - mockServer.EXPECT().Context().Return(ctx) - mockServer.EXPECT().Recv().Return(putObjectReq, nil) - mockServer.EXPECT().SendAndClose(&s3.PutObjectOutput{Etag: "tag"}).Times(1) - mockossServer.EXPECT().PutObject(ctx, &l8s3.PutObjectInput{DataStream: newPutObjectStreamReader(putObjectReq.Body, mockServer), Bucket: "layotto", Key: "object"}).Return(output, nil) - err = s3Server.PutObject(mockServer) + mockStream.EXPECT().Context().Return(ctx) + mockStream.EXPECT().Recv().Return(putObjectReq, nil) + mockStream.EXPECT().SendAndClose(&s3.PutObjectOutput{Etag: "tag"}).Times(1) + mockossServer.EXPECT().PutObject(ctx, &l8s3.PutObjectInput{DataStream: newPutObjectStreamReader(putObjectReq.Body, mockStream), Bucket: "layotto", Key: "object"}).Return(output, nil) + err = s3Server.PutObject(mockStream) assert.Nil(t, err) + + mockStream.EXPECT().Recv().Return(nil, io.EOF) + stream := newPutObjectStreamReader(putObjectReq.Body, mockStream) + data := make([]byte, 5, 5) + n, err := stream.Read(data) + assert.Equal(t, 3, n) + assert.Equal(t, io.EOF, err) } // TestUploadPart @@ -161,6 +169,13 @@ func TestUploadPart(t *testing.T) { mockossServer.EXPECT().UploadPart(ctx, &l8s3.UploadPartInput{DataStream: newUploadPartStreamReader(UploadPartReq.Body, mockStream), Bucket: "layotto", Key: "object"}).Return(output, nil) err = s3Server.UploadPart(mockStream) assert.Nil(t, err) + + mockStream.EXPECT().Recv().Return(nil, io.EOF) + stream := newUploadPartStreamReader(UploadPartReq.Body, mockStream) + data := make([]byte, 5, 5) + n, err := stream.Read(data) + assert.Equal(t, 3, n) + assert.Equal(t, io.EOF, err) } // TestAppendObject @@ -189,6 +204,13 @@ func TestAppendObject(t *testing.T) { mockossServer.EXPECT().AppendObject(ctx, &l8s3.AppendObjectInput{DataStream: newAppendObjectStreamReader(req.Body, mockStream), Bucket: "layotto", Key: "object"}).Return(output, nil) err = s3Server.AppendObject(mockStream) assert.Nil(t, err) + + mockStream.EXPECT().Recv().Return(nil, io.EOF) + stream := newAppendObjectStreamReader(req.Body, mockStream) + data := make([]byte, 5, 5) + n, err := stream.Read(data) + assert.Equal(t, 3, n) + assert.Equal(t, io.EOF, err) } // TestDeleteObject From 780fa901867222a42f2811d1633632a2b27e5252 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 28 Jun 2022 21:31:20 +0800 Subject: [PATCH 059/126] add ut coverage --- components/file/aliyun/oss_test.go | 88 +++++++++++++++ components/file/aws/oss.go | 24 ++-- components/file/aws/oss_test.go | 173 +++++++++++++++++++++++++++++ components/file/oss.go | 2 +- 4 files changed, 276 insertions(+), 11 deletions(-) create mode 100644 components/file/aws/oss_test.go diff --git a/components/file/aliyun/oss_test.go b/components/file/aliyun/oss_test.go index 3d30dac56e..b0e2f19c5a 100644 --- a/components/file/aliyun/oss_test.go +++ b/components/file/aliyun/oss_test.go @@ -17,8 +17,11 @@ package aliyun import ( + "context" "testing" + "mosn.io/pkg/buffer" + "mosn.io/layotto/components/file" "github.com/stretchr/testify/assert" @@ -96,3 +99,88 @@ func TestInitAliyunOss(t *testing.T) { assert.NotNil(t, client) } + +func TestAliyunOss(t *testing.T) { + instance := NewAliyunOss() + err := instance.InitConfig(context.TODO(), &file.FileConfig{Method: "", Metadata: []byte(confWithoutUidAndBucket)}) + assert.Nil(t, err) + err = instance.InitClient(context.TODO(), &file.InitRequest{}) + assert.Nil(t, err) + + appendObjectResp, err := instance.AppendObject(context.TODO(), &file.AppendObjectInput{}) + assert.NotNil(t, err) + assert.Nil(t, appendObjectResp) + + _, err = instance.AbortMultipartUpload(context.TODO(), &file.AbortMultipartUploadInput{}) + assert.NotNil(t, err) + + _, err = instance.CompleteMultipartUpload(context.TODO(), &file.CompleteMultipartUploadInput{}) + assert.NotNil(t, err) + + _, err = instance.CopyObject(context.TODO(), &file.CopyObjectInput{}) + assert.NotNil(t, err) + + _, err = instance.CreateMultipartUpload(context.TODO(), &file.CreateMultipartUploadInput{}) + assert.NotNil(t, err) + + _, err = instance.DeleteObject(context.TODO(), &file.DeleteObjectInput{}) + assert.NotNil(t, err) + _, err = instance.DeleteObjects(context.TODO(), &file.DeleteObjectsInput{ + Delete: &file.Delete{}, + }) + assert.NotNil(t, err) + _, err = instance.DeleteObjectTagging(context.TODO(), &file.DeleteObjectTaggingInput{}) + assert.NotNil(t, err) + + _, err = instance.GetObject(context.TODO(), &file.GetObjectInput{}) + assert.NotNil(t, err) + _, err = instance.GetObjectCannedAcl(context.TODO(), &file.GetObjectCannedAclInput{}) + assert.NotNil(t, err) + _, err = instance.GetObjectTagging(context.TODO(), &file.GetObjectTaggingInput{}) + assert.NotNil(t, err) + + _, err = instance.HeadObject(context.TODO(), &file.HeadObjectInput{}) + assert.NotNil(t, err) + + _, err = instance.IsObjectExist(context.TODO(), &file.IsObjectExistInput{}) + assert.NotNil(t, err) + + _, err = instance.ListParts(context.TODO(), &file.ListPartsInput{}) + assert.NotNil(t, err) + + _, err = instance.ListMultipartUploads(context.TODO(), &file.ListMultipartUploadsInput{}) + assert.NotNil(t, err) + _, err = instance.ListObjects(context.TODO(), &file.ListObjectsInput{}) + assert.NotNil(t, err) + _, err = instance.ListObjectVersions(context.TODO(), &file.ListObjectVersionsInput{}) + assert.NotNil(t, err) + + stream := buffer.NewIoBufferString("hello") + _, err = instance.PutObject(context.TODO(), &file.PutObjectInput{DataStream: stream}) + assert.NotNil(t, err) + _, err = instance.PutObjectCannedAcl(context.TODO(), &file.PutObjectCannedAclInput{}) + assert.NotNil(t, err) + _, err = instance.PutObjectTagging(context.TODO(), &file.PutObjectTaggingInput{}) + assert.NotNil(t, err) + + _, err = instance.RestoreObject(context.TODO(), &file.RestoreObjectInput{}) + assert.NotNil(t, err) + + _, err = instance.SignURL(context.TODO(), &file.SignURLInput{}) + assert.NotNil(t, err) + + _, err = instance.UploadPartCopy(context.TODO(), &file.UploadPartCopyInput{ + CopySource: &file.CopySource{CopySourceBucket: "bucket", CopySourceKey: "key"}, + }) + assert.NotNil(t, err) + + _, err = instance.UploadPart(context.TODO(), &file.UploadPartInput{}) + assert.NotNil(t, err) + + err = instance.UpdateDownLoadBandwidthRateLimit(context.TODO(), &file.UpdateBandwidthRateLimitInput{}) + assert.Nil(t, err) + + err = instance.UpdateUpLoadBandwidthRateLimit(context.TODO(), &file.UpdateBandwidthRateLimitInput{}) + assert.Nil(t, err) + +} diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index b9a67ceeac..7ac4cb59a5 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -50,7 +50,7 @@ func AwsDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string) ( err := json.Unmarshal(staticConf, &m) clients := make(map[string]interface{}) if err != nil { - return nil, errors.New("invalid config for aws oss") + return nil, file.ErrInvalid } for _, data := range m { optFunc := []func(options *aws_config.LoadOptions) error{ @@ -85,7 +85,6 @@ func NewAwsOss() file.Oss { meta: make(map[string]*file.OssMetadata), } } - func (a *AwsOss) InitConfig(ctx context.Context, config *file.FileConfig) error { a.method = config.Method a.rawData = config.Metadata @@ -232,6 +231,9 @@ func (a *AwsOss) CopyObject(ctx context.Context, req *file.CopyObjectInput) (*fi return nil, err } + if req.CopySource == nil { + return nil, errors.New("must specific copy_source") + } //TODO: should support objects accessed through access points copySource := req.CopySource.CopySourceBucket + "/" + req.CopySource.CopySourceKey if req.CopySource.CopySourceVersionId != "" { @@ -257,13 +259,15 @@ func (a *AwsOss) DeleteObjects(ctx context.Context, req *file.DeleteObjectsInput Bucket: &req.Bucket, Delete: &types.Delete{}, } - 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 + 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) } - input.Delete.Objects = append(input.Delete.Objects, *object) } resp, err := client.DeleteObjects(ctx, input) if err != nil { @@ -628,11 +632,11 @@ func (a *AwsOss) SignURL(ctx context.Context, req *file.SignURLInput) (*file.Sig } func (a *AwsOss) UpdateDownLoadBandwidthRateLimit(ctx context.Context, req *file.UpdateBandwidthRateLimitInput) error { - return nil + return errors.New("UpdateDownLoadBandwidthRateLimit method not supported now") } func (a *AwsOss) UpdateUpLoadBandwidthRateLimit(ctx context.Context, req *file.UpdateBandwidthRateLimitInput) error { - return nil + return errors.New("UpdateUpLoadBandwidthRateLimit method not supported now") } func (a *AwsOss) AppendObject(ctx context.Context, req *file.AppendObjectInput) (*file.AppendObjectOutput, error) { return nil, errors.New("AppendObject method not supported on AWS") diff --git a/components/file/aws/oss_test.go b/components/file/aws/oss_test.go new file mode 100644 index 0000000000..2fa22aacab --- /dev/null +++ b/components/file/aws/oss_test.go @@ -0,0 +1,173 @@ +package aws + +import ( + "context" + "errors" + "testing" + + "mosn.io/pkg/buffer" + + "mosn.io/layotto/components/file" + "mosn.io/layotto/components/file/factory" + + "github.com/stretchr/testify/assert" +) + +const ( + confWithoutUidAndBucket = `[ + { + "endpoint": "endpoint_address", + "accessKeyID": "accessKey", + "accessKeySecret": "secret" + } + ]` + confWithUid = `[ + { + "uid": "123", + "endpoint": "endpoint_address", + "accessKeyID": "accessKey", + "accessKeySecret": "secret" + } + ]` + confWithUidAndBucket = `[ + { + "uid": "123", + "buckets": ["bucket1","bucket2"], + "endpoint": "endpoint_address", + "accessKeyID": "accessKey", + "accessKeySecret": "secret" + } + ]` +) + +func TestAwsDefaultInitFunc(t *testing.T) { + NewAwsOss() + f := factory.GetInitFunc(DefaultClientInitFunc) + clients, err := f([]byte("hello"), map[string]string{}) + assert.Equal(t, err, file.ErrInvalid) + assert.Nil(t, clients) + clients, err = f([]byte(confWithoutUidAndBucket), map[string]string{}) + assert.NotEqual(t, file.ErrInvalid, err) + assert.NotNil(t, clients) + client, ok := clients[""] + assert.Equal(t, true, ok) + assert.NotNil(t, client) + + clients, err = f([]byte(confWithUid), map[string]string{}) + assert.NotEqual(t, file.ErrInvalid, err) + assert.NotNil(t, clients) + client, ok = clients[""] + assert.Equal(t, false, ok) + assert.Nil(t, client) + client, ok = clients["123"] + assert.Equal(t, true, ok) + assert.NotNil(t, client) + + clients, err = f([]byte(confWithUidAndBucket), map[string]string{}) + assert.NotEqual(t, file.ErrInvalid, err) + assert.NotNil(t, clients) + client, ok = clients[""] + assert.Equal(t, false, ok) + assert.Nil(t, client) + + client, ok = clients["123"] + assert.Equal(t, true, ok) + assert.NotNil(t, client) + + client, ok = clients["bucket1"] + assert.Equal(t, true, ok) + assert.NotNil(t, client) + + client, ok = clients["bucket2"] + assert.Equal(t, true, ok) + assert.NotNil(t, client) +} + +func TestAwsOss(t *testing.T) { + instance := NewAwsOss() + err := instance.InitConfig(context.TODO(), &file.FileConfig{Method: "", Metadata: []byte(confWithoutUidAndBucket)}) + assert.Nil(t, err) + err = instance.InitClient(context.TODO(), &file.InitRequest{}) + assert.Nil(t, err) + + appendObjectResp, err := instance.AppendObject(context.TODO(), &file.AppendObjectInput{}) + assert.Equal(t, errors.New("AppendObject method not supported on AWS"), err) + assert.Nil(t, appendObjectResp) + + _, err = instance.AbortMultipartUpload(context.TODO(), &file.AbortMultipartUploadInput{}) + assert.NotNil(t, err) + + _, err = instance.CompleteMultipartUpload(context.TODO(), &file.CompleteMultipartUploadInput{}) + assert.NotNil(t, err) + + _, err = instance.CopyObject(context.TODO(), &file.CopyObjectInput{}) + assert.Equal(t, errors.New("must specific copy_source"), err) + + _, err = instance.CopyObject(context.TODO(), &file.CopyObjectInput{ + CopySource: &file.CopySource{CopySourceBucket: "bucket", CopySourceKey: "key"}, + }) + assert.NotEqual(t, errors.New("must specific copy_source"), err) + _, err = instance.CreateMultipartUpload(context.TODO(), &file.CreateMultipartUploadInput{}) + assert.NotNil(t, err) + + _, err = instance.DeleteObject(context.TODO(), &file.DeleteObjectInput{}) + assert.NotNil(t, err) + _, err = instance.DeleteObjects(context.TODO(), &file.DeleteObjectsInput{ + Delete: &file.Delete{}, + }) + assert.NotNil(t, err) + _, err = instance.DeleteObjectTagging(context.TODO(), &file.DeleteObjectTaggingInput{}) + assert.NotNil(t, err) + + _, err = instance.GetObject(context.TODO(), &file.GetObjectInput{}) + assert.NotNil(t, err) + _, err = instance.GetObjectCannedAcl(context.TODO(), &file.GetObjectCannedAclInput{}) + assert.NotNil(t, err) + _, err = instance.GetObjectTagging(context.TODO(), &file.GetObjectTaggingInput{}) + assert.NotNil(t, err) + + _, err = instance.HeadObject(context.TODO(), &file.HeadObjectInput{}) + assert.NotNil(t, err) + + _, err = instance.IsObjectExist(context.TODO(), &file.IsObjectExistInput{}) + assert.NotNil(t, err) + + _, err = instance.ListParts(context.TODO(), &file.ListPartsInput{}) + assert.NotNil(t, err) + + _, err = instance.ListMultipartUploads(context.TODO(), &file.ListMultipartUploadsInput{}) + assert.NotNil(t, err) + _, err = instance.ListObjects(context.TODO(), &file.ListObjectsInput{}) + assert.NotNil(t, err) + _, err = instance.ListObjectVersions(context.TODO(), &file.ListObjectVersionsInput{}) + assert.NotNil(t, err) + + stream := buffer.NewIoBufferString("hello") + _, err = instance.PutObject(context.TODO(), &file.PutObjectInput{DataStream: stream}) + assert.NotNil(t, err) + _, err = instance.PutObjectCannedAcl(context.TODO(), &file.PutObjectCannedAclInput{}) + assert.NotNil(t, err) + _, err = instance.PutObjectTagging(context.TODO(), &file.PutObjectTaggingInput{}) + assert.NotNil(t, err) + + _, err = instance.RestoreObject(context.TODO(), &file.RestoreObjectInput{}) + assert.NotNil(t, err) + + _, err = instance.SignURL(context.TODO(), &file.SignURLInput{}) + assert.NotNil(t, err) + + _, err = instance.UploadPartCopy(context.TODO(), &file.UploadPartCopyInput{ + CopySource: &file.CopySource{CopySourceBucket: "bucket", CopySourceKey: "key"}, + }) + assert.NotNil(t, err) + + _, err = instance.UploadPart(context.TODO(), &file.UploadPartInput{}) + assert.NotNil(t, err) + + err = instance.UpdateDownLoadBandwidthRateLimit(context.TODO(), &file.UpdateBandwidthRateLimitInput{}) + assert.NotNil(t, err) + + err = instance.UpdateUpLoadBandwidthRateLimit(context.TODO(), &file.UpdateBandwidthRateLimitInput{}) + assert.NotNil(t, err) + +} diff --git a/components/file/oss.go b/components/file/oss.go index 6139689abd..f58a8d4975 100644 --- a/components/file/oss.go +++ b/components/file/oss.go @@ -119,7 +119,7 @@ type PutObjectInput struct { BucketKeyEnabled bool `protobuf:"varint,6,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` CacheControl string `protobuf:"bytes,7,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` ContentDisposition string `protobuf:"bytes,8,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` - ContentEncoding string `protobuf:"bytes,9,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` + ContentEncoding string `protobuf:"bytes,9,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempPutObjectInputty"` Expires int64 `protobuf:"varint,10,opt,name=expires,proto3" json:"expires,omitempty"` ServerSideEncryption string `protobuf:"bytes,11,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` SignedUrl string `protobuf:"bytes,12,opt,name=signed_url,json=signedUrl,proto3" json:"signed_url,omitempty"` From 0cabc92c391046ebeafa23d3936f842b9976acb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 29 Jun 2022 10:10:32 +0800 Subject: [PATCH 060/126] add file liscense --- components/file/aws/oss.go | 1 + components/file/aws/oss_test.go | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index 7ac4cb59a5..89a85c0202 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package aws import ( diff --git a/components/file/aws/oss_test.go b/components/file/aws/oss_test.go index 2fa22aacab..77a694578e 100644 --- a/components/file/aws/oss_test.go +++ b/components/file/aws/oss_test.go @@ -1,3 +1,19 @@ +/* +* 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 aws import ( From f032c9ab5d04aa366acf220f4e2ca3b7947aa388 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 29 Jun 2022 10:17:14 +0800 Subject: [PATCH 061/126] fix wrong tag --- components/file/oss.go | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/components/file/oss.go b/components/file/oss.go index f58a8d4975..dab3ff3bf7 100644 --- a/components/file/oss.go +++ b/components/file/oss.go @@ -113,17 +113,17 @@ type GetObjectOutput struct { type PutObjectInput struct { DataStream io.Reader - ACL string `protobuf:"bytes,2,opt,name=acl,proto3" json:"acl,omitempty"` - Bucket string `protobuf:"bytes,4,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,5,opt,name=key,proto3" json:"key,omitempty"` - BucketKeyEnabled bool `protobuf:"varint,6,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - CacheControl string `protobuf:"bytes,7,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` - ContentDisposition string `protobuf:"bytes,8,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` - ContentEncoding string `protobuf:"bytes,9,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempPutObjectInputty"` - Expires int64 `protobuf:"varint,10,opt,name=expires,proto3" json:"expires,omitempty"` - ServerSideEncryption string `protobuf:"bytes,11,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` - SignedUrl string `protobuf:"bytes,12,opt,name=signed_url,json=signedUrl,proto3" json:"signed_url,omitempty"` - 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"` + ACL string `json:"acl,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` + BucketKeyEnabled bool `json:"bucket_key_enabled,omitempty"` + CacheControl string `json:"cache_control,omitempty"` + ContentDisposition string `json:"content_disposition,omitempty"` + ContentEncoding string `json:"content_encoding,omitempty"` + Expires int64 `json:"expires,omitempty"` + ServerSideEncryption string `json:"server_side_encryption,omitempty"` + SignedUrl string `json:"signed_url,omitempty"` + Meta map[string]string `json:"meta,omitempty"` } type PutObjectOutput struct { From 6421d0370495d674f068db4a4b631427b32f165f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 29 Jun 2022 10:33:03 +0800 Subject: [PATCH 062/126] add ut --- pkg/grpc/extension/s3/s3_test.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pkg/grpc/extension/s3/s3_test.go b/pkg/grpc/extension/s3/s3_test.go index 60505d046c..3f00ddb274 100644 --- a/pkg/grpc/extension/s3/s3_test.go +++ b/pkg/grpc/extension/s3/s3_test.go @@ -44,6 +44,7 @@ import ( const ( MOCKSERVER = "mockossServer" + ByteSize = 5 ) type MockDataStream struct { @@ -137,7 +138,7 @@ func TestPutObject(t *testing.T) { mockStream.EXPECT().Recv().Return(nil, io.EOF) stream := newPutObjectStreamReader(putObjectReq.Body, mockStream) - data := make([]byte, 5, 5) + data := make([]byte, ByteSize, ByteSize) n, err := stream.Read(data) assert.Equal(t, 3, n) assert.Equal(t, io.EOF, err) @@ -172,7 +173,7 @@ func TestUploadPart(t *testing.T) { mockStream.EXPECT().Recv().Return(nil, io.EOF) stream := newUploadPartStreamReader(UploadPartReq.Body, mockStream) - data := make([]byte, 5, 5) + data := make([]byte, ByteSize, ByteSize) n, err := stream.Read(data) assert.Equal(t, 3, n) assert.Equal(t, io.EOF, err) @@ -207,7 +208,7 @@ func TestAppendObject(t *testing.T) { mockStream.EXPECT().Recv().Return(nil, io.EOF) stream := newAppendObjectStreamReader(req.Body, mockStream) - data := make([]byte, 5, 5) + data := make([]byte, ByteSize, ByteSize) n, err := stream.Read(data) assert.Equal(t, 3, n) assert.Equal(t, io.EOF, err) From 582ea688c758050dc7eefbd020cf96b2c3d38e0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 29 Jun 2022 10:41:13 +0800 Subject: [PATCH 063/126] fix go ci linter --- pkg/grpc/extension/s3/s3_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/grpc/extension/s3/s3_test.go b/pkg/grpc/extension/s3/s3_test.go index 3f00ddb274..7613064960 100644 --- a/pkg/grpc/extension/s3/s3_test.go +++ b/pkg/grpc/extension/s3/s3_test.go @@ -138,7 +138,7 @@ func TestPutObject(t *testing.T) { mockStream.EXPECT().Recv().Return(nil, io.EOF) stream := newPutObjectStreamReader(putObjectReq.Body, mockStream) - data := make([]byte, ByteSize, ByteSize) + data := make([]byte, ByteSize) n, err := stream.Read(data) assert.Equal(t, 3, n) assert.Equal(t, io.EOF, err) @@ -173,7 +173,7 @@ func TestUploadPart(t *testing.T) { mockStream.EXPECT().Recv().Return(nil, io.EOF) stream := newUploadPartStreamReader(UploadPartReq.Body, mockStream) - data := make([]byte, ByteSize, ByteSize) + data := make([]byte, ByteSize) n, err := stream.Read(data) assert.Equal(t, 3, n) assert.Equal(t, io.EOF, err) @@ -208,7 +208,7 @@ func TestAppendObject(t *testing.T) { mockStream.EXPECT().Recv().Return(nil, io.EOF) stream := newAppendObjectStreamReader(req.Body, mockStream) - data := make([]byte, ByteSize, ByteSize) + data := make([]byte, ByteSize) n, err := stream.Read(data) assert.Equal(t, 3, n) assert.Equal(t, io.EOF, err) From dcd329209db491e9dec24a05ed25ced6fc7e33f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 29 Jun 2022 11:08:50 +0800 Subject: [PATCH 064/126] retrigger ut --- pkg/grpc/extension/s3/s3_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/grpc/extension/s3/s3_test.go b/pkg/grpc/extension/s3/s3_test.go index 7613064960..ba43ed59c8 100644 --- a/pkg/grpc/extension/s3/s3_test.go +++ b/pkg/grpc/extension/s3/s3_test.go @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package s3 import ( From adb5dcc22c055871d4a3199eb15ea19ac0efe289 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 29 Jun 2022 12:27:39 +0800 Subject: [PATCH 065/126] add ut for coverage --- components/file/aliyun/option_test.go | 2 ++ pkg/grpc/extension/s3/s3_test.go | 11 ++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/components/file/aliyun/option_test.go b/components/file/aliyun/option_test.go index b41d5e6b40..30efa56903 100644 --- a/components/file/aliyun/option_test.go +++ b/components/file/aliyun/option_test.go @@ -48,6 +48,7 @@ func TestOptionNil(t *testing.T) { assert.Nil(t, CopySourceIfNoneMatch("")) assert.Nil(t, CopySourceIfModifiedSince(0)) assert.Nil(t, CopySourceIfUnmodifiedSince(0)) + assert.Nil(t, IfUnmodifiedSince(0)) assert.Nil(t, MetadataDirective("")) assert.Nil(t, ServerSideEncryption("")) assert.Nil(t, ServerSideEncryptionKeyID("")) @@ -106,6 +107,7 @@ func TestOptionNotNil(t *testing.T) { assert.NotNil(t, CopySourceIfNoneMatch(" ")) assert.NotNil(t, CopySourceIfModifiedSince(1)) assert.NotNil(t, CopySourceIfUnmodifiedSince(1)) + assert.Nil(t, IfUnmodifiedSince(1)) assert.NotNil(t, MetadataDirective(" ")) assert.NotNil(t, Meta(" ", " ")) assert.NotNil(t, ServerSideEncryption(" ")) diff --git a/pkg/grpc/extension/s3/s3_test.go b/pkg/grpc/extension/s3/s3_test.go index ba43ed59c8..18de4c8b18 100644 --- a/pkg/grpc/extension/s3/s3_test.go +++ b/pkg/grpc/extension/s3/s3_test.go @@ -23,9 +23,9 @@ import ( mockoss "mosn.io/layotto/pkg/mock/components/oss" - "mosn.io/pkg/buffer" - + lgrpc "google.golang.org/grpc" mocks3 "mosn.io/layotto/pkg/mock/runtime/oss" + "mosn.io/pkg/buffer" "github.com/stretchr/testify/assert" "google.golang.org/grpc/codes" @@ -64,11 +64,16 @@ func TestInitClient(t *testing.T) { ac.Oss[MOCKSERVER] = mockossServer NewS3Server(ac) s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} + err := s3Server.Init(nil) + assert.Nil(t, err) + server := lgrpc.NewServer() + err = s3Server.Register(server) + assert.Nil(t, err) // Test InitClient function initReq := &s3.InitInput{StoreName: "NoStore", Metadata: map[string]string{"k": "v"}} ctx := context.TODO() - _, err := s3Server.InitClient(ctx, initReq) + _, err = s3Server.InitClient(ctx, initReq) assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) mockossServer.EXPECT().InitClient(ctx, &l8s3.InitRequest{Metadata: initReq.Metadata}).Return(nil) initReq.StoreName = MOCKSERVER From 84e03c61dd8fbf032f2ba133c5d96a93a171d8e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 29 Jun 2022 13:04:44 +0800 Subject: [PATCH 066/126] format file --- pkg/grpc/extension/s3/s3_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/grpc/extension/s3/s3_test.go b/pkg/grpc/extension/s3/s3_test.go index 18de4c8b18..5b5e5b90e6 100644 --- a/pkg/grpc/extension/s3/s3_test.go +++ b/pkg/grpc/extension/s3/s3_test.go @@ -24,9 +24,10 @@ import ( mockoss "mosn.io/layotto/pkg/mock/components/oss" lgrpc "google.golang.org/grpc" - mocks3 "mosn.io/layotto/pkg/mock/runtime/oss" "mosn.io/pkg/buffer" + mocks3 "mosn.io/layotto/pkg/mock/runtime/oss" + "github.com/stretchr/testify/assert" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" From 598ec594a07af8ff3e81e9cc88d939a35f18853f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 29 Jun 2022 13:23:31 +0800 Subject: [PATCH 067/126] fix ut error --- components/file/aliyun/option_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/file/aliyun/option_test.go b/components/file/aliyun/option_test.go index 30efa56903..a3dd48e22c 100644 --- a/components/file/aliyun/option_test.go +++ b/components/file/aliyun/option_test.go @@ -107,7 +107,7 @@ func TestOptionNotNil(t *testing.T) { assert.NotNil(t, CopySourceIfNoneMatch(" ")) assert.NotNil(t, CopySourceIfModifiedSince(1)) assert.NotNil(t, CopySourceIfUnmodifiedSince(1)) - assert.Nil(t, IfUnmodifiedSince(1)) + assert.NotNil(t, IfUnmodifiedSince(1)) assert.NotNil(t, MetadataDirective(" ")) assert.NotNil(t, Meta(" ", " ")) assert.NotNil(t, ServerSideEncryption(" ")) From d606b1d34ec2c4ab460e7422f23e20803e9f2e39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Thu, 30 Jun 2022 20:06:00 +0800 Subject: [PATCH 068/126] fix some error after test --- components/file/aws/oss.go | 14 ++++-- components/file/aws/oss_test.go | 1 - demo/file/s3/client.go | 75 +++++++++++++++++++++++++++++---- 3 files changed, 78 insertions(+), 12 deletions(-) diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index 89a85c0202..ad4b923a7e 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -21,6 +21,7 @@ import ( "encoding/json" "errors" "fmt" + "net/url" "strings" "time" @@ -235,15 +236,17 @@ func (a *AwsOss) CopyObject(ctx context.Context, req *file.CopyObjectInput) (*fi if req.CopySource == nil { return nil, errors.New("must specific copy_source") } + //TODO: should support objects accessed through access points copySource := req.CopySource.CopySourceBucket + "/" + req.CopySource.CopySourceKey if req.CopySource.CopySourceVersionId != "" { copySource += "?versionId=" + req.CopySource.CopySourceVersionId } + copySourceUrlEncode := url.QueryEscape(copySource) input := &s3.CopyObjectInput{ Bucket: &req.Bucket, Key: &req.Key, - CopySource: ©Source, + CopySource: ©SourceUrlEncode, } resp, err := client.CopyObject(ctx, input) if err != nil { @@ -318,6 +321,11 @@ func (a *AwsOss) ListObjects(ctx context.Context, req *file.ListObjectsInput) (* }, }, }}) + // 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 (a *AwsOss) GetObjectCannedAcl(ctx context.Context, req *file.GetObjectCannedAclInput) (*file.GetObjectCannedAclOutput, error) { @@ -615,14 +623,14 @@ func (a *AwsOss) SignURL(ctx context.Context, req *file.SignURLInput) (*file.Sig 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))) + resp, err := resignClient.PresignGetObject(ctx, input, s3.WithPresignExpires(time.Duration((req.ExpiredInSec)*int64(time.Second)))) if err != nil { return nil, err } return &file.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))) + resp, err := resignClient.PresignPutObject(ctx, input, s3.WithPresignExpires(time.Duration(req.ExpiredInSec*int64(time.Second)))) if err != nil { return nil, err } diff --git a/components/file/aws/oss_test.go b/components/file/aws/oss_test.go index 77a694578e..4815ac4d9d 100644 --- a/components/file/aws/oss_test.go +++ b/components/file/aws/oss_test.go @@ -185,5 +185,4 @@ func TestAwsOss(t *testing.T) { err = instance.UpdateUpLoadBandwidthRateLimit(context.TODO(), &file.UpdateBandwidthRateLimitInput{}) assert.NotNil(t, err) - } diff --git a/demo/file/s3/client.go b/demo/file/s3/client.go index ca26822261..eb4c36240a 100644 --- a/demo/file/s3/client.go +++ b/demo/file/s3/client.go @@ -21,7 +21,7 @@ import ( "context" "fmt" "os" - "time" + "strconv" s3 "mosn.io/layotto/spec/proto/extension/v1" @@ -194,9 +194,9 @@ func TestAcl(name string) { resp, err := c.GetObjectCannedAcl(context.Background(), req) if err != nil { fmt.Printf("GetObjectAcl fail, err: %+v \n", err) - return + } else { + fmt.Printf("get acl success, resp: %+v\n", resp) } - fmt.Printf("get acl success, resp: %+v\n", resp) putRequest := &s3.PutObjectCannedAclInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name, Acl: "public-read-write"} resp2, err := c.PutObjectCannedAcl(context.Background(), putRequest) @@ -225,7 +225,7 @@ func TestCopyObject(name string) { } -func TestPart() { +func TestPart(name string) { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) @@ -248,7 +248,7 @@ func TestPart() { } fmt.Printf("ListMultipartUploads success, resp: %+v \n", resp1) - req2 := &s3.UploadPartCopyInput{StoreName: storeName, Bucket: "antsys-wenxuwan", PartNumber: 1, UploadId: resp.UploadId, Key: "multicopy.jpg", StartPosition: 0, PartSize: 1000, CopySource: &s3.CopySource{CopySourceBucket: "antsys-wenxuwan", CopySourceKey: "hello2.txt"}} + req2 := &s3.UploadPartCopyInput{StoreName: storeName, Bucket: "antsys-wenxuwan", PartNumber: 1, UploadId: resp.UploadId, Key: "multicopy.jpg", StartPosition: 0, PartSize: 1000, CopySource: &s3.CopySource{CopySourceBucket: "antsys-wenxuwan", CopySourceKey: name}} resp2, err := c.UploadPartCopy(context.Background(), req2) if err != nil { fmt.Printf("UploadPartCopy fail, err: %+v \n", err) @@ -302,7 +302,7 @@ func TestPart() { if err != nil || 0 == n { break } - req6.Body = dataByte + req6.Body = dataByte[:n] req6.ContentLength = int64(n) req6.PartNumber = req6.PartNumber + 1 stream, err := c.UploadPart(context.TODO()) @@ -324,6 +324,13 @@ func TestPart() { parts = append(parts, part) } fmt.Printf("UploadPart success, parts: %+v \n", parts) + req8 := &s3.ListPartsInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "海贼王.jpg", UploadId: resp5.UploadId} + resp8, err := c.ListParts(context.Background(), req8) + if err != nil { + fmt.Printf("ListPartsInput fail, err: %+v \n", err) + } else { + fmt.Printf("ListPartsInput success, resp: %+v \n", resp8) + } req7 := &s3.CompleteMultipartUploadInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "海贼王.jpg", UploadId: resp5.UploadId, MultipartUpload: &s3.CompletedMultipartUpload{Parts: parts}} resp7, err := c.CompleteMultipartUpload(context.Background(), req7) if err != nil { @@ -420,7 +427,7 @@ func TestSign(name, method string) { return } c := s3.NewObjectStorageServiceClient(conn) - req := &s3.SignURLInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name, ExpiredInSec: int64(10 * time.Minute), Method: method} + req := &s3.SignURLInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name, ExpiredInSec: int64(10), Method: method} resp, err := c.SignURL(context.Background(), req) if err != nil { fmt.Printf("SignURLInput fail, err: %+v \n", err) @@ -430,6 +437,50 @@ func TestSign(name, method string) { } +func TestAppend(fileName, data, position string) { + conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) + if err != nil { + fmt.Printf("conn build failed,err:%+v", err) + return + } + c := s3.NewObjectStorageServiceClient(conn) + ps, _ := strconv.Atoi(position) + req := &s3.AppendObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: fileName, Body: []byte(data), Position: int64(ps)} + stream, err := c.AppendObject(context.Background()) + if err != nil { + fmt.Printf("AppendObject fail,err:%+v", err) + return + } + err = stream.Send(req) + if err != nil { + fmt.Printf("AppendObject fail,err:%+v", err) + return + } + resp, err := stream.CloseAndRecv() + if err != nil { + fmt.Printf("AppendObject fail,err:%+v", err) + return + } + fmt.Printf("AppendObject success,resp: %+v \n", resp) +} + +func TestHeadObject(fileName string) { + conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) + if err != nil { + fmt.Printf("conn build failed,err:%+v", err) + return + } + c := s3.NewObjectStorageServiceClient(conn) + req := &s3.HeadObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: fileName} + resp, err := c.HeadObject(context.Background(), req) + if err != nil { + fmt.Printf("HeadObjectInput fail,err:%+v", err) + return + } + + fmt.Printf("HeadObjectInput success,resp: %+v \n", resp) +} + func main() { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { @@ -474,7 +525,7 @@ func main() { } if os.Args[1] == "part" { - TestPart() + TestPart(os.Args[2]) } if os.Args[1] == "version" { @@ -494,4 +545,12 @@ func main() { if os.Args[1] == "sign" { TestSign(os.Args[2], os.Args[3]) } + + if os.Args[1] == "append" { + TestAppend(os.Args[2], os.Args[3], os.Args[4]) + } + + if os.Args[1] == "head" { + TestHeadObject(os.Args[2]) + } } From 10b9902e7136ea022811a40174a5f81b1f38fa5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 4 Jul 2022 11:26:04 +0800 Subject: [PATCH 069/126] add quick start for oss demo --- configs/oss.json | 42 ++++++++++++++ demo/file/s3/client.go | 122 +++++++++++++++++++-------------------- docs/zh/start/oss/oss.md | 77 ++++++++++++++++++++++++ 3 files changed, 180 insertions(+), 61 deletions(-) create mode 100644 configs/oss.json create mode 100644 docs/zh/start/oss/oss.md diff --git a/configs/oss.json b/configs/oss.json new file mode 100644 index 0000000000..7ab2509627 --- /dev/null +++ b/configs/oss.json @@ -0,0 +1,42 @@ +{ + "servers": [ + { + "default_log_path": "stdout", + "default_log_level": "DEBUG", + "listeners": [ + { + "name": "grpc", + "address": "127.0.0.1:34904", + "bind_port": true, + "filter_chains": [ + { + "filters": [ + { + "type": "grpc", + "config": { + "server_name": "runtime", + "grpc_config": { + "oss": { + "oss_demo": { + "type": "awsOSS", + "metadata": [ + { + "region": "your-oss-resource-region", + "endpoint": "your-oss-resource-endpoint", + "accessKeyID": "your-oss-resource-accessKeyID", + "accessKeySecret": "your-oss-resource-accessKeySecret" + } + ] + } + } + } + } + } + ] + } + ] + } + ] + } + ] +} diff --git a/demo/file/s3/client.go b/demo/file/s3/client.go index eb4c36240a..1bde707f1d 100644 --- a/demo/file/s3/client.go +++ b/demo/file/s3/client.go @@ -32,7 +32,7 @@ const ( storeName = "oss_demo" ) -func TestGetObjectInput(fileName string) { +func TestGetObjectInput(bucket, fileName string) { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) @@ -40,7 +40,7 @@ func TestGetObjectInput(fileName string) { } c := s3.NewObjectStorageServiceClient(conn) - req := &s3.GetObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: fileName} + req := &s3.GetObjectInput{StoreName: storeName, Bucket: bucket, Key: fileName} cli, err := c.GetObject(context.Background(), req) if err != nil { fmt.Printf("get file error: %+v", err) @@ -60,14 +60,14 @@ func TestGetObjectInput(fileName string) { fmt.Println(string(pic)) } -func TestPutObject(fileName string, value string) { +func TestPutObject(bucket, fileName string, value string) { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return } c := s3.NewObjectStorageServiceClient(conn) - req := &s3.PutObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: fileName} + req := &s3.PutObjectInput{StoreName: storeName, Bucket: bucket, Key: fileName} stream, err := c.PutObject(context.TODO()) if err != nil { fmt.Printf("put file failed:%+v", err) @@ -81,7 +81,7 @@ func TestPutObject(fileName string, value string) { } } -func TestListObjects() { +func TestListObjects(bucket string) { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) @@ -90,7 +90,7 @@ func TestListObjects() { c := s3.NewObjectStorageServiceClient(conn) marker := "" for { - req := &s3.ListObjectsInput{StoreName: storeName, Bucket: "antsys-wenxuwan", MaxKeys: 2, Marker: marker} + req := &s3.ListObjectsInput{StoreName: storeName, Bucket: bucket, MaxKeys: 2, Marker: marker} resp, err := c.ListObjects(context.Background(), req) if err != nil { fmt.Printf("list file fail, err: %+v", err) @@ -107,14 +107,14 @@ func TestListObjects() { } -func TestDeleteObject(fileName string) { +func TestDeleteObject(bucket, fileName string) { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return } c := s3.NewObjectStorageServiceClient(conn) - req := &s3.DeleteObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: fileName} + req := &s3.DeleteObjectInput{StoreName: storeName, Bucket: bucket, Key: fileName} resp, err := c.DeleteObject(context.Background(), req) if err != nil { fmt.Printf("DeleteObject fail, err: %+v \n", err) @@ -123,14 +123,14 @@ func TestDeleteObject(fileName string) { fmt.Printf("delete file success with resp: %+v \n", resp) } -func TestDeleteObjects(fileName1, fileName2 string) { +func TestDeleteObjects(bucket, fileName1, fileName2 string) { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return } c := s3.NewObjectStorageServiceClient(conn) - req2 := &s3.DeleteObjectsInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Delete: &s3.Delete{}} + req2 := &s3.DeleteObjectsInput{StoreName: storeName, Bucket: bucket, Delete: &s3.Delete{}} object1 := &s3.ObjectIdentifier{Key: fileName1} object2 := &s3.ObjectIdentifier{Key: fileName2} req2.Delete.Objects = append(req2.Delete.Objects, object1) @@ -143,14 +143,14 @@ func TestDeleteObjects(fileName1, fileName2 string) { fmt.Printf("DeleteObjects success with resp: %+v \n", resp2) } -func TestTagging(name string) { +func TestTagging(bucket, name string) { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return } c := s3.NewObjectStorageServiceClient(conn) - req := &s3.PutObjectTaggingInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name, Tags: map[string]string{"Abc": "123", "Def": "456"}} + req := &s3.PutObjectTaggingInput{StoreName: storeName, Bucket: bucket, Key: name, Tags: map[string]string{"Abc": "123", "Def": "456"}} _, err = c.PutObjectTagging(context.Background(), req) if err != nil { fmt.Printf("PutObjectTagging fail, err: %+v \n", err) @@ -158,7 +158,7 @@ func TestTagging(name string) { } fmt.Printf("PutObjectTagging success, try get tagging\n") - req2 := &s3.GetObjectTaggingInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name} + req2 := &s3.GetObjectTaggingInput{StoreName: storeName, Bucket: bucket, Key: name} getResp, err := c.GetObjectTagging(context.Background(), req2) if err != nil { fmt.Printf("GetObjectTagging fail, err: %+v \n", err) @@ -166,7 +166,7 @@ func TestTagging(name string) { } fmt.Printf("GetObjectTagging: %+v \n", getResp.Tags) - req3 := &s3.DeleteObjectTaggingInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name} + req3 := &s3.DeleteObjectTaggingInput{StoreName: storeName, Bucket: bucket, Key: name} delResp, err := c.DeleteObjectTagging(context.Background(), req3) if err != nil { fmt.Printf("DeleteObjectTagging fail, err: %+v \n", err) @@ -174,7 +174,7 @@ func TestTagging(name string) { } fmt.Printf("DeleteObjectTagging success: %+v \n", delResp.VersionId) - req4 := &s3.GetObjectTaggingInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name} + req4 := &s3.GetObjectTaggingInput{StoreName: storeName, Bucket: bucket, Key: name} getResp4, err := c.GetObjectTagging(context.Background(), req4) if err != nil { fmt.Printf("GetObjectTagging fail, err: %+v \n", err) @@ -183,14 +183,14 @@ func TestTagging(name string) { fmt.Printf("GetObjectTagging after delete tag: %+v \n", getResp4.Tags) } -func TestAcl(name string) { +func TestAcl(bucket, name string) { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return } c := s3.NewObjectStorageServiceClient(conn) - req := &s3.GetObjectCannedAclInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name} + req := &s3.GetObjectCannedAclInput{StoreName: storeName, Bucket: bucket, Key: name} resp, err := c.GetObjectCannedAcl(context.Background(), req) if err != nil { fmt.Printf("GetObjectAcl fail, err: %+v \n", err) @@ -198,7 +198,7 @@ func TestAcl(name string) { fmt.Printf("get acl success, resp: %+v\n", resp) } - putRequest := &s3.PutObjectCannedAclInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name, Acl: "public-read-write"} + putRequest := &s3.PutObjectCannedAclInput{StoreName: storeName, Bucket: bucket, Key: name, Acl: "public-read-write"} resp2, err := c.PutObjectCannedAcl(context.Background(), putRequest) if err != nil { fmt.Printf("TestAcl fail, err: %+v \n", err) @@ -208,14 +208,14 @@ func TestAcl(name string) { } -func TestCopyObject(name string) { +func TestCopyObject(bucket, name string) { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return } c := s3.NewObjectStorageServiceClient(conn) - req := &s3.CopyObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name + ".copy", CopySource: &s3.CopySource{CopySourceBucket: "antsys-wenxuwan", CopySourceKey: name}} + req := &s3.CopyObjectInput{StoreName: storeName, Bucket: bucket, Key: name + ".copy", CopySource: &s3.CopySource{CopySourceBucket: bucket, CopySourceKey: name}} resp, err := c.CopyObject(context.Background(), req) if err != nil { fmt.Printf("CopyObject fail, err: %+v \n", err) @@ -225,14 +225,14 @@ func TestCopyObject(name string) { } -func TestPart(name string) { +func TestPart(bucket, name string) { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return } c := s3.NewObjectStorageServiceClient(conn) - req := &s3.CreateMultipartUploadInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "multicopy.jpg"} + req := &s3.CreateMultipartUploadInput{StoreName: storeName, Bucket: bucket, Key: "multicopy.jpg"} resp, err := c.CreateMultipartUpload(context.Background(), req) if err != nil { fmt.Printf("CreateMultipartUpload fail, err: %+v \n", err) @@ -240,7 +240,7 @@ func TestPart(name string) { } fmt.Printf("CreateMultipartUpload success, resp: %+v\n", resp) - req1 := &s3.ListMultipartUploadsInput{StoreName: storeName, Bucket: "antsys-wenxuwan", MaxUploads: 1000, KeyMarker: "multicopy.jpg", UploadIdMarker: resp.UploadId} + req1 := &s3.ListMultipartUploadsInput{StoreName: storeName, Bucket: bucket, MaxUploads: 1000, KeyMarker: "multicopy.jpg", UploadIdMarker: resp.UploadId} resp1, err := c.ListMultipartUploads(context.Background(), req1) if err != nil { fmt.Printf("ListMultipartUploads fail, err: %+v \n", err) @@ -248,7 +248,7 @@ func TestPart(name string) { } fmt.Printf("ListMultipartUploads success, resp: %+v \n", resp1) - req2 := &s3.UploadPartCopyInput{StoreName: storeName, Bucket: "antsys-wenxuwan", PartNumber: 1, UploadId: resp.UploadId, Key: "multicopy.jpg", StartPosition: 0, PartSize: 1000, CopySource: &s3.CopySource{CopySourceBucket: "antsys-wenxuwan", CopySourceKey: name}} + req2 := &s3.UploadPartCopyInput{StoreName: storeName, Bucket: bucket, PartNumber: 1, UploadId: resp.UploadId, Key: "multicopy.jpg", StartPosition: 0, PartSize: 1000, CopySource: &s3.CopySource{CopySourceBucket: bucket, CopySourceKey: name}} resp2, err := c.UploadPartCopy(context.Background(), req2) if err != nil { fmt.Printf("UploadPartCopy fail, err: %+v \n", err) @@ -256,7 +256,7 @@ func TestPart(name string) { } fmt.Printf("UploadPartCopy success, resp: %+v \n", resp2) - req3 := &s3.CompleteMultipartUploadInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "multicopy.jpg", UploadId: resp.UploadId, MultipartUpload: &s3.CompletedMultipartUpload{Parts: []*s3.CompletedPart{{Etag: resp2.CopyPartResult.Etag, PartNumber: req2.PartNumber}}}} + req3 := &s3.CompleteMultipartUploadInput{StoreName: storeName, Bucket: bucket, Key: "multicopy.jpg", UploadId: resp.UploadId, MultipartUpload: &s3.CompletedMultipartUpload{Parts: []*s3.CompletedPart{{Etag: resp2.CopyPartResult.Etag, PartNumber: req2.PartNumber}}}} resp3, err := c.CompleteMultipartUpload(context.Background(), req3) if err != nil { fmt.Printf("CompleteMultipartUpload fail, err: %+v \n", err) @@ -264,7 +264,7 @@ func TestPart(name string) { } fmt.Printf("CompleteMultipartUpload success, resp: %+v \n", resp3) - //req4 := &s3.AbortMultipartUploadInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "海贼王.jpeg", UploadId: "EEE5317D0EB841AC9B80D0B6A2F811AA"} + //req4 := &s3.AbortMultipartUploadInput{StoreName: storeName, Bucket: bucket, Key: "海贼王.jpeg", UploadId: "EEE5317D0EB841AC9B80D0B6A2F811AA"} //resp4, err := c.AbortMultipartUpload(context.Background(), req4) //if err != nil { // fmt.Printf("AbortMultipartUpload fail, err: %+v \n", err) @@ -272,7 +272,7 @@ func TestPart(name string) { //} //fmt.Printf("AbortMultipartUpload success, resp: %+v \n", resp4) - req5 := &s3.CreateMultipartUploadInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "海贼王.jpg"} + req5 := &s3.CreateMultipartUploadInput{StoreName: storeName, Bucket: bucket, Key: "海贼王.jpg"} resp5, err := c.CreateMultipartUpload(context.Background(), req5) if err != nil { fmt.Printf("CreateMultipartUpload fail, err: %+v \n", err) @@ -282,7 +282,7 @@ func TestPart(name string) { req6 := &s3.UploadPartInput{ StoreName: storeName, - Bucket: "antsys-wenxuwan", + Bucket: bucket, Key: "海贼王.jpg", UploadId: resp5.UploadId, PartNumber: 0, @@ -324,14 +324,14 @@ func TestPart(name string) { parts = append(parts, part) } fmt.Printf("UploadPart success, parts: %+v \n", parts) - req8 := &s3.ListPartsInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "海贼王.jpg", UploadId: resp5.UploadId} + req8 := &s3.ListPartsInput{StoreName: storeName, Bucket: bucket, Key: "海贼王.jpg", UploadId: resp5.UploadId} resp8, err := c.ListParts(context.Background(), req8) if err != nil { fmt.Printf("ListPartsInput fail, err: %+v \n", err) } else { fmt.Printf("ListPartsInput success, resp: %+v \n", resp8) } - req7 := &s3.CompleteMultipartUploadInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: "海贼王.jpg", UploadId: resp5.UploadId, MultipartUpload: &s3.CompletedMultipartUpload{Parts: parts}} + req7 := &s3.CompleteMultipartUploadInput{StoreName: storeName, Bucket: bucket, Key: "海贼王.jpg", UploadId: resp5.UploadId, MultipartUpload: &s3.CompletedMultipartUpload{Parts: parts}} resp7, err := c.CompleteMultipartUpload(context.Background(), req7) if err != nil { fmt.Printf("CompleteMultipartUpload fail, err: %+v \n", err) @@ -340,14 +340,14 @@ func TestPart(name string) { fmt.Printf("CompleteMultipartUpload success, resp: %+v \n", resp7) } -func TestListVersion() { +func TestListVersion(bucket string) { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return } c := s3.NewObjectStorageServiceClient(conn) - req := &s3.ListObjectVersionsInput{StoreName: storeName, Bucket: "antsys-wenxuwan"} + req := &s3.ListObjectVersionsInput{StoreName: storeName, Bucket: bucket} resp, err := c.ListObjectVersions(context.Background(), req) if err != nil { fmt.Printf("ListObjectVersions fail, err: %+v \n", err) @@ -357,14 +357,14 @@ func TestListVersion() { } -func TestRestore(name string) { +func TestRestore(bucket, name string) { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return } c := s3.NewObjectStorageServiceClient(conn) - req := &s3.RestoreObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name} + req := &s3.RestoreObjectInput{StoreName: storeName, Bucket: bucket, Key: name} resp, err := c.RestoreObject(context.Background(), req) if err != nil { fmt.Printf("RestoreObject fail, err: %+v \n", err) @@ -374,14 +374,14 @@ func TestRestore(name string) { } -func TestObjectExist(name string) { +func TestObjectExist(bucket, name string) { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return } c := s3.NewObjectStorageServiceClient(conn) - req := &s3.IsObjectExistInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name} + req := &s3.IsObjectExistInput{StoreName: storeName, Bucket: bucket, Key: name} resp, err := c.IsObjectExist(context.Background(), req) if err != nil { fmt.Printf("TestObjectExist fail, err: %+v \n", err) @@ -391,7 +391,7 @@ func TestObjectExist(name string) { } -func TestAbortMultipartUpload() { +func TestAbortMultipartUpload(bucket string) { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) @@ -399,7 +399,7 @@ func TestAbortMultipartUpload() { } c := s3.NewObjectStorageServiceClient(conn) - req := &s3.ListMultipartUploadsInput{StoreName: storeName, Bucket: "antsys-wenxuwan", MaxUploads: 1000} + req := &s3.ListMultipartUploadsInput{StoreName: storeName, Bucket: bucket, MaxUploads: 1000} resp, err := c.ListMultipartUploads(context.Background(), req) if err != nil { fmt.Printf("ListMultipartUploads fail, err: %+v \n", err) @@ -408,7 +408,7 @@ func TestAbortMultipartUpload() { fmt.Printf("ListMultipartUploads success, resp: %+v \n", resp) for _, v := range resp.Uploads { - req4 := &s3.AbortMultipartUploadInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: v.Key, UploadId: v.UploadId} + req4 := &s3.AbortMultipartUploadInput{StoreName: storeName, Bucket: bucket, Key: v.Key, UploadId: v.UploadId} resp4, err := c.AbortMultipartUpload(context.Background(), req4) if err != nil { fmt.Printf("AbortMultipartUpload fail, err: %+v \n", err) @@ -420,14 +420,14 @@ func TestAbortMultipartUpload() { fmt.Printf("AbortMultipartUpload test success") } -func TestSign(name, method string) { +func TestSign(bucket, name, method string) { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return } c := s3.NewObjectStorageServiceClient(conn) - req := &s3.SignURLInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: name, ExpiredInSec: int64(10), Method: method} + req := &s3.SignURLInput{StoreName: storeName, Bucket: bucket, Key: name, ExpiredInSec: int64(10), Method: method} resp, err := c.SignURL(context.Background(), req) if err != nil { fmt.Printf("SignURLInput fail, err: %+v \n", err) @@ -437,7 +437,7 @@ func TestSign(name, method string) { } -func TestAppend(fileName, data, position string) { +func TestAppend(bucket, fileName, data, position string) { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) @@ -445,7 +445,7 @@ func TestAppend(fileName, data, position string) { } c := s3.NewObjectStorageServiceClient(conn) ps, _ := strconv.Atoi(position) - req := &s3.AppendObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: fileName, Body: []byte(data), Position: int64(ps)} + req := &s3.AppendObjectInput{StoreName: storeName, Bucket: bucket, Key: fileName, Body: []byte(data), Position: int64(ps)} stream, err := c.AppendObject(context.Background()) if err != nil { fmt.Printf("AppendObject fail,err:%+v", err) @@ -464,14 +464,14 @@ func TestAppend(fileName, data, position string) { fmt.Printf("AppendObject success,resp: %+v \n", resp) } -func TestHeadObject(fileName string) { +func TestHeadObject(bucket, fileName string) { conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) if err != nil { fmt.Printf("conn build failed,err:%+v", err) return } c := s3.NewObjectStorageServiceClient(conn) - req := &s3.HeadObjectInput{StoreName: storeName, Bucket: "antsys-wenxuwan", Key: fileName} + req := &s3.HeadObjectInput{StoreName: storeName, Bucket: bucket, Key: fileName} resp, err := c.HeadObject(context.Background(), req) if err != nil { fmt.Printf("HeadObjectInput fail,err:%+v", err) @@ -496,61 +496,61 @@ func main() { } if os.Args[1] == "put" { - TestPutObject(os.Args[2], os.Args[3]) + TestPutObject(os.Args[2], os.Args[3], os.Args[4]) } if os.Args[1] == "get" { - TestGetObjectInput(os.Args[2]) + TestGetObjectInput(os.Args[2], os.Args[3]) } if os.Args[1] == "del" { - TestDeleteObject(os.Args[2]) + TestDeleteObject(os.Args[2], os.Args[3]) } if os.Args[1] == "dels" { - TestDeleteObjects(os.Args[2], os.Args[3]) + TestDeleteObjects(os.Args[2], os.Args[3], os.Args[4]) } if os.Args[1] == "list" { - TestListObjects() + TestListObjects(os.Args[2]) } if os.Args[1] == "tag" { - TestTagging(os.Args[2]) + TestTagging(os.Args[2], os.Args[3]) } if os.Args[1] == "acl" { - TestAcl(os.Args[2]) + TestAcl(os.Args[2], os.Args[3]) } if os.Args[1] == "copy" { - TestCopyObject(os.Args[2]) + TestCopyObject(os.Args[2], os.Args[3]) } if os.Args[1] == "part" { - TestPart(os.Args[2]) + TestPart(os.Args[2], os.Args[3]) } if os.Args[1] == "version" { - TestListVersion() + TestListVersion(os.Args[2]) } if os.Args[1] == "restore" { - TestRestore(os.Args[2]) + TestRestore(os.Args[2], os.Args[3]) } if os.Args[1] == "exist" { - TestObjectExist(os.Args[2]) + TestObjectExist(os.Args[2], os.Args[3]) } if os.Args[1] == "abort" { - TestAbortMultipartUpload() + TestAbortMultipartUpload(os.Args[2]) } if os.Args[1] == "sign" { - TestSign(os.Args[2], os.Args[3]) + TestSign(os.Args[2], os.Args[3], os.Args[4]) } if os.Args[1] == "append" { - TestAppend(os.Args[2], os.Args[3], os.Args[4]) + TestAppend(os.Args[2], os.Args[3], os.Args[4], os.Args[5]) } if os.Args[1] == "head" { - TestHeadObject(os.Args[2]) + TestHeadObject(os.Args[2], os.Args[3]) } } diff --git a/docs/zh/start/oss/oss.md b/docs/zh/start/oss/oss.md new file mode 100644 index 0000000000..14673e0d45 --- /dev/null +++ b/docs/zh/start/oss/oss.md @@ -0,0 +1,77 @@ +# 基于S3协议实现对象存储的无感迁移 + +## 快速开始 + +Layotto提供了访问OSS的示例 [demo](https://github.com/mosn/layotto/blob/main/demo/file/client.go) ,该示例基于S3协议实现了对象的一系列操作,当前 +已支持25个接口。可以做到在不同的OSS实例之间进行无感迁移。 + +### step 1. 启动layotto + +layotto提供了minio的配置文件[oss配置](../../../../configs/oss.json) ,如下所示: + +```json + "grpc_config": { + "oss": { + "oss_demo": { + "type": "awsOSS", + "metadata": [ + { + "region": "your-oss-resource-region", + "endpoint": "your-oss-resource-endpoint", + "accessKeyID": "your-oss-resource-accessKeyID", + "accessKeySecret": "your-oss-resource-accessKeySecret" + } + ] + } + } + } +``` + +配置主要包含四个字段,需要替换成自己的OSS账号的配置。 + +配置好后,切换目录: + +```shell +#备注 请将${project_path}替换成你的项目路径 +cd ${project_path}/cmd/layotto +``` + +构建: + +```shell @if.not.exist layotto +go build -o layotto +``` + +启动 Layotto: + +```shell @background +./layotto start -c ../../configs/oss.json +``` + + +### step 2. 启动测试demo + +Layotto提供了访问文件的示例 [demo](../../../../demo/file/s3/client.go) + +```shell +cd ${project_path}/demo/file/s3/ +go build client.go + +# 上传名为test3.txt的文件到名为antsys-wenxuwan的bucket下,内容为"hello" +./client put antsys-wenxuwan test3.txt "hello" + +# 获取antsys-wenxuwan bucket下名为test3.txt的文件 +./client get antsys-wenxuwan test3.txt + +# 删除antsys-wenxuwan bucket下名为test3.txt的文件 +./client del antsys-wenxuwan test3.txt + +# 返回antsys-wenxuwan bucket下的所有文件信息 +./client list antsys-wenxuwan + +``` + + + +#### 细节以后再说,继续体验其他API +通过左侧的导航栏,继续体验别的API吧! From 9b9657e8aa10503c057bda09858e70e339bff3f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 4 Jul 2022 11:34:06 +0800 Subject: [PATCH 070/126] remove oss config from file --- configs/config_file.json | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/configs/config_file.json b/configs/config_file.json index a50038617f..a249163fc8 100644 --- a/configs/config_file.json +++ b/configs/config_file.json @@ -22,29 +22,6 @@ "hello": "greeting" } }, - "oss": { - "oss_demo": { - "type": "aliyunOSS", - "metadata": [ - { - "buckets" : ["bucket1","bucket2"], - "endpoint": "aliyun1", - "accessKeyID": "layotto", - "accessKeySecret": "layotto_secret", - "SSL":false, - "region":"us-east-1" - }, - { - "buckets" : ["bucket1","bucket2"], - "endpoint": "aliyun2", - "accessKeyID": "layotto", - "accessKeySecret": "layotto_secret", - "SSL":false, - "region":"us-east-2" - } - ] - } - }, "file": { "file_demo": { "type": "minioOSS", From 2df381d25de8806adef64f97e6f28e215326c15d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 4 Jul 2022 12:19:23 +0800 Subject: [PATCH 071/126] add comments for oss configure --- docs/zh/start/oss/oss.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/zh/start/oss/oss.md b/docs/zh/start/oss/oss.md index 14673e0d45..2c42ea48e1 100644 --- a/docs/zh/start/oss/oss.md +++ b/docs/zh/start/oss/oss.md @@ -27,7 +27,8 @@ layotto提供了minio的配置文件[oss配置](../../../../configs/oss.json) } ``` -配置主要包含四个字段,需要替换成自己的OSS账号的配置。 +配置主要包含四个字段,需要替换成自己的OSS账号的配置。type当前支持aliyunOSS和awsOSS两种类型,分别对应阿里云的OSS服务和亚马逊云的OSS服务。用户可以根据自己的实际场景 +进行配置。 配置好后,切换目录: From 980348d27c47ad121bcbcaf0dd9dbe2f35bc885c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 6 Jul 2022 10:48:29 +0800 Subject: [PATCH 072/126] add uid for user to select client --- components/file/aliyun/file.go | 14 +- components/file/aliyun/file_test.go | 7 +- components/file/aliyun/oss.go | 48 +- components/file/aliyun/oss_test.go | 12 +- components/file/aws/file.go | 22 +- components/file/aws/file_test.go | 27 +- components/file/aws/oss.go | 42 +- components/file/oss.go | 555 +++--- spec/proto/extension/v1/oss.pb.go | 2441 +++++++++++++++------------ spec/proto/extension/v1/oss.proto | 50 + 10 files changed, 1795 insertions(+), 1423 deletions(-) diff --git a/components/file/aliyun/file.go b/components/file/aliyun/file.go index 3dc39e7249..e3deaee25a 100644 --- a/components/file/aliyun/file.go +++ b/components/file/aliyun/file.go @@ -215,7 +215,8 @@ func (s *AliyunOSS) getBucket(fileName string, metaData map[string]string) (*oss if err != nil { return nil, err } - ossClient, err = s.selectClient(bucketName) + //for file interface, not support specify uid now + ossClient, err = s.selectClient("", bucketName) if err != nil { return nil, err } @@ -226,11 +227,18 @@ func (s *AliyunOSS) getBucket(fileName string, metaData map[string]string) (*oss return bucket, nil } -func (s *AliyunOSS) selectClient(bucket string) (*oss.Client, error) { +func (s *AliyunOSS) selectClient(uid, bucket string) (*oss.Client, error) { + // 1. if user specify client uid, use specify client first + if uid != "" { + if client, ok := s.client[uid]; ok { + return client, nil + } + } + // 2. if user not specify client uid, use bucket to select client if client, ok := s.client[bucket]; ok { return client, nil } - // if not specify endpoint, select default one + // 3. if not specify uid and bucket, select default one if len(s.client) == 1 { for _, client := range s.client { return client, nil diff --git a/components/file/aliyun/file_test.go b/components/file/aliyun/file_test.go index 1dfe3eb5d7..93c4e9f51f 100644 --- a/components/file/aliyun/file_test.go +++ b/components/file/aliyun/file_test.go @@ -51,20 +51,19 @@ func TestInit(t *testing.T) { func TestSelectClient(t *testing.T) { ossObject := &AliyunOSS{client: make(map[string]*oss.Client)} - - client, err := ossObject.selectClient("") + client, err := ossObject.selectClient("", "") assert.Equal(t, err.Error(), "should specific endpoint in metadata") assert.Nil(t, client) client1 := &oss.Client{} ossObject.client["127.0.0.1"] = client1 - client, err = ossObject.selectClient("") + client, err = ossObject.selectClient("", "") assert.Equal(t, client, client1) assert.Nil(t, err) client2 := &oss.Client{} ossObject.client["0.0.0.0"] = client2 - client, err = ossObject.selectClient("") + client, err = ossObject.selectClient("", "") assert.Equal(t, err.Error(), "should specific endpoint in metadata") assert.Nil(t, client) } diff --git a/components/file/aliyun/oss.go b/components/file/aliyun/oss.go index f55c5e615b..a5c6243747 100644 --- a/components/file/aliyun/oss.go +++ b/components/file/aliyun/oss.go @@ -86,7 +86,7 @@ func (a *AliyunOSS) InitClient(ctx context.Context, req *file.InitRequest) error } func (a *AliyunOSS) GetObject(ctx context.Context, req *file.GetObjectInput) (*file.GetObjectOutput, error) { - client, err := a.selectClient(req.Bucket) + client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -112,7 +112,7 @@ func (a *AliyunOSS) GetObject(ctx context.Context, req *file.GetObjectInput) (*f } func (a *AliyunOSS) PutObject(ctx context.Context, req *file.PutObjectInput) (*file.PutObjectOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -146,7 +146,7 @@ func (a *AliyunOSS) PutObject(ctx context.Context, req *file.PutObjectInput) (*f } func (a *AliyunOSS) DeleteObject(ctx context.Context, req *file.DeleteObjectInput) (*file.DeleteObjectOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -158,7 +158,7 @@ func (a *AliyunOSS) DeleteObject(ctx context.Context, req *file.DeleteObjectInpu return &file.DeleteObjectOutput{}, err } func (a *AliyunOSS) DeleteObjects(ctx context.Context, req *file.DeleteObjectsInput) (*file.DeleteObjectsOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -184,7 +184,7 @@ func (a *AliyunOSS) DeleteObjects(ctx context.Context, req *file.DeleteObjectsIn } func (a *AliyunOSS) PutObjectTagging(ctx context.Context, req *file.PutObjectTaggingInput) (*file.PutObjectTaggingOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -202,7 +202,7 @@ func (a *AliyunOSS) PutObjectTagging(ctx context.Context, req *file.PutObjectTag } func (a *AliyunOSS) DeleteObjectTagging(ctx context.Context, req *file.DeleteObjectTaggingInput) (*file.DeleteObjectTaggingOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -215,7 +215,7 @@ func (a *AliyunOSS) DeleteObjectTagging(ctx context.Context, req *file.DeleteObj } func (a *AliyunOSS) GetObjectTagging(ctx context.Context, req *file.GetObjectTaggingInput) (*file.GetObjectTaggingOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -235,7 +235,7 @@ func (a *AliyunOSS) GetObjectTagging(ctx context.Context, req *file.GetObjectTag } func (a *AliyunOSS) GetObjectCannedAcl(ctx context.Context, req *file.GetObjectCannedAclInput) (*file.GetObjectCannedAclOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -251,7 +251,7 @@ func (a *AliyunOSS) GetObjectCannedAcl(ctx context.Context, req *file.GetObjectC return output, err } func (a *AliyunOSS) PutObjectCannedAcl(ctx context.Context, req *file.PutObjectCannedAclInput) (*file.PutObjectCannedAclOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -264,7 +264,7 @@ func (a *AliyunOSS) PutObjectCannedAcl(ctx context.Context, req *file.PutObjectC return output, err } func (a *AliyunOSS) ListObjects(ctx context.Context, req *file.ListObjectsInput) (*file.ListObjectsOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -299,7 +299,7 @@ func (a *AliyunOSS) ListObjects(ctx context.Context, req *file.ListObjectsInput) return out, nil } func (a *AliyunOSS) CopyObject(ctx context.Context, req *file.CopyObjectInput) (*file.CopyObjectOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -323,7 +323,7 @@ func (a *AliyunOSS) CopyObject(ctx context.Context, req *file.CopyObjectInput) ( } func (a *AliyunOSS) CreateMultipartUpload(ctx context.Context, req *file.CreateMultipartUploadInput) (*file.CreateMultipartUploadOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -336,7 +336,7 @@ func (a *AliyunOSS) CreateMultipartUpload(ctx context.Context, req *file.CreateM return output, err } func (a *AliyunOSS) UploadPart(ctx context.Context, req *file.UploadPartInput) (*file.UploadPartOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -353,7 +353,7 @@ func (a *AliyunOSS) UploadPart(ctx context.Context, req *file.UploadPartInput) ( return output, err } func (a *AliyunOSS) UploadPartCopy(ctx context.Context, req *file.UploadPartCopyInput) (*file.UploadPartCopyOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -374,7 +374,7 @@ func (a *AliyunOSS) UploadPartCopy(ctx context.Context, req *file.UploadPartCopy return output, err } func (a *AliyunOSS) CompleteMultipartUpload(ctx context.Context, req *file.CompleteMultipartUploadInput) (*file.CompleteMultipartUploadOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -398,7 +398,7 @@ func (a *AliyunOSS) CompleteMultipartUpload(ctx context.Context, req *file.Compl return output, err } func (a *AliyunOSS) AbortMultipartUpload(ctx context.Context, req *file.AbortMultipartUploadInput) (*file.AbortMultipartUploadOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -414,7 +414,7 @@ func (a *AliyunOSS) AbortMultipartUpload(ctx context.Context, req *file.AbortMul return output, err } func (a *AliyunOSS) ListMultipartUploads(ctx context.Context, req *file.ListMultipartUploadsInput) (*file.ListMultipartUploadsOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -443,7 +443,7 @@ func (a *AliyunOSS) ListMultipartUploads(ctx context.Context, req *file.ListMult } func (a *AliyunOSS) RestoreObject(ctx context.Context, req *file.RestoreObjectInput) (*file.RestoreObjectOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -457,7 +457,7 @@ func (a *AliyunOSS) RestoreObject(ctx context.Context, req *file.RestoreObjectIn } func (a *AliyunOSS) ListObjectVersions(ctx context.Context, req *file.ListObjectVersionsInput) (*file.ListObjectVersionsOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -513,7 +513,7 @@ func (a *AliyunOSS) ListObjectVersions(ctx context.Context, req *file.ListObject } func (a *AliyunOSS) HeadObject(ctx context.Context, req *file.HeadObjectInput) (*file.HeadObjectOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -545,7 +545,7 @@ func (a *AliyunOSS) HeadObject(ctx context.Context, req *file.HeadObjectInput) ( } func (a *AliyunOSS) IsObjectExist(ctx context.Context, req *file.IsObjectExistInput) (*file.IsObjectExistOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -558,7 +558,7 @@ func (a *AliyunOSS) IsObjectExist(ctx context.Context, req *file.IsObjectExistIn } func (a *AliyunOSS) SignURL(ctx context.Context, req *file.SignURLInput) (*file.SignURLOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -589,7 +589,7 @@ func (a *AliyunOSS) UpdateUpLoadBandwidthRateLimit(ctx context.Context, req *fil } func (a *AliyunOSS) AppendObject(ctx context.Context, req *file.AppendObjectInput) (*file.AppendObjectOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -612,7 +612,7 @@ func (a *AliyunOSS) AppendObject(ctx context.Context, req *file.AppendObjectInpu } func (a *AliyunOSS) ListParts(ctx context.Context, req *file.ListPartsInput) (*file.ListPartsOutput, error) { - cli, err := a.selectClient(req.Bucket) + cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } diff --git a/components/file/aliyun/oss_test.go b/components/file/aliyun/oss_test.go index b0e2f19c5a..c6eaef24a3 100644 --- a/components/file/aliyun/oss_test.go +++ b/components/file/aliyun/oss_test.go @@ -102,11 +102,21 @@ func TestInitAliyunOss(t *testing.T) { func TestAliyunOss(t *testing.T) { instance := NewAliyunOss() - err := instance.InitConfig(context.TODO(), &file.FileConfig{Method: "", Metadata: []byte(confWithoutUidAndBucket)}) + err := instance.InitConfig(context.TODO(), &file.FileConfig{Method: "", Metadata: []byte(confWithUidAndBucket)}) assert.Nil(t, err) err = instance.InitClient(context.TODO(), &file.InitRequest{}) assert.Nil(t, err) + aliyun := instance.(*AliyunOSS) + clientUid, _ := aliyun.selectClient("123", "") + assert.Equal(t, clientUid, aliyun.client["123"]) + + clientBucket1, _ := aliyun.selectClient("123", "bucket1") + assert.Equal(t, clientBucket1, aliyun.client["bucket1"]) + + clientBucket2, _ := aliyun.selectClient("123", "bucket2") + assert.Equal(t, clientBucket2, aliyun.client["bucket2"]) + appendObjectResp, err := instance.AppendObject(context.TODO(), &file.AppendObjectInput{}) assert.NotNil(t, err) assert.Nil(t, appendObjectResp) diff --git a/components/file/aws/file.go b/components/file/aws/file.go index 4c325e3679..872a6c3207 100644 --- a/components/file/aws/file.go +++ b/components/file/aws/file.go @@ -68,6 +68,7 @@ func (a *AwsOss) Init(ctx context.Context, config *file.FileConfig) error { if err != nil { continue } + a.client[data.Uid] = client //use bucket as key, client as value for _, bucketName := range data.Buckets { if _, ok := a.client[bucketName]; ok { @@ -131,7 +132,7 @@ func (a *AwsOss) Put(ctx context.Context, st *file.PutFileStu) error { if err != nil { return fmt.Errorf("awsoss put file[%s] fail,err: %s", st.FileName, err.Error()) } - client, err := a.selectClient(bucket) + client, err := a.selectClient("", bucket) if err != nil { return err } @@ -149,11 +150,18 @@ func (a *AwsOss) Put(ctx context.Context, st *file.PutFileStu) error { } // selectClient choose aws client from exist client-map, key is endpoint, value is client instance. -func (a *AwsOss) selectClient(bucket string) (*s3.Client, error) { +func (a *AwsOss) selectClient(uid, bucket string) (*s3.Client, error) { + // 1. if user specify client uid, use specify client first + if uid != "" { + if client, ok := a.client[uid]; ok { + return client, nil + } + } + // 2. if user not specify client uid, use bucket to select client if client, ok := a.client[bucket]; ok { return client, nil } - // if not specify endpoint, select default one + // 3.if not specify uid and bucket, select default one if len(a.client) == 1 { for _, client := range a.client { return client, nil @@ -176,7 +184,7 @@ func (a *AwsOss) Get(ctx context.Context, st *file.GetFileStu) (io.ReadCloser, e Bucket: &bucket, Key: &key, } - client, err := a.selectClient(bucket) + client, err := a.selectClient("", bucket) if err != nil { return nil, err } @@ -200,7 +208,7 @@ func (a *AwsOss) List(ctx context.Context, st *file.ListRequest) (*file.ListResp Marker: &st.Marker, Prefix: &prefix, } - client, err := a.selectClient(bucket) + client, err := a.selectClient("", bucket) if err != nil { return nil, fmt.Errorf("list bucket[%s] fail, err: %s", st.DirectoryName, err.Error()) } @@ -237,7 +245,7 @@ func (a *AwsOss) Del(ctx context.Context, st *file.DelRequest) error { Bucket: &bucket, Key: &key, } - client, err := a.selectClient(bucket) + client, err := a.selectClient("", bucket) if err != nil { return err } @@ -260,7 +268,7 @@ func (a *AwsOss) Stat(ctx context.Context, st *file.FileMetaRequest) (*file.File Bucket: &bucket, Key: &key, } - client, err := a.selectClient(bucket) + client, err := a.selectClient("", bucket) if err != nil { return nil, err } diff --git a/components/file/aws/file_test.go b/components/file/aws/file_test.go index d6828eb907..a3d2094764 100644 --- a/components/file/aws/file_test.go +++ b/components/file/aws/file_test.go @@ -40,6 +40,17 @@ const cfg = `[ } ]` +const cfgwithuid = `[ + { + "uid": "1", + "buckets":["bucket3"], + "endpoint": "protocol://service-code.region-code.amazonaws.com", + "accessKeyID": "accessKey", + "accessKeySecret": "secret", + "region": "us-west-2" + } + ]` + func TestAwsOss_Init(t *testing.T) { oss := NewAwsFile() err := oss.Init(context.TODO(), &file.FileConfig{}) @@ -57,20 +68,28 @@ func TestAwsOss_SelectClient(t *testing.T) { assert.Equal(t, nil, err) // not specify endpoint, select default client - _, err = oss.selectClient("bucket1") + _, err = oss.selectClient("", "bucket1") assert.Nil(t, err) // specify endpoint equal config - client, _ := oss.selectClient("bucket1") + client, _ := oss.selectClient("", "bucket1") assert.NotNil(t, client) // specicy not exist endpoint, select default one - client, err = oss.selectClient("bucket1") + client, err = oss.selectClient("", "bucket1") assert.Nil(t, err) assert.NotNil(t, client) // new client with endpoint oss.client["bucket2"] = &s3.Client{} - client, _ = oss.selectClient("bucket2") + client, _ = oss.selectClient("", "bucket2") + assert.NotNil(t, client) + + err = oss.Init(context.TODO(), &file.FileConfig{Metadata: []byte(cfgwithuid)}) + assert.Equal(t, nil, err) + + // specify uid + client, _ = oss.selectClient("1", "bucket1") + assert.Equal(t, client, oss.client["1"]) assert.NotNil(t, client) } diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index ad4b923a7e..42896ed5df 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -110,7 +110,7 @@ func (a *AwsOss) InitClient(ctx context.Context, req *file.InitRequest) error { func (a *AwsOss) GetObject(ctx context.Context, req *file.GetObjectInput) (*file.GetObjectOutput, error) { input := &s3.GetObjectInput{} - client, err := a.selectClient(req.Bucket) + client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -132,7 +132,7 @@ func (a *AwsOss) GetObject(ctx context.Context, req *file.GetObjectInput) (*file } func (a *AwsOss) PutObject(ctx context.Context, req *file.PutObjectInput) (*file.PutObjectOutput, error) { - client, err := a.selectClient(req.Bucket) + client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -160,7 +160,7 @@ func (a *AwsOss) DeleteObject(ctx context.Context, req *file.DeleteObjectInput) Bucket: &req.Bucket, Key: &req.Key, } - client, err := a.selectClient(req.Bucket) + client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -172,7 +172,7 @@ func (a *AwsOss) DeleteObject(ctx context.Context, req *file.DeleteObjectInput) } func (a *AwsOss) PutObjectTagging(ctx context.Context, req *file.PutObjectTaggingInput) (*file.PutObjectTaggingOutput, error) { - client, err := a.selectClient(req.Bucket) + client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -189,7 +189,7 @@ func (a *AwsOss) PutObjectTagging(ctx context.Context, req *file.PutObjectTaggin return &file.PutObjectTaggingOutput{}, err } func (a *AwsOss) DeleteObjectTagging(ctx context.Context, req *file.DeleteObjectTaggingInput) (*file.DeleteObjectTaggingOutput, error) { - client, err := a.selectClient(req.Bucket) + client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -206,7 +206,7 @@ func (a *AwsOss) DeleteObjectTagging(ctx context.Context, req *file.DeleteObject } func (a *AwsOss) GetObjectTagging(ctx context.Context, req *file.GetObjectTaggingInput) (*file.GetObjectTaggingOutput, error) { - client, err := a.selectClient(req.Bucket) + client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -228,7 +228,7 @@ func (a *AwsOss) GetObjectTagging(ctx context.Context, req *file.GetObjectTaggin } func (a *AwsOss) CopyObject(ctx context.Context, req *file.CopyObjectInput) (*file.CopyObjectOutput, error) { - client, err := a.selectClient(req.Bucket) + client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -255,7 +255,7 @@ func (a *AwsOss) CopyObject(ctx context.Context, req *file.CopyObjectInput) (*fi return &file.CopyObjectOutput{CopyObjectResult: &file.CopyObjectResult{ETag: *resp.CopyObjectResult.ETag, LastModified: resp.CopyObjectResult.LastModified.Unix()}}, err } func (a *AwsOss) DeleteObjects(ctx context.Context, req *file.DeleteObjectsInput) (*file.DeleteObjectsOutput, error) { - client, err := a.selectClient(req.Bucket) + client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -282,7 +282,7 @@ func (a *AwsOss) DeleteObjects(ctx context.Context, req *file.DeleteObjectsInput return output, err } func (a *AwsOss) ListObjects(ctx context.Context, req *file.ListObjectsInput) (*file.ListObjectsOutput, error) { - client, err := a.selectClient(req.Bucket) + client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -332,7 +332,7 @@ func (a *AwsOss) GetObjectCannedAcl(ctx context.Context, req *file.GetObjectCann return nil, errors.New("GetObjectCannedAcl method not supported on AWS") } func (a *AwsOss) PutObjectCannedAcl(ctx context.Context, req *file.PutObjectCannedAclInput) (*file.PutObjectCannedAclOutput, error) { - client, err := a.selectClient(req.Bucket) + client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -348,7 +348,7 @@ func (a *AwsOss) PutObjectCannedAcl(ctx context.Context, req *file.PutObjectCann return &file.PutObjectCannedAclOutput{RequestCharged: string(resp.RequestCharged)}, err } func (a *AwsOss) RestoreObject(ctx context.Context, req *file.RestoreObjectInput) (*file.RestoreObjectOutput, error) { - client, err := a.selectClient(req.Bucket) + client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -363,7 +363,7 @@ func (a *AwsOss) RestoreObject(ctx context.Context, req *file.RestoreObjectInput return &file.RestoreObjectOutput{RequestCharged: string(resp.RequestCharged), RestoreOutputPath: *resp.RestoreOutputPath}, err } func (a *AwsOss) CreateMultipartUpload(ctx context.Context, req *file.CreateMultipartUploadInput) (*file.CreateMultipartUploadOutput, error) { - client, err := a.selectClient(req.Bucket) + client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -398,7 +398,7 @@ func (a *AwsOss) CreateMultipartUpload(ctx context.Context, req *file.CreateMult return output, err } func (a *AwsOss) UploadPart(ctx context.Context, req *file.UploadPartInput) (*file.UploadPartOutput, error) { - client, err := a.selectClient(req.Bucket) + client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -426,7 +426,7 @@ func (a *AwsOss) UploadPart(ctx context.Context, req *file.UploadPartInput) (*fi return output, err } func (a *AwsOss) UploadPartCopy(ctx context.Context, req *file.UploadPartCopyInput) (*file.UploadPartCopyOutput, error) { - client, err := a.selectClient(req.Bucket) + client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -451,7 +451,7 @@ func (a *AwsOss) UploadPartCopy(ctx context.Context, req *file.UploadPartCopyInp return output, err } func (a *AwsOss) CompleteMultipartUpload(ctx context.Context, req *file.CompleteMultipartUploadInput) (*file.CompleteMultipartUploadOutput, error) { - client, err := a.selectClient(req.Bucket) + client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -477,7 +477,7 @@ func (a *AwsOss) CompleteMultipartUpload(ctx context.Context, req *file.Complete return output, err } func (a *AwsOss) AbortMultipartUpload(ctx context.Context, req *file.AbortMultipartUploadInput) (*file.AbortMultipartUploadOutput, error) { - client, err := a.selectClient(req.Bucket) + client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -496,7 +496,7 @@ func (a *AwsOss) AbortMultipartUpload(ctx context.Context, req *file.AbortMultip return output, err } func (a *AwsOss) ListMultipartUploads(ctx context.Context, req *file.ListMultipartUploadsInput) (*file.ListMultipartUploadsOutput, error) { - client, err := a.selectClient(req.Bucket) + client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -533,7 +533,7 @@ func (a *AwsOss) ListMultipartUploads(ctx context.Context, req *file.ListMultipa return output, err } func (a *AwsOss) ListObjectVersions(ctx context.Context, req *file.ListObjectVersionsInput) (*file.ListObjectVersionsOutput, error) { - client, err := a.selectClient(req.Bucket) + client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -581,7 +581,7 @@ func (a *AwsOss) ListObjectVersions(ctx context.Context, req *file.ListObjectVer } func (a *AwsOss) HeadObject(ctx context.Context, req *file.HeadObjectInput) (*file.HeadObjectOutput, error) { - client, err := a.selectClient(req.Bucket) + client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -598,7 +598,7 @@ func (a *AwsOss) HeadObject(ctx context.Context, req *file.HeadObjectInput) (*fi } func (a *AwsOss) IsObjectExist(ctx context.Context, req *file.IsObjectExistInput) (*file.IsObjectExistOutput, error) { - client, err := a.selectClient(req.Bucket) + client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } @@ -615,7 +615,7 @@ func (a *AwsOss) IsObjectExist(ctx context.Context, req *file.IsObjectExistInput } func (a *AwsOss) SignURL(ctx context.Context, req *file.SignURLInput) (*file.SignURLOutput, error) { - client, err := a.selectClient(req.Bucket) + client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err } diff --git a/components/file/oss.go b/components/file/oss.go index dab3ff3bf7..b6cc267fc7 100644 --- a/components/file/oss.go +++ b/components/file/oss.go @@ -1,17 +1,17 @@ /* - * 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. +* 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 file @@ -65,54 +65,56 @@ type InitRequest struct { } type GetObjectInput struct { - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,3,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - IfMatch string `protobuf:"bytes,4,opt,name=if_match,json=ifMatch,proto3" json:"if_match,omitempty"` - IfModifiedSince int64 `protobuf:"varint,5,opt,name=if_modified_since,json=ifModifiedSince,proto3" json:"if_modified_since,omitempty"` - IfNoneMatch string `protobuf:"bytes,6,opt,name=if_none_match,json=ifNoneMatch,proto3" json:"if_none_match,omitempty"` - IfUnmodifiedSince int64 `protobuf:"varint,7,opt,name=if_unmodified_since,json=ifUnmodifiedSince,proto3" json:"if_unmodified_since,omitempty"` - Key string `protobuf:"bytes,8,opt,name=key,proto3" json:"key,omitempty"` - PartNumber int64 `protobuf:"varint,9,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` - Start int64 `protobuf:"varint,10,opt,name=start,proto3" json:"start,omitempty"` - End int64 `protobuf:"varint,11,opt,name=end,proto3" json:"end,omitempty"` - RequestPayer string `protobuf:"bytes,12,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - ResponseCacheControl string `protobuf:"bytes,13,opt,name=response_cache_control,json=responseCacheControl,proto3" json:"response_cache_control,omitempty"` - ResponseContentDisposition string `protobuf:"bytes,14,opt,name=response_content_disposition,json=responseContentDisposition,proto3" json:"response_content_disposition,omitempty"` - ResponseContentEncoding string `protobuf:"bytes,15,opt,name=response_content_encoding,json=responseContentEncoding,proto3" json:"response_content_encoding,omitempty"` - ResponseContentLanguage string `protobuf:"bytes,16,opt,name=response_content_language,json=responseContentLanguage,proto3" json:"response_content_language,omitempty"` - ResponseContentType string `protobuf:"bytes,17,opt,name=response_content_type,json=responseContentType,proto3" json:"response_content_type,omitempty"` - ResponseExpires string `protobuf:"bytes,18,opt,name=response_expires,json=responseExpires,proto3" json:"response_expires,omitempty"` - SseCustomerAlgorithm string `protobuf:"bytes,19,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - SseCustomerKey string `protobuf:"bytes,20,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` - SseCustomerKeyMd5 string `protobuf:"bytes,21,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - VersionId string `protobuf:"bytes,22,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` - AcceptEncoding string `protobuf:"bytes,23,opt,name=accept_encoding,json=acceptEncoding,proto3" json:"accept_encoding,omitempty"` - SignedUrl string `protobuf:"bytes,24,opt,name=signed_url,json=signedUrl,proto3" json:"signed_url,omitempty"` + Uid string `json:"uid,omitempty"` + Bucket string `json:"bucket,omitempty"` + ExpectedBucketOwner string `json:"expected_bucket_owner,omitempty"` + IfMatch string `json:"if_match,omitempty"` + IfModifiedSince int64 `json:"if_modified_since,omitempty"` + IfNoneMatch string `json:"if_none_match,omitempty"` + IfUnmodifiedSince int64 `json:"if_unmodified_since,omitempty"` + Key string `json:"key,omitempty"` + PartNumber int64 `json:"part_number,omitempty"` + Start int64 `json:"start,omitempty"` + End int64 `json:"end,omitempty"` + RequestPayer string `json:"request_payer,omitempty"` + ResponseCacheControl string `json:"response_cache_control,omitempty"` + ResponseContentDisposition string `json:"response_content_disposition,omitempty"` + ResponseContentEncoding string `json:"response_content_encoding,omitempty"` + ResponseContentLanguage string `json:"response_content_language,omitempty"` + ResponseContentType string `json:"response_content_type,omitempty"` + ResponseExpires string `json:"response_expires,omitempty"` + SseCustomerAlgorithm string `json:"sse_customer_algorithm,omitempty"` + SseCustomerKey string `json:"sse_customer_key,omitempty"` + SseCustomerKeyMd5 string `json:"sse_customer_key_md5,omitempty"` + VersionId string `json:"version_id,omitempty"` + AcceptEncoding string `json:"accept_encoding,omitempty"` + SignedUrl string `json:"signed_url,omitempty"` } type GetObjectOutput struct { DataStream io.ReadCloser - CacheControl string `protobuf:"bytes,2,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` - ContentDisposition string `protobuf:"bytes,3,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` - ContentEncoding string `protobuf:"bytes,4,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` - ContentLanguage string `protobuf:"bytes,5,opt,name=content_language,json=contentLanguage,proto3" json:"content_language,omitempty"` - ContentLength int64 `protobuf:"varint,6,opt,name=content_length,json=contentLength,proto3" json:"content_length,omitempty"` - ContentRange string `protobuf:"bytes,7,opt,name=content_range,json=contentRange,proto3" json:"content_range,omitempty"` - ContentType string `protobuf:"bytes,8,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` - DeleteMarker bool `protobuf:"varint,9,opt,name=delete_marker,json=deleteMarker,proto3" json:"delete_marker,omitempty"` - Etag string `protobuf:"bytes,10,opt,name=etag,proto3" json:"etag,omitempty"` - Expiration string `protobuf:"bytes,11,opt,name=expiration,proto3" json:"expiration,omitempty"` - Expires string `protobuf:"bytes,12,opt,name=expires,proto3" json:"expires,omitempty"` - LastModified int64 `protobuf:"varint,13,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` - VersionId string `protobuf:"bytes,14,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` - TagCount int64 `protobuf:"varint,15,opt,name=tag_count,json=tagCount,proto3" json:"tag_count,omitempty"` - StorageClass string `protobuf:"bytes,16,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` - PartsCount int64 `protobuf:"varint,17,opt,name=parts_count,json=partsCount,proto3" json:"parts_count,omitempty"` - Metadata map[string]string `protobuf:"bytes,18,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + CacheControl string `json:"cache_control,omitempty"` + ContentDisposition string `json:"content_disposition,omitempty"` + ContentEncoding string `json:"content_encoding,omitempty"` + ContentLanguage string `json:"content_language,omitempty"` + ContentLength int64 `json:"content_length,omitempty"` + ContentRange string `json:"content_range,omitempty"` + ContentType string `json:"content_type,omitempty"` + DeleteMarker bool `json:"delete_marker,omitempty"` + Etag string `json:"etag,omitempty"` + Expiration string `json:"expiration,omitempty"` + Expires string `json:"expires,omitempty"` + LastModified int64 `json:"last_modified,omitempty"` + VersionId string `json:"version_id,omitempty"` + TagCount int64 `json:"tag_count,omitempty"` + StorageClass string `json:"storage_class,omitempty"` + PartsCount int64 `json:"parts_count,omitempty"` + Metadata map[string]string `json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } type PutObjectInput struct { DataStream io.Reader + Uid string `json:"uid,omitempty"` ACL string `json:"acl,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` @@ -127,42 +129,46 @@ type PutObjectInput struct { } type PutObjectOutput struct { - BucketKeyEnabled bool `protobuf:"varint,1,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - ETag string `protobuf:"bytes,2,opt,name=etag,proto3" json:"etag,omitempty"` + BucketKeyEnabled bool `json:"bucket_key_enabled,omitempty"` + ETag string `json:"etag,omitempty"` } type DeleteObjectInput struct { + Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` RequestPayer string `json:"request_payer,omitempty"` VersionId string `json:"version_id,omitempty"` } type DeleteObjectOutput struct { - DeleteMarker bool `protobuf:"varint,1,opt,name=delete_marker,json=deleteMarker,proto3" json:"delete_marker,omitempty"` - RequestCharged string `protobuf:"bytes,2,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` - VersionId string `protobuf:"bytes,3,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + DeleteMarker bool `json:"delete_marker,omitempty"` + RequestCharged string `json:"request_charged,omitempty"` + VersionId string `json:"version_id,omitempty"` } type PutObjectTaggingInput struct { - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - Tags map[string]string `protobuf:"bytes,4,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - VersionId string `protobuf:"bytes,5,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + Uid string `json:"uid,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` + Tags map[string]string `json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + VersionId string `json:"version_id,omitempty"` } type PutObjectTaggingOutput struct { } type DeleteObjectTaggingInput struct { + Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` VersionId string `json:"version_id,omitempty"` ExpectedBucketOwner string `json:"expected_bucket_owner,omitempty"` } type DeleteObjectTaggingOutput struct { - VersionId string `protobuf:"bytes,1,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + VersionId string `json:"version_id,omitempty"` } type GetObjectTaggingInput struct { + Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` VersionId string ` json:"version_id,omitempty"` @@ -176,15 +182,16 @@ type GetObjectTaggingOutput struct { } type CopySource struct { - CopySourceBucket string `protobuf:"bytes,1,opt,name=copy_source_bucket,json=copySourceBucket,proto3" json:"copy_source_bucket,omitempty"` - CopySourceKey string `protobuf:"bytes,2,opt,name=copy_source_key,json=copySourceKey,proto3" json:"copy_source_key,omitempty"` - CopySourceVersionId string `protobuf:"bytes,3,opt,name=copy_source_version_id,json=copySourceVersionId,proto3" json:"copy_source_version_id,omitempty"` + CopySourceBucket string `json:"copy_source_bucket,omitempty"` + CopySourceKey string `json:"copy_source_key,omitempty"` + CopySourceVersionId string `json:"copy_source_version_id,omitempty"` } type CopyObjectInput struct { - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - CopySource *CopySource `protobuf:"bytes,4,opt,name=copy_source,json=copySource,proto3" json:"copy_source,omitempty"` + Uid string `json:"uid,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` + CopySource *CopySource `json:"copy_source,omitempty"` Tagging string `json:"tagging,omitempty"` Expires int64 `json:"expires,omitempty"` // Specifies whether the metadata is copied from the source object or replaced with metadata provided in the request. @@ -196,70 +203,73 @@ type CopyObjectOutput struct { CopyObjectResult *CopyObjectResult `json:"copy_object_result,omitempty"` } type CopyObjectResult struct { - ETag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` - LastModified int64 `protobuf:"varint,2,opt,name=LastModified,proto3" json:"LastModified,omitempty"` + ETag string `json:"etag,omitempty"` + LastModified int64 `json:"LastModified,omitempty"` } type DeleteObjectsInput struct { + Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Delete *Delete `json:"delete,omitempty"` } type Delete struct { - Objects []*ObjectIdentifier `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` - Quiet bool `protobuf:"varint,2,opt,name=quiet,proto3" json:"quiet,omitempty"` + Objects []*ObjectIdentifier `json:"objects,omitempty"` + Quiet bool `json:"quiet,omitempty"` } type ObjectIdentifier struct { - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - VersionId string `protobuf:"bytes,2,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + Key string `json:"key,omitempty"` + VersionId string `json:"version_id,omitempty"` } type DeleteObjectsOutput struct { - Deleted []*DeletedObject `protobuf:"bytes,1,rep,name=deleted,proto3" json:"deleted,omitempty"` + Deleted []*DeletedObject `json:"deleted,omitempty"` } type DeletedObject struct { - DeleteMarker bool `protobuf:"varint,1,opt,name=delete_marker,json=deleteMarker,proto3" json:"delete_marker,omitempty"` - DeleteMarkerVersionId string `protobuf:"bytes,2,opt,name=delete_marker_version_id,json=deleteMarkerVersionId,proto3" json:"delete_marker_version_id,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - VersionId string `protobuf:"bytes,4,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + DeleteMarker bool `json:"delete_marker,omitempty"` + DeleteMarkerVersionId string `json:"delete_marker_version_id,omitempty"` + Key string `json:"key,omitempty"` + VersionId string `json:"version_id,omitempty"` } type ListObjectsInput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Delimiter string `protobuf:"bytes,2,opt,name=delimiter,proto3" json:"delimiter,omitempty"` - EncodingType string `protobuf:"bytes,3,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,4,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - Marker string `protobuf:"bytes,5,opt,name=marker,proto3" json:"marker,omitempty"` - MaxKeys int32 `protobuf:"varint,6,opt,name=maxKeys,proto3" json:"maxKeys,omitempty"` - Prefix string `protobuf:"bytes,7,opt,name=prefix,proto3" json:"prefix,omitempty"` - RequestPayer string `protobuf:"bytes,8,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + Uid string `json:"uid,omitempty"` + Bucket string `json:"bucket,omitempty"` + Delimiter string `json:"delimiter,omitempty"` + EncodingType string `json:"encoding_type,omitempty"` + ExpectedBucketOwner string `json:"expected_bucket_owner,omitempty"` + Marker string `json:"marker,omitempty"` + MaxKeys int32 `json:"maxKeys,omitempty"` + Prefix string `json:"prefix,omitempty"` + RequestPayer string `json:"request_payer,omitempty"` } type ListObjectsOutput struct { - CommonPrefixes []string `protobuf:"bytes,1,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` - Contents []*Object `protobuf:"bytes,2,rep,name=contents,proto3" json:"contents,omitempty"` - Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` - EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` - IsTruncated bool `protobuf:"varint,5,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` - Marker string `protobuf:"bytes,6,opt,name=marker,proto3" json:"marker,omitempty"` - MaxKeys int32 `protobuf:"varint,7,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` - Name string `protobuf:"bytes,8,opt,name=name,proto3" json:"name,omitempty"` - NextMarker string `protobuf:"bytes,9,opt,name=next_marker,json=nextMarker,proto3" json:"next_marker,omitempty"` - Prefix string `protobuf:"bytes,10,opt,name=prefix,proto3" json:"prefix,omitempty"` + CommonPrefixes []string `json:"common_prefixes,omitempty"` + Contents []*Object `json:"contents,omitempty"` + Delimiter string `json:"delimiter,omitempty"` + EncodingType string `json:"encoding_type,omitempty"` + IsTruncated bool `json:"is_truncated,omitempty"` + Marker string `json:"marker,omitempty"` + MaxKeys int32 `json:"max_keys,omitempty"` + Name string `json:"name,omitempty"` + NextMarker string `json:"next_marker,omitempty"` + Prefix string `json:"prefix,omitempty"` } type Object struct { - ETag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - LastModified int64 `protobuf:"bytes,3,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` - Owner *Owner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` - Size int64 `protobuf:"varint,5,opt,name=size,proto3" json:"size,omitempty"` - StorageClass string `protobuf:"bytes,6,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` + ETag string `json:"etag,omitempty"` + Key string `json:"key,omitempty"` + LastModified int64 `json:"last_modified,omitempty"` + Owner *Owner `json:"owner,omitempty"` + Size int64 `json:"size,omitempty"` + StorageClass string `json:"storage_class,omitempty"` } type Owner struct { - DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - ID string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + DisplayName string `json:"display_name,omitempty"` + ID string `json:"id,omitempty"` } type GetObjectCannedAclInput struct { + Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` VersionId string `json:"version_id,omitempty"` @@ -271,97 +281,102 @@ type GetObjectCannedAclOutput struct { } type PutObjectCannedAclInput struct { + Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` Acl string `json:"acl,omitempty"` VersionId string `json:"version_id,omitempty"` } type PutObjectCannedAclOutput struct { - RequestCharged string `protobuf:"bytes,1,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + RequestCharged string `json:"request_charged,omitempty"` } type RestoreObjectInput struct { + Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` VersionId string `json:"version_id,omitempty"` } type RestoreObjectOutput struct { - RequestCharged string `protobuf:"bytes,1,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` - RestoreOutputPath string `protobuf:"bytes,2,opt,name=restore_output_path,json=restoreOutputPath,proto3" json:"restore_output_path,omitempty"` + RequestCharged string `json:"request_charged,omitempty"` + RestoreOutputPath string `json:"restore_output_path,omitempty"` } type CreateMultipartUploadInput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - ACL string `protobuf:"bytes,3,opt,name=acl,proto3" json:"acl,omitempty"` - BucketKeyEnabled bool `protobuf:"varint,4,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - CacheControl string `protobuf:"bytes,5,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` - ContentDisposition string `protobuf:"bytes,6,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` - ContentEncoding string `protobuf:"bytes,7,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` - ContentLanguage string `protobuf:"bytes,8,opt,name=content_language,json=contentLanguage,proto3" json:"content_language,omitempty"` - ContentType string `protobuf:"bytes,9,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,10,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - Expires int64 `protobuf:"bytes,11,opt,name=expires,proto3" json:"expires,omitempty"` - GrantFullControl string `protobuf:"bytes,12,opt,name=grant_full_control,json=grantFullControl,proto3" json:"grant_full_control,omitempty"` - GrantRead string `protobuf:"bytes,13,opt,name=grant_read,json=grantRead,proto3" json:"grant_read,omitempty"` - GrantReadACP string `protobuf:"bytes,14,opt,name=grant_read_acp,json=grantReadAcp,proto3" json:"grant_read_acp,omitempty"` - GrantWriteACP string `protobuf:"bytes,15,opt,name=grant_write_acp,json=grantWriteAcp,proto3" json:"grant_write_acp,omitempty"` - MetaData map[string]string `protobuf:"bytes,16,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"` - ObjectLockLegalHoldStatus string `protobuf:"bytes,17,opt,name=object_lock_legal_hold_status,json=objectLockLegalHoldStatus,proto3" json:"object_lock_legal_hold_status,omitempty"` - ObjectLockMode string `protobuf:"bytes,18,opt,name=object_lock_mode,json=objectLockMode,proto3" json:"object_lock_mode,omitempty"` - ObjectLockRetainUntilDate int64 `protobuf:"bytes,19,opt,name=object_lock_retain_until_date,json=objectLockRetainUntilDate,proto3" json:"object_lock_retain_until_date,omitempty"` - RequestPayer string `protobuf:"bytes,20,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - SSECustomerAlgorithm string `protobuf:"bytes,21,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - SSECustomerKey string `protobuf:"bytes,22,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` - SSECustomerKeyMD5 string `protobuf:"bytes,23,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - SSEKMSEncryptionContext string `protobuf:"bytes,24,opt,name=sse_kms_encryption_context,json=sseKmsEncryptionContext,proto3" json:"sse_kms_encryption_context,omitempty"` - SSEKMSKeyId string `protobuf:"bytes,25,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` - ServerSideEncryption string `protobuf:"bytes,26,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` - StorageClass string `protobuf:"bytes,27,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` - Tagging string `protobuf:"bytes,28,opt,name=tagging,proto3" json:"tagging,omitempty"` - WebsiteRedirectLocation string `protobuf:"bytes,29,opt,name=website_redirect_location,json=websiteRedirectLocation,proto3" json:"website_redirect_location,omitempty"` + Uid string `json:"uid,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` + ACL string `json:"acl,omitempty"` + BucketKeyEnabled bool `json:"bucket_key_enabled,omitempty"` + CacheControl string `json:"cache_control,omitempty"` + ContentDisposition string `json:"content_disposition,omitempty"` + ContentEncoding string `json:"content_encoding,omitempty"` + ContentLanguage string `json:"content_language,omitempty"` + ContentType string `json:"content_type,omitempty"` + ExpectedBucketOwner string `json:"expected_bucket_owner,omitempty"` + Expires int64 `json:"expires,omitempty"` + GrantFullControl string `json:"grant_full_control,omitempty"` + GrantRead string `json:"grant_read,omitempty"` + GrantReadACP string `json:"grant_read_acp,omitempty"` + GrantWriteACP string `json:"grant_write_acp,omitempty"` + MetaData map[string]string `json:"meta_data,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ObjectLockLegalHoldStatus string `json:"object_lock_legal_hold_status,omitempty"` + ObjectLockMode string `json:"object_lock_mode,omitempty"` + ObjectLockRetainUntilDate int64 `json:"object_lock_retain_until_date,omitempty"` + RequestPayer string `json:"request_payer,omitempty"` + SSECustomerAlgorithm string `json:"sse_customer_algorithm,omitempty"` + SSECustomerKey string `json:"sse_customer_key,omitempty"` + SSECustomerKeyMD5 string `json:"sse_customer_key_md5,omitempty"` + SSEKMSEncryptionContext string `json:"sse_kms_encryption_context,omitempty"` + SSEKMSKeyId string `json:"sse_kms_key_id,omitempty"` + ServerSideEncryption string `json:"server_side_encryption,omitempty"` + StorageClass string `json:"storage_class,omitempty"` + Tagging string `json:"tagging,omitempty"` + WebsiteRedirectLocation string `json:"website_redirect_location,omitempty"` } type CreateMultipartUploadOutput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - AbortDate int64 `protobuf:"bytes,3,opt,name=abort_date,json=abortDate,proto3" json:"abort_date,omitempty"` - AbortRuleId string `protobuf:"bytes,4,opt,name=abort_rule_id,json=abortRuleId,proto3" json:"abort_rule_id,omitempty"` - BucketKeyEnabled bool `protobuf:"varint,5,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - RequestCharged string `protobuf:"bytes,6,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` - SSECustomerAlgorithm string `protobuf:"bytes,7,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - SSECustomerKeyMD5 string `protobuf:"bytes,8,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - SSEKMSEncryptionContext string `protobuf:"bytes,9,opt,name=sse_kms_encryption_context,json=sseKmsEncryptionContext,proto3" json:"sse_kms_encryption_context,omitempty"` - SSEKMSKeyId string `protobuf:"bytes,10,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` - ServerSideEncryption string `protobuf:"bytes,11,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` - UploadId string `protobuf:"bytes,12,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` + AbortDate int64 `json:"abort_date,omitempty"` + AbortRuleId string `json:"abort_rule_id,omitempty"` + BucketKeyEnabled bool `json:"bucket_key_enabled,omitempty"` + RequestCharged string `json:"request_charged,omitempty"` + SSECustomerAlgorithm string `json:"sse_customer_algorithm,omitempty"` + SSECustomerKeyMD5 string `json:"sse_customer_key_md5,omitempty"` + SSEKMSEncryptionContext string `json:"sse_kms_encryption_context,omitempty"` + SSEKMSKeyId string `json:"sse_kms_key_id,omitempty"` + ServerSideEncryption string `json:"server_side_encryption,omitempty"` + UploadId string `json:"upload_id,omitempty"` } type UploadPartInput struct { DataStream io.Reader - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - //Body []byte `protobuf:"bytes,3,opt,name=body,proto3" json:"body,omitempty"` - ContentLength int64 `protobuf:"varint,4,opt,name=content_length,json=contentLength,proto3" json:"content_length,omitempty"` - ContentMd5 string `protobuf:"bytes,5,opt,name=content_md5,json=contentMd5,proto3" json:"content_md5,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,6,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - PartNumber int32 `protobuf:"varint,7,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` - RequestPayer string `protobuf:"bytes,8,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - SseCustomerAlgorithm string `protobuf:"bytes,9,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - SseCustomerKey string `protobuf:"bytes,10,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` - SseCustomerKeyMd5 string `protobuf:"bytes,11,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - UploadId string `protobuf:"bytes,12,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + Uid string `json:"uid,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` + //Body []byte `json:"body,omitempty"` + ContentLength int64 `json:"content_length,omitempty"` + ContentMd5 string `json:"content_md5,omitempty"` + ExpectedBucketOwner string `json:"expected_bucket_owner,omitempty"` + PartNumber int32 `json:"part_number,omitempty"` + RequestPayer string `json:"request_payer,omitempty"` + SseCustomerAlgorithm string `json:"sse_customer_algorithm,omitempty"` + SseCustomerKey string `json:"sse_customer_key,omitempty"` + SseCustomerKeyMd5 string `json:"sse_customer_key_md5,omitempty"` + UploadId string `json:"upload_id,omitempty"` } type UploadPartOutput struct { - BucketKeyEnabled bool `protobuf:"varint,1,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - ETag string `protobuf:"bytes,2,opt,name=etag,proto3" json:"etag,omitempty"` - RequestCharged string `protobuf:"bytes,3,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` - SSECustomerAlgorithm string `protobuf:"bytes,4,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - SSECustomerKeyMD5 string `protobuf:"bytes,5,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - SSEKMSKeyId string `protobuf:"bytes,6,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` - ServerSideEncryption string `protobuf:"bytes,7,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` + BucketKeyEnabled bool `json:"bucket_key_enabled,omitempty"` + ETag string `json:"etag,omitempty"` + RequestCharged string `json:"request_charged,omitempty"` + SSECustomerAlgorithm string `json:"sse_customer_algorithm,omitempty"` + SSECustomerKeyMD5 string `json:"sse_customer_key_md5,omitempty"` + SSEKMSKeyId string `json:"sse_kms_key_id,omitempty"` + ServerSideEncryption string `json:"server_side_encryption,omitempty"` } type UploadPartCopyInput struct { + Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` CopySource *CopySource `json:"copy_source,omitempty"` @@ -371,140 +386,145 @@ type UploadPartCopyInput struct { PartSize int64 `json:"part_size,omitempty"` } type UploadPartCopyOutput struct { - BucketKeyEnabled bool `protobuf:"varint,1,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - CopyPartResult *CopyPartResult `protobuf:"bytes,2,opt,name=copy_part_result,json=copyPartResult,proto3" json:"copy_part_result,omitempty"` - CopySourceVersionId string `protobuf:"bytes,3,opt,name=copy_source_version_id,json=copySourceVersionId,proto3" json:"copy_source_version_id,omitempty"` - RequestCharged string `protobuf:"bytes,4,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` - SSECustomerAlgorithm string `protobuf:"bytes,5,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - SSECustomerKeyMD5 string `protobuf:"bytes,6,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - SSEKMSKeyId string `protobuf:"bytes,7,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` - ServerSideEncryption string `protobuf:"bytes,8,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` + BucketKeyEnabled bool `json:"bucket_key_enabled,omitempty"` + CopyPartResult *CopyPartResult `json:"copy_part_result,omitempty"` + CopySourceVersionId string `json:"copy_source_version_id,omitempty"` + RequestCharged string `json:"request_charged,omitempty"` + SSECustomerAlgorithm string `json:"sse_customer_algorithm,omitempty"` + SSECustomerKeyMD5 string `json:"sse_customer_key_md5,omitempty"` + SSEKMSKeyId string `json:"sse_kms_key_id,omitempty"` + ServerSideEncryption string `json:"server_side_encryption,omitempty"` } type CopyPartResult struct { - ETag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` - LastModified int64 `protobuf:"bytes,2,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` + ETag string `json:"etag,omitempty"` + LastModified int64 `json:"last_modified,omitempty"` } type CompleteMultipartUploadInput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - UploadId string `protobuf:"bytes,3,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` - RequestPayer string `protobuf:"bytes,4,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - MultipartUpload *CompletedMultipartUpload `protobuf:"bytes,6,opt,name=multipart_upload,json=multipartUpload,proto3" json:"multipart_upload,omitempty"` + Uid string `json:"uid,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` + UploadId string `json:"upload_id,omitempty"` + RequestPayer string `json:"request_payer,omitempty"` + ExpectedBucketOwner string `json:"expected_bucket_owner,omitempty"` + MultipartUpload *CompletedMultipartUpload `json:"multipart_upload,omitempty"` } type CompletedMultipartUpload struct { - Parts []*CompletedPart `protobuf:"bytes,1,rep,name=parts,proto3" json:"parts,omitempty"` + Parts []*CompletedPart `json:"parts,omitempty"` } type CompletedPart struct { - ETag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` - PartNumber int32 `protobuf:"varint,2,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + ETag string `json:"etag,omitempty"` + PartNumber int32 `json:"part_number,omitempty"` } type CompleteMultipartUploadOutput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - BucketKeyEnabled bool `protobuf:"varint,3,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - ETag string `protobuf:"bytes,4,opt,name=etag,proto3" json:"etag,omitempty"` - Expiration string `protobuf:"bytes,5,opt,name=expiration,proto3" json:"expiration,omitempty"` - Location string `protobuf:"bytes,6,opt,name=location,proto3" json:"location,omitempty"` - RequestCharged string `protobuf:"bytes,7,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` - SSEKMSKeyId string `protobuf:"bytes,8,opt,name=sse_kms_keyId,json=sseKmsKeyId,proto3" json:"sse_kms_keyId,omitempty"` - ServerSideEncryption string `protobuf:"bytes,9,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` - VersionId string `protobuf:"bytes,10,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` + BucketKeyEnabled bool `json:"bucket_key_enabled,omitempty"` + ETag string `json:"etag,omitempty"` + Expiration string `json:"expiration,omitempty"` + Location string `json:"location,omitempty"` + RequestCharged string `json:"request_charged,omitempty"` + SSEKMSKeyId string `json:"sse_kms_keyId,omitempty"` + ServerSideEncryption string `json:"server_side_encryption,omitempty"` + VersionId string `json:"version_id,omitempty"` } type AbortMultipartUploadInput struct { + Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,3,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - RequestPayer string `protobuf:"bytes,4,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - UploadId string `protobuf:"bytes,5,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + Key string `json:"key,omitempty"` + ExpectedBucketOwner string `json:"expected_bucket_owner,omitempty"` + RequestPayer string `json:"request_payer,omitempty"` + UploadId string `json:"upload_id,omitempty"` } type AbortMultipartUploadOutput struct { - RequestCharged string `protobuf:"bytes,1,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + RequestCharged string `json:"request_charged,omitempty"` } type ListMultipartUploadsInput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Delimiter string `protobuf:"bytes,2,opt,name=delimiter,proto3" json:"delimiter,omitempty"` - EncodingType string `protobuf:"bytes,3,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,4,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - KeyMarker string `protobuf:"bytes,5,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` - MaxUploads int64 `protobuf:"varint,6,opt,name=max_uploads,json=maxUploads,proto3" json:"max_uploads,omitempty"` - Prefix string `protobuf:"bytes,7,opt,name=prefix,proto3" json:"prefix,omitempty"` - UploadIdMarker string `protobuf:"bytes,8,opt,name=upload_id_marker,json=uploadIdMarker,proto3" json:"upload_id_marker,omitempty"` + Uid string `json:"uid,omitempty"` + Bucket string `json:"bucket,omitempty"` + Delimiter string `json:"delimiter,omitempty"` + EncodingType string `json:"encoding_type,omitempty"` + ExpectedBucketOwner string `json:"expected_bucket_owner,omitempty"` + KeyMarker string `json:"key_marker,omitempty"` + MaxUploads int64 `json:"max_uploads,omitempty"` + Prefix string `json:"prefix,omitempty"` + UploadIdMarker string `json:"upload_id_marker,omitempty"` } type ListMultipartUploadsOutput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - CommonPrefixes []string `protobuf:"bytes,2,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` - Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` - EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` - IsTruncated bool `protobuf:"varint,5,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` - KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` - MaxUploads int32 `protobuf:"varint,7,opt,name=max_uploads,json=maxUploads,proto3" json:"max_uploads,omitempty"` - NextKeyMarker string `protobuf:"bytes,8,opt,name=next_key_marker,json=nextKeyMarker,proto3" json:"next_key_marker,omitempty"` - NextUploadIdMarker string `protobuf:"bytes,9,opt,name=next_upload_id_marker,json=nextUploadIdMarker,proto3" json:"next_upload_id_marker,omitempty"` - Prefix string `protobuf:"bytes,10,opt,name=prefix,proto3" json:"prefix,omitempty"` - UploadIdMarker string `protobuf:"bytes,11,opt,name=upload_id_marker,json=uploadIdMarker,proto3" json:"upload_id_marker,omitempty"` - Uploads []*MultipartUpload `protobuf:"bytes,12,rep,name=uploads,proto3" json:"uploads,omitempty"` + Bucket string `json:"bucket,omitempty"` + CommonPrefixes []string `json:"common_prefixes,omitempty"` + Delimiter string `json:"delimiter,omitempty"` + EncodingType string `json:"encoding_type,omitempty"` + IsTruncated bool `json:"is_truncated,omitempty"` + KeyMarker string `json:"key_marker,omitempty"` + MaxUploads int32 `json:"max_uploads,omitempty"` + NextKeyMarker string `json:"next_key_marker,omitempty"` + NextUploadIdMarker string `json:"next_upload_id_marker,omitempty"` + Prefix string `json:"prefix,omitempty"` + UploadIdMarker string `json:"upload_id_marker,omitempty"` + Uploads []*MultipartUpload `json:"uploads,omitempty"` } type MultipartUpload struct { - Initiated int64 `protobuf:"bytes,1,opt,name=initiated,proto3" json:"initiated,omitempty"` - Initiator *Initiator `protobuf:"bytes,2,opt,name=initiator,proto3" json:"initiator,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - Owner *Owner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` - StorageClass string `protobuf:"bytes,5,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` - UploadId string `protobuf:"bytes,6,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + Initiated int64 `json:"initiated,omitempty"` + Initiator *Initiator `json:"initiator,omitempty"` + Key string `json:"key,omitempty"` + Owner *Owner `json:"owner,omitempty"` + StorageClass string `json:"storage_class,omitempty"` + UploadId string `json:"upload_id,omitempty"` } type Initiator struct { - DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - ID string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + DisplayName string `json:"display_name,omitempty"` + ID string `json:"id,omitempty"` } type ListObjectVersionsInput struct { - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Delimiter string `protobuf:"bytes,2,opt,name=delimiter,proto3" json:"delimiter,omitempty"` - EncodingType string `protobuf:"bytes,3,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` - ExpectedBucketOwner string `protobuf:"bytes,4,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - KeyMarker string `protobuf:"bytes,5,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` - MaxKeys int32 `protobuf:"varint,6,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` - Prefix string `protobuf:"bytes,7,opt,name=prefix,proto3" json:"prefix,omitempty"` - VersionIdMarker string `protobuf:"bytes,8,opt,name=version_id_marker,json=versionIdMarker,proto3" json:"version_id_marker,omitempty"` + Uid string `json:"uid,omitempty"` + Bucket string `json:"bucket,omitempty"` + Delimiter string `json:"delimiter,omitempty"` + EncodingType string `json:"encoding_type,omitempty"` + ExpectedBucketOwner string `json:"expected_bucket_owner,omitempty"` + KeyMarker string `json:"key_marker,omitempty"` + MaxKeys int32 `json:"max_keys,omitempty"` + Prefix string `json:"prefix,omitempty"` + VersionIdMarker string `json:"version_id_marker,omitempty"` } type ListObjectVersionsOutput struct { - CommonPrefixes []string `protobuf:"bytes,1,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` - DeleteMarkers []*DeleteMarkerEntry `protobuf:"bytes,2,rep,name=delete_markers,json=deleteMarkers,proto3" json:"delete_markers,omitempty"` - Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` - EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` - IsTruncated bool `protobuf:"varint,5,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` - KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` - MaxKeys int32 `protobuf:"varint,7,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` - Name string `protobuf:"bytes,8,opt,name=name,proto3" json:"name,omitempty"` - NextKeyMarker string `protobuf:"bytes,9,opt,name=next_key_marker,json=nextKeyMarker,proto3" json:"next_key_marker,omitempty"` - NextVersionIdMarker string `protobuf:"bytes,10,opt,name=next_version_id_marker,json=nextVersionIdMarker,proto3" json:"next_version_id_marker,omitempty"` - Prefix string `protobuf:"bytes,11,opt,name=prefix,proto3" json:"prefix,omitempty"` - VersionIdMarker string `protobuf:"bytes,12,opt,name=version_id_marker,json=versionIdMarker,proto3" json:"version_id_marker,omitempty"` - Versions []*ObjectVersion `protobuf:"bytes,13,rep,name=versions,proto3" json:"versions,omitempty"` + CommonPrefixes []string `json:"common_prefixes,omitempty"` + DeleteMarkers []*DeleteMarkerEntry `json:"delete_markers,omitempty"` + Delimiter string `json:"delimiter,omitempty"` + EncodingType string `json:"encoding_type,omitempty"` + IsTruncated bool `json:"is_truncated,omitempty"` + KeyMarker string `json:"key_marker,omitempty"` + MaxKeys int32 `json:"max_keys,omitempty"` + Name string `json:"name,omitempty"` + NextKeyMarker string `json:"next_key_marker,omitempty"` + NextVersionIdMarker string `json:"next_version_id_marker,omitempty"` + Prefix string `json:"prefix,omitempty"` + VersionIdMarker string `json:"version_id_marker,omitempty"` + Versions []*ObjectVersion `json:"versions,omitempty"` } type DeleteMarkerEntry struct { - IsLatest bool `protobuf:"varint,1,opt,name=is_latest,json=isLatest,proto3" json:"is_latest,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - LastModified int64 `protobuf:"bytes,3,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` - Owner *Owner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` - VersionId string `protobuf:"bytes,5,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + IsLatest bool `json:"is_latest,omitempty"` + Key string `json:"key,omitempty"` + LastModified int64 `json:"last_modified,omitempty"` + Owner *Owner `json:"owner,omitempty"` + VersionId string `json:"version_id,omitempty"` } type ObjectVersion struct { - ETag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` - IsLatest bool `protobuf:"varint,2,opt,name=is_latest,json=isLatest,proto3" json:"is_latest,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - LastModified int64 `protobuf:"bytes,4,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` - Owner *Owner `protobuf:"bytes,5,opt,name=owner,proto3" json:"owner,omitempty"` - Size int64 `protobuf:"varint,6,opt,name=size,proto3" json:"size,omitempty"` - StorageClass string `protobuf:"bytes,7,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` - VersionId string `protobuf:"bytes,8,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + ETag string `json:"etag,omitempty"` + IsLatest bool `json:"is_latest,omitempty"` + Key string `json:"key,omitempty"` + LastModified int64 `json:"last_modified,omitempty"` + Owner *Owner `json:"owner,omitempty"` + Size int64 `json:"size,omitempty"` + StorageClass string `json:"storage_class,omitempty"` + VersionId string `json:"version_id,omitempty"` } type HeadObjectInput struct { + Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` ChecksumMode string `json:"checksum_mode,omitempty"` @@ -527,6 +547,7 @@ type HeadObjectOutput struct { } type IsObjectExistInput struct { + Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` } @@ -535,6 +556,7 @@ type IsObjectExistOutput struct { } type SignURLInput struct { + Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` Method string `json:"method,omitempty"` @@ -545,6 +567,7 @@ type SignURLOutput struct { } type UpdateBandwidthRateLimitInput struct { + Uid string `json:"uid,omitempty"` // The average upload/download bandwidth rate limit in bits per second. AverageRateLimitInBitsPerSec int64 `json:"average_rate_limit_in_bits_per_sec,omitempty"` //Resource name of gateway @@ -552,6 +575,7 @@ type UpdateBandwidthRateLimitInput struct { } type AppendObjectInput struct { + Uid string `json:"uid,omitempty"` DataStream io.Reader Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` @@ -572,6 +596,7 @@ type AppendObjectOutput struct { } type ListPartsInput struct { + Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` ExpectedBucketOwner string `json:"expected_bucket_owner,omitempty"` diff --git a/spec/proto/extension/v1/oss.pb.go b/spec/proto/extension/v1/oss.pb.go index 9e5cf94ce8..3e5a8064a5 100644 --- a/spec/proto/extension/v1/oss.pb.go +++ b/spec/proto/extension/v1/oss.pb.go @@ -152,6 +152,8 @@ type GetObjectInput struct { AcceptEncoding string `protobuf:"bytes,23,opt,name=accept_encoding,json=acceptEncoding,proto3" json:"accept_encoding,omitempty"` // Specify the signed url of object, user can get object with signed url without ak、sk SignedUrl string `protobuf:"bytes,24,opt,name=signed_url,json=signedUrl,proto3" json:"signed_url,omitempty"` + // Specify the client used for request + Uid string `protobuf:"bytes,25,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *GetObjectInput) Reset() { @@ -354,6 +356,13 @@ func (x *GetObjectInput) GetSignedUrl() string { return "" } +func (x *GetObjectInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type GetObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -610,6 +619,8 @@ type PutObjectInput struct { SignedUrl string `protobuf:"bytes,12,opt,name=signed_url,json=signedUrl,proto3" json:"signed_url,omitempty"` // A map of metadata to store with the object in S3. 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"` + // Specify the client used for request + Uid string `protobuf:"bytes,14,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *PutObjectInput) Reset() { @@ -735,6 +746,13 @@ func (x *PutObjectInput) GetMeta() map[string]string { return nil } +func (x *PutObjectInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type PutObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -841,6 +859,8 @@ type DeleteObjectInput struct { RequestPayer string `protobuf:"bytes,4,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,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"` + // Specify the client used for request + Uid string `protobuf:"bytes,6,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *DeleteObjectInput) Reset() { @@ -910,6 +930,13 @@ func (x *DeleteObjectInput) GetVersionId() string { return "" } +func (x *DeleteObjectInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type DeleteObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -995,6 +1022,8 @@ type PutObjectTaggingInput struct { Tags map[string]string `protobuf:"bytes,4,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // The versionId of the object that the tag-set will be added to. VersionId string `protobuf:"bytes,5,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + // Specify the client used for request + Uid string `protobuf:"bytes,6,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *PutObjectTaggingInput) Reset() { @@ -1064,6 +1093,13 @@ func (x *PutObjectTaggingInput) GetVersionId() string { return "" } +func (x *PutObjectTaggingInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type PutObjectTaggingOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1138,6 +1174,8 @@ type DeleteObjectTaggingInput struct { // different account, the request fails with the HTTP status code 403 Forbidden // (access denied). ExpectedBucketOwner string `protobuf:"bytes,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + // Specify the client used for request + Uid string `protobuf:"bytes,6,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *DeleteObjectTaggingInput) Reset() { @@ -1207,6 +1245,13 @@ func (x *DeleteObjectTaggingInput) GetExpectedBucketOwner() string { return "" } +func (x *DeleteObjectTaggingInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type DeleteObjectTaggingOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1284,6 +1329,8 @@ type GetObjectTaggingInput struct { ExpectedBucketOwner string `protobuf:"bytes,5,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,6,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + // Specify the client used for request + Uid string `protobuf:"bytes,7,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *GetObjectTaggingInput) Reset() { @@ -1360,6 +1407,13 @@ func (x *GetObjectTaggingInput) GetRequestPayer() string { return "" } +func (x *GetObjectTaggingInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type GetObjectTaggingOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1516,6 +1570,8 @@ type CopyObjectInput struct { MetadataDirective string `protobuf:"bytes,7,opt,name=metadata_directive,json=metadataDirective,proto3" json:"metadata_directive,omitempty"` // A map of metadata to store with the object in S3. Metadata map[string]string `protobuf:"bytes,8,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Specify the client used for request + Uid string `protobuf:"bytes,9,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *CopyObjectInput) Reset() { @@ -1606,6 +1662,13 @@ func (x *CopyObjectInput) GetMetadata() map[string]string { return nil } +func (x *CopyObjectInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type CopyObjectResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1854,6 +1917,8 @@ type DeleteObjectsInput struct { Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` Delete *Delete `protobuf:"bytes,3,opt,name=delete,proto3" json:"delete,omitempty"` RequestPayer string `protobuf:"bytes,4,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + // Specify the client used for request + Uid string `protobuf:"bytes,5,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *DeleteObjectsInput) Reset() { @@ -1916,6 +1981,13 @@ func (x *DeleteObjectsInput) GetRequestPayer() string { return "" } +func (x *DeleteObjectsInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type DeletedObject struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2075,6 +2147,8 @@ type ListObjectsInput struct { // objects request. Bucket owners need not specify this parameter in their // requests. RequestPayer string `protobuf:"bytes,9,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + // Specify the client used for request + Uid string `protobuf:"bytes,10,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *ListObjectsInput) Reset() { @@ -2172,6 +2246,13 @@ func (x *ListObjectsInput) GetRequestPayer() string { return "" } +func (x *ListObjectsInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type ListObjectsOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2466,6 +2547,8 @@ type GetObjectCannedAclInput struct { 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,4,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + // Specify the client used for request + Uid string `protobuf:"bytes,5,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *GetObjectCannedAclInput) Reset() { @@ -2528,6 +2611,13 @@ func (x *GetObjectCannedAclInput) GetVersionId() string { return "" } +func (x *GetObjectCannedAclInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type GetObjectCannedAclOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2605,6 +2695,8 @@ type PutObjectCannedAclInput struct { Acl string `protobuf:"bytes,4,opt,name=acl,proto3" json:"acl,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"` + // Specify the client used for request + Uid string `protobuf:"bytes,6,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *PutObjectCannedAclInput) Reset() { @@ -2674,6 +2766,13 @@ func (x *PutObjectCannedAclInput) GetVersionId() string { return "" } +func (x *PutObjectCannedAclInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type PutObjectCannedAclOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2731,6 +2830,8 @@ type RestoreObjectInput struct { 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"` + // Specify the client used for request + Uid string `protobuf:"bytes,6,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *RestoreObjectInput) Reset() { @@ -2793,6 +2894,13 @@ func (x *RestoreObjectInput) GetVersionId() string { return "" } +func (x *RestoreObjectInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type RestoreObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2893,6 +3001,8 @@ type CreateMultipartUploadInput struct { // The tag-set for the object. The tag-set must be encoded as URL Query parameters. Tagging string `protobuf:"bytes,29,opt,name=tagging,proto3" json:"tagging,omitempty"` WebsiteRedirectLocation string `protobuf:"bytes,30,opt,name=website_redirect_location,json=websiteRedirectLocation,proto3" json:"website_redirect_location,omitempty"` + // Specify the client used for request + Uid string `protobuf:"bytes,31,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *CreateMultipartUploadInput) Reset() { @@ -3137,6 +3247,13 @@ func (x *CreateMultipartUploadInput) GetWebsiteRedirectLocation() string { return "" } +func (x *CreateMultipartUploadInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type CreateMultipartUploadOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3299,6 +3416,8 @@ type UploadPartInput struct { // 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"` + // Specify the client used for request + Uid string `protobuf:"bytes,14,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *UploadPartInput) Reset() { @@ -3424,6 +3543,13 @@ func (x *UploadPartInput) GetUploadId() string { return "" } +func (x *UploadPartInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type UploadPartOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3539,6 +3665,8 @@ type UploadPartCopyInput struct { // 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"` PartSize int64 `protobuf:"varint,8,opt,name=part_size,json=partSize,proto3" json:"part_size,omitempty"` + // Specify the client used for request + Uid string `protobuf:"bytes,9,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *UploadPartCopyInput) Reset() { @@ -3629,6 +3757,13 @@ func (x *UploadPartCopyInput) GetPartSize() int64 { return 0 } +func (x *UploadPartCopyInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type CopyPartResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3906,6 +4041,8 @@ type CompleteMultipartUploadInput struct { 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"` + // Specify the client used for request + Uid string `protobuf:"bytes,8,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *CompleteMultipartUploadInput) Reset() { @@ -3989,6 +4126,13 @@ func (x *CompleteMultipartUploadInput) GetMultipartUpload() *CompletedMultipartU return nil } +func (x *CompleteMultipartUploadInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type CompleteMultipartUploadOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4128,6 +4272,8 @@ type AbortMultipartUploadInput struct { // 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"` + // Specify the client used for request + Uid string `protobuf:"bytes,7,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *AbortMultipartUploadInput) Reset() { @@ -4204,6 +4350,13 @@ func (x *AbortMultipartUploadInput) GetUploadId() string { return "" } +func (x *AbortMultipartUploadInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type AbortMultipartUploadOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4291,6 +4444,8 @@ type ListMultipartUploadsInput struct { // 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"` + // Specify the client used for request + Uid string `protobuf:"bytes,10,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *ListMultipartUploadsInput) Reset() { @@ -4388,6 +4543,13 @@ func (x *ListMultipartUploadsInput) GetUploadIdMarker() string { return "" } +func (x *ListMultipartUploadsInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type Initiator struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4712,6 +4874,8 @@ type ListObjectVersionsInput struct { 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"` + // Specify the client used for request + Uid string `protobuf:"bytes,10,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *ListObjectVersionsInput) Reset() { @@ -4809,6 +4973,13 @@ func (x *ListObjectVersionsInput) GetVersionIdMarker() string { return "" } +func (x *ListObjectVersionsInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type DeleteMarkerEntry struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5167,6 +5338,8 @@ type HeadObjectInput struct { 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"` + // Specify the client used for request + Uid string `protobuf:"bytes,17,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *HeadObjectInput) Reset() { @@ -5313,6 +5486,13 @@ func (x *HeadObjectInput) GetWithDetails() bool { return false } +func (x *HeadObjectInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type HeadObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5370,6 +5550,8 @@ type IsObjectExistInput struct { Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` VersionId string `protobuf:"bytes,4,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + // Specify the client used for request + Uid string `protobuf:"bytes,5,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *IsObjectExistInput) Reset() { @@ -5432,6 +5614,13 @@ func (x *IsObjectExistInput) GetVersionId() string { return "" } +func (x *IsObjectExistInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type IsObjectExistOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5491,6 +5680,8 @@ type SignURLInput struct { 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"` + // Specify the client used for request + Uid string `protobuf:"bytes,6,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *SignURLInput) Reset() { @@ -5560,6 +5751,13 @@ func (x *SignURLInput) GetExpiredInSec() int64 { return 0 } +func (x *SignURLInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type SignURLOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5617,6 +5815,8 @@ type UpdateBandwidthRateLimitInput struct { 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"` + // Specify the client used for request + Uid string `protobuf:"bytes,4,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *UpdateBandwidthRateLimitInput) Reset() { @@ -5672,6 +5872,13 @@ func (x *UpdateBandwidthRateLimitInput) GetGatewayResourceName() string { return "" } +func (x *UpdateBandwidthRateLimitInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type AppendObjectInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5692,6 +5899,8 @@ type AppendObjectInput struct { ServerSideEncryption string `protobuf:"bytes,13,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` Meta string `protobuf:"bytes,14,opt,name=meta,proto3" json:"meta,omitempty"` 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"` + // Specify the client used for request + Uid string `protobuf:"bytes,16,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *AppendObjectInput) Reset() { @@ -5831,6 +6040,13 @@ func (x *AppendObjectInput) GetTags() map[string]string { return nil } +func (x *AppendObjectInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type AppendObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5891,6 +6107,8 @@ type ListPartsInput struct { PartNumberMarker int64 `protobuf:"varint,6,opt,name=part_number_marker,json=partNumberMarker,proto3" json:"part_number_marker,omitempty"` RequestPayer string `protobuf:"bytes,7,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` UploadId string `protobuf:"bytes,8,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + // Specify the client used for request + Uid string `protobuf:"bytes,9,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *ListPartsInput) Reset() { @@ -5981,6 +6199,13 @@ func (x *ListPartsInput) GetUploadId() string { return "" } +func (x *ListPartsInput) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type Part struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6175,7 +6400,7 @@ var file_oss_proto_rawDesc = []byte{ 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, 0xdd, 0x07, 0x0a, 0x0e, 0x47, 0x65, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xef, 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, @@ -6237,285 +6462,294 @@ var file_oss_proto_rawDesc = []byte{ 0x64, 0x69, 0x6e, 0x67, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x55, 0x72, 0x6c, 0x22, 0xeb, 0x05, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, - 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x18, 0x02, 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, 0x03, 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, 0x04, 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, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x25, 0x0a, - 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x65, - 0x6e, 0x67, 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x72, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x0a, 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, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x12, - 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x69, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x67, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x74, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, - 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x52, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 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, 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, 0x9d, 0x04, 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, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x16, 0x0a, - 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x05, - 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, - 0x06, 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, 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, 0x45, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, - 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, - 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, 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, 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, 0x86, 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, - 0x4c, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 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, 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, 0xe8, 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, - 0x6c, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x02, 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, 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, 0xee, 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, 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, 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, 0xf0, 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, 0x4d, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 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, 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, 0x6c, - 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x03, 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, 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, 0x94, 0x03, 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, - 0x44, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 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, 0x43, - 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x70, 0x79, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 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, 0x52, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x73, 0x70, 0x65, + 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x55, 0x72, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, + 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xeb, 0x05, 0x0a, 0x0f, + 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, + 0x6f, 0x64, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x02, 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, + 0x03, 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, 0x04, 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, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, + 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, + 0x0a, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x0a, 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, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, + 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, + 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, + 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, + 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x67, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x74, 0x61, 0x67, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x73, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, + 0x72, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x52, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 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, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, + 0x74, 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, 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, 0xaa, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x57, 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, 0x29, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaf, 0x04, 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, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, + 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, + 0x18, 0x05, 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, 0x06, 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, 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, 0x45, 0x0a, 0x04, 0x6d, 0x65, 0x74, + 0x61, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 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, 0x63, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x43, 0x0a, - 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 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, 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, 0xa9, 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, 0x37, 0x0a, 0x06, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 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, 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, + 0x31, 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, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, + 0x69, 0x64, 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, 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, 0xb2, 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, 0x12, 0x10, 0x0a, 0x03, + 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0x98, 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, 0x4c, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 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, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x75, 0x69, 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, 0xe8, 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, 0x6c, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 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, 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, 0xc8, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x75, 0x69, 0x64, 0x22, 0xee, 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, 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, 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, 0xea, 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, 0x12, + 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, + 0x64, 0x22, 0xf0, 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, 0x4d, 0x0a, 0x04, + 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 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, 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, 0x6c, 0x0a, 0x0f, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 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, 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, 0xa6, + 0x03, 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, 0x44, 0x0a, 0x0b, 0x63, + 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 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, 0x43, 0x6f, 0x70, 0x79, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 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, 0x52, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 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, 0xaa, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x57, 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, 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, + 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, 0x63, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x07, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 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, 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, 0xbb, 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, 0x37, 0x0a, 0x06, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 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, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 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, @@ -6531,7 +6765,7 @@ var file_oss_proto_rawDesc = []byte{ 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, 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, + 0x74, 0x65, 0x64, 0x22, 0xc1, 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, @@ -6550,624 +6784,641 @@ var file_oss_proto_rawDesc = []byte{ 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, 0xdf, 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, 0x3b, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 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, 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, 0xc2, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, - 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, + 0x50, 0x61, 0x79, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xdf, 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, 0x3b, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 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, 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, 0x98, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 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, 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, 0xf1, 0x0a, 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, + 0x76, 0x31, 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, 0xc2, 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, 0x34, 0x0a, 0x05, 0x6f, + 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0x93, 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, 0x12, 0x10, + 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, + 0x22, 0x98, 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, 0x34, 0x0a, 0x05, + 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0xa5, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x75, 0x69, 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, 0x8e, 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, 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, 0x5e, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x11, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x41, 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, 0x43, 0x72, + 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0x83, 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, 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, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x1d, 0x20, 0x01, - 0x28, 0x09, 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, 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, + 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, 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, 0xa6, 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, 0x44, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, - 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 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, 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, 0xb7, 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, 0x51, 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, 0x27, 0x2e, 0x73, + 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, 0x5e, 0x0a, 0x09, 0x6d, 0x65, 0x74, + 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 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, 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, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 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, 0x18, 0x0a, 0x07, 0x74, 0x61, + 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 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, + 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, + 0x69, 0x64, 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, + 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, 0x05, 0x20, + 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, 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, 0x58, 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, 0x3c, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x03, 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, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, - 0x70, 0x61, 0x72, 0x74, 0x73, 0x22, 0xbb, 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, 0x5c, 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, - 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, 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, + 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, + 0xf0, 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, + 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, + 0x69, 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, 0xb8, 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, 0x44, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 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, 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, 0x12, 0x10, 0x0a, + 0x03, 0x75, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 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, 0xb7, 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, 0x51, 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, 0x27, 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, 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, 0x58, 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, 0x3c, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 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, + 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, + 0x61, 0x72, 0x74, 0x73, 0x22, 0xcd, 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, 0x5c, 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, 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, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x75, 0x69, 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, 0xec, 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, 0x12, 0x10, 0x0a, + 0x03, 0x75, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 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, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, + 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x22, 0xdd, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 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, 0xfb, 0x01, 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, 0x40, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 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, 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, 0x34, 0x0a, 0x05, + 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0xe4, 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, 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, 0xfb, 0x01, 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, 0x40, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, 0x72, - 0x18, 0x02, 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, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, - 0xe4, 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, 0x42, 0x0a, 0x07, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x0c, 0x20, - 0x03, 0x28, 0x0b, 0x32, 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, 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, 0xbc, - 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, - 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0x85, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0xaf, 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, 0x51, 0x0a, 0x0e, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, - 0x03, 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, 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, 0x12, 0x1c, + 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, 0x42, 0x0a, 0x07, 0x75, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 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, 0xd7, 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, 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, + 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, 0x0c, 0x20, 0x01, + 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, 0x12, 0x42, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x0d, 0x20, 0x03, 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, - 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, 0xbd, 0x01, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x66, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x3d, 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, 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, 0xcc, 0x04, 0x0a, + 0x6b, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xbc, 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, + 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, + 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, 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, 0x85, 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, 0x34, + 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0xaf, 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, 0x51, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 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, 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, 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, 0x42, 0x0a, 0x08, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 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, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xf9, + 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xbd, 0x01, 0x0a, 0x10, 0x48, + 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, + 0x66, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 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, 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, 0x8e, 0x01, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0xa7, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 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, 0xce, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xde, 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, @@ -7201,251 +7452,253 @@ var file_oss_proto_rawDesc = []byte{ 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 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, 0x84, 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, - 0x33, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, - 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, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, - 0x61, 0x72, 0x74, 0x73, 0x32, 0xff, 0x17, 0x0a, 0x14, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4a, 0x0a, - 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 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, 0x49, 0x6e, 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, 0x62, 0x0a, 0x09, 0x50, 0x75, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, - 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x62, 0x0a, - 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x2e, 0x73, 0x70, 0x65, + 0x67, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x75, 0x69, 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, 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, 0xac, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0x84, 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, 0x33, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 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, 0x50, 0x61, 0x72, + 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x32, 0xff, 0x17, 0x0a, 0x14, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x4a, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, + 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, 0x49, 0x6e, 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, 0x62, 0x0a, + 0x09, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x47, 0x65, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x69, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x10, - 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, - 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, 0x50, 0x75, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 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, 0x7e, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, 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, 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, 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, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, - 0x6e, 0x67, 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, 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, 0x63, 0x0a, 0x0a, 0x43, 0x6f, - 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x43, 0x6f, 0x70, - 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, - 0x6c, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 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, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x66, 0x0a, - 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, + 0x01, 0x12, 0x62, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, + 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 0x30, 0x2e, 0x73, 0x70, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x69, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, + 0x12, 0x75, 0x0a, 0x10, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, + 0x67, 0x69, 0x6e, 0x67, 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, 0x50, + 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 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, 0x7e, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 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, 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, 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, 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, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, - 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 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, 0x7b, 0x0a, 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, - 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, - 0x65, 0x64, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 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, - 0x6c, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x84, 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, 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, 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, 0x34, 0x2e, 0x73, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, + 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 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, 0x63, + 0x0a, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 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, 0x65, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, - 0x72, 0x74, 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, 0x55, 0x70, 0x6c, - 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x73, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 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, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x73, 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, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 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, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, + 0x00, 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x12, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, + 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x1a, 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, 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, 0x7b, 0x0a, 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, - 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x0e, 0x55, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, - 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x73, 0x70, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 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, 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, 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, 0x6c, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 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, 0x52, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, + 0x00, 0x12, 0x84, 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, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, - 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x8a, 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, 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, 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, - 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, 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, 0x81, 0x01, 0x0a, 0x14, 0x41, 0x62, - 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x12, 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, 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, 0x33, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 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, 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, 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, 0x65, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 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, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, + 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, + 0x6f, 0x0a, 0x0e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, + 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, + 0x12, 0x8a, 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, 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, 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, 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, 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, 0x81, 0x01, - 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x32, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, + 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 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, 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, 0x33, 0x2e, 0x73, 0x70, 0x65, + 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, 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, 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, 0x81, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, + 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 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, 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, 0x7b, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 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, 0x7b, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 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, 0x63, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 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, 0x48, 0x65, 0x61, 0x64, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x49, 0x73, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 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, + 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x07, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, + 0x12, 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, 0x53, 0x69, 0x67, 0x6e, 0x55, + 0x52, 0x4c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 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, 0x63, - 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, - 0x78, 0x69, 0x73, 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, 0x49, - 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x49, 0x73, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, - 0x00, 0x12, 0x5a, 0x0a, 0x07, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x12, 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, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x1a, 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, 0x53, 0x69, - 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x74, 0x0a, - 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x42, - 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 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, 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, 0x72, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x70, 0x4c, + 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, + 0x00, 0x12, 0x74, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 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, 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, 0x6b, 0x0a, 0x0c, 0x41, 0x70, 0x70, 0x65, 0x6e, - 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x55, 0x70, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 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, 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, 0x6b, 0x0a, 0x0c, 0x41, + 0x70, 0x70, 0x65, 0x6e, 0x64, 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, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 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, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 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, 0x41, 0x70, - 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0x00, 0x28, 0x01, 0x12, 0x60, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, - 0x73, 0x12, 0x27, 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, 0x4c, 0x69, 0x73, 0x74, - 0x50, 0x61, 0x72, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x31, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x60, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, + 0x50, 0x61, 0x72, 0x74, 0x73, 0x12, 0x27, 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, + 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, + 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/spec/proto/extension/v1/oss.proto b/spec/proto/extension/v1/oss.proto index 90ee8591ed..a8591f0f04 100644 --- a/spec/proto/extension/v1/oss.proto +++ b/spec/proto/extension/v1/oss.proto @@ -106,6 +106,8 @@ message GetObjectInput { string accept_encoding = 23; // Specify the signed url of object, user can get object with signed url without ak、sk string signed_url = 24; + // Specify the client used for request + string uid = 25; } message GetObjectOutput { // Object data. @@ -197,6 +199,8 @@ message PutObjectInput{ string signed_url = 12; // A map of metadata to store with the object in S3. map meta = 13; + // Specify the client used for request + string uid = 14; } message PutObjectOutput{ // Indicates whether the uploaded object uses an S3 Bucket Key for server-side @@ -229,6 +233,8 @@ message DeleteObjectInput{ string request_payer = 4; // VersionId used to reference a specific version of the object. string version_id = 5; + // Specify the client used for request + string uid = 6; } message DeleteObjectOutput{ // Specifies whether the versioned object that was permanently deleted was (true) @@ -254,6 +260,8 @@ message PutObjectTaggingInput{ map tags = 4; // The versionId of the object that the tag-set will be added to. string version_id = 5; + // Specify the client used for request + string uid = 6; } message PutObjectTaggingOutput{ // The versionId of the object the tag-set was added to. @@ -275,6 +283,8 @@ message DeleteObjectTaggingInput{ // different account, the request fails with the HTTP status code 403 Forbidden // (access denied). string expected_bucket_owner = 5; + // Specify the client used for request + string uid = 6; } message DeleteObjectTaggingOutput{ // The versionId of the object the tag-set was removed from. @@ -299,6 +309,8 @@ message GetObjectTaggingInput{ string expected_bucket_owner = 5; // Confirms that the requester knows that they will be charged for the request. string request_payer = 6; + // Specify the client used for request + string uid = 7; } message GetObjectTaggingOutput{ // Contains the tag set. @@ -337,6 +349,8 @@ message CopyObjectInput{ string metadata_directive = 7; // A map of metadata to store with the object in S3. map metadata = 8; + // Specify the client used for request + string uid = 9; } message CopyObjectResult{ // Returns the ETag of the new object. The ETag reflects only changes to the @@ -373,6 +387,8 @@ message DeleteObjectsInput{ string bucket = 2; Delete delete = 3; string request_payer = 4; + // Specify the client used for request + string uid = 5; } message DeletedObject{ // Specifies whether the versioned object that was permanently deleted was (true) @@ -421,6 +437,8 @@ message ListObjectsInput{ // objects request. Bucket owners need not specify this parameter in their // requests. string request_payer = 9; + // Specify the client used for request + string uid = 10; } message ListObjectsOutput{ repeated string common_prefixes = 1; @@ -476,6 +494,8 @@ message GetObjectCannedAclInput{ string key = 3; // VersionId used to reference a specific version of the object string version_id = 4; + // Specify the client used for request + string uid = 5; } message GetObjectCannedAclOutput{ string canned_acl = 1; @@ -493,6 +513,8 @@ message PutObjectCannedAclInput{ string acl = 4; // VersionId used to reference a specific version of the object. string version_id = 5; + // Specify the client used for request + string uid = 6; } message PutObjectCannedAclOutput{ string request_charged = 1; @@ -504,6 +526,8 @@ message RestoreObjectInput{ string key = 3; // VersionId used to reference a specific version of the object. string version_id = 5; + // Specify the client used for request + string uid = 6; } message RestoreObjectOutput{ // If present, indicates that the requester was successfully charged for the @@ -551,6 +575,8 @@ message CreateMultipartUploadInput{ // The tag-set for the object. The tag-set must be encoded as URL Query parameters. string tagging = 29; string website_redirect_location = 30; + // Specify the client used for request + string uid = 31; } message CreateMultipartUploadOutput{ string bucket = 1; @@ -590,6 +616,8 @@ message UploadPartInput{ // Upload ID identifying the multipart upload whose part is being uploaded. // This member is required. string upload_id = 13; + // Specify the client used for request + string uid = 14; } message UploadPartOutput{ bool bucket_key_enabled = 1; @@ -617,6 +645,8 @@ message UploadPartCopyInput{ // The range of bytes to copy from the source object.bytes=start_position-part_size int64 start_position = 7; int64 part_size = 8; + // Specify the client used for request + string uid = 9; } message CopyPartResult{ @@ -654,6 +684,8 @@ message CompleteMultipartUploadInput{ string expected_bucket_owner = 6; // The container for the multipart upload request information. CompletedMultipartUpload multipart_upload = 7; + // Specify the client used for request + string uid = 8; } message CompleteMultipartUploadOutput{ string bucket = 1; @@ -684,6 +716,8 @@ message AbortMultipartUploadInput{ // Upload ID that identifies the multipart upload. // This member is required. string upload_id = 6; + // Specify the client used for request + string uid = 7; } message AbortMultipartUploadOutput{ // If present, indicates that the requester was successfully charged for the @@ -725,6 +759,8 @@ message ListMultipartUploadsInput{ // might be included in the list only if they have an upload ID lexicographically // greater than the specified upload-id-marker. string upload_id_marker = 9; + // Specify the client used for request + string uid = 10; } message Initiator{ string display_name = 1; @@ -796,6 +832,8 @@ message ListObjectVersionsInput{ string prefix = 8; // Specifies the object version you want to start listing from. string version_id_marker = 9; + // Specify the client used for request + string uid = 10; } message DeleteMarkerEntry{ // Specifies whether the object is (true) or is not (false) the latest version of @@ -859,6 +897,8 @@ message HeadObjectInput{ string version_id = 15; // Return object details meta bool with_details = 16; + // Specify the client used for request + string uid = 17; } message HeadObjectOutput{ // Metadata pertaining to the operation's result. @@ -870,6 +910,8 @@ message IsObjectExistInput{ string bucket = 2; string key = 3; string version_id = 4; + // Specify the client used for request + string uid = 5; } message IsObjectExistOutput{ bool file_exist = 1; @@ -883,6 +925,8 @@ message SignURLInput{ string method = 4; // expire time of the sign url int64 expired_in_sec = 5; + // Specify the client used for request + string uid = 6; } message SignURLOutput{ string signed_url = 1; @@ -894,6 +938,8 @@ message UpdateBandwidthRateLimitInput{ int64 average_rate_limit_in_bits_per_sec = 2; //Resource name of gateway string gateway_resource_name = 3; + // Specify the client used for request + string uid = 4; } message AppendObjectInput{ @@ -912,6 +958,8 @@ message AppendObjectInput{ string server_side_encryption = 13; string meta = 14; map tags = 15; + // Specify the client used for request + string uid = 16; } message AppendObjectOutput{ @@ -927,6 +975,8 @@ message ListPartsInput{ int64 part_number_marker = 6; string request_payer = 7; string upload_id = 8; + // Specify the client used for request + string uid = 9; } message Part{ string etag = 1; From 3e554268682af51d228de051c577ed432ff3d78c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Thu, 7 Jul 2022 10:38:47 +0800 Subject: [PATCH 073/126] change tagging to map for CopyObjectInput CreateMultipartUploadInput --- components/file/aliyun/option.go | 13 + components/file/aliyun/option_test.go | 2 + components/file/aliyun/oss.go | 1 + components/file/oss.go | 15 +- spec/proto/extension/v1/oss.pb.go | 2419 +++++++++++++------------ spec/proto/extension/v1/oss.proto | 6 +- 6 files changed, 1257 insertions(+), 1199 deletions(-) diff --git a/components/file/aliyun/option.go b/components/file/aliyun/option.go index 0dc44e5751..2dd2f164be 100644 --- a/components/file/aliyun/option.go +++ b/components/file/aliyun/option.go @@ -127,6 +127,19 @@ func ContentDisposition(value string) oss.Option { return oss.ContentDisposition(value) } +// SetTagging is an option to set object tagging +func SetTagging(value map[string]string) oss.Option { + if value == nil { + return nil + } + tagging := oss.Tagging{} + for k, v := range value { + tag := oss.Tag{Key: k, Value: v} + tagging.Tags = append(tagging.Tags, tag) + } + return oss.SetTagging(tagging) +} + // ContentLanguage is an option to set Content-Language header func ContentLanguage(value string) oss.Option { if value == "" { diff --git a/components/file/aliyun/option_test.go b/components/file/aliyun/option_test.go index a3dd48e22c..0b78ed18bd 100644 --- a/components/file/aliyun/option_test.go +++ b/components/file/aliyun/option_test.go @@ -79,6 +79,7 @@ func TestOptionNil(t *testing.T) { assert.Nil(t, Process("")) assert.Nil(t, TrafficLimitParam(0)) assert.Nil(t, RequestPayer("")) + assert.Nil(t, SetTagging(nil)) } func TestOptionNotNil(t *testing.T) { @@ -141,4 +142,5 @@ func TestOptionNotNil(t *testing.T) { assert.NotNil(t, SetHeader(" ", " ")) assert.NotNil(t, AddParam(" ", " ")) assert.NotNil(t, RequestPayer(" ")) + assert.NotNil(t, SetTagging(map[string]string{"k": "v"})) } diff --git a/components/file/aliyun/oss.go b/components/file/aliyun/oss.go index a5c6243747..72235ce3fa 100644 --- a/components/file/aliyun/oss.go +++ b/components/file/aliyun/oss.go @@ -127,6 +127,7 @@ func (a *AliyunOSS) PutObject(ctx context.Context, req *file.PutObjectInput) (*f Expires(req.Expires), ServerSideEncryption(req.ServerSideEncryption), ObjectACL(req.ACL), + SetTagging(req.Tagging), } for k, v := range req.Meta { o := oss.Meta(k, v) diff --git a/components/file/oss.go b/components/file/oss.go index b6cc267fc7..70091ab1b2 100644 --- a/components/file/oss.go +++ b/components/file/oss.go @@ -126,6 +126,7 @@ type PutObjectInput struct { ServerSideEncryption string `json:"server_side_encryption,omitempty"` SignedUrl string `json:"signed_url,omitempty"` Meta map[string]string `json:"meta,omitempty"` + Tagging map[string]string `json:"tagging,omitempty"` } type PutObjectOutput struct { @@ -188,12 +189,12 @@ type CopySource struct { } type CopyObjectInput struct { - Uid string `json:"uid,omitempty"` - Bucket string `json:"bucket,omitempty"` - Key string `json:"key,omitempty"` - CopySource *CopySource `json:"copy_source,omitempty"` - Tagging string `json:"tagging,omitempty"` - Expires int64 `json:"expires,omitempty"` + Uid string `json:"uid,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` + CopySource *CopySource `json:"copy_source,omitempty"` + Tagging map[string]string `json:"tagging,omitempty"` + Expires int64 `json:"expires,omitempty"` // Specifies whether the metadata is copied from the source object or replaced with metadata provided in the request. MetadataDirective string `json:"metadata_directive,omitempty"` // A map of metadata to store with the object in S3. @@ -331,7 +332,7 @@ type CreateMultipartUploadInput struct { SSEKMSKeyId string `json:"sse_kms_key_id,omitempty"` ServerSideEncryption string `json:"server_side_encryption,omitempty"` StorageClass string `json:"storage_class,omitempty"` - Tagging string `json:"tagging,omitempty"` + Tagging map[string]string `json:"tagging,omitempty"` WebsiteRedirectLocation string `json:"website_redirect_location,omitempty"` } type CreateMultipartUploadOutput struct { diff --git a/spec/proto/extension/v1/oss.pb.go b/spec/proto/extension/v1/oss.pb.go index 3e5a8064a5..ce431908a5 100644 --- a/spec/proto/extension/v1/oss.pb.go +++ b/spec/proto/extension/v1/oss.pb.go @@ -621,6 +621,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"` // Specify the client used for request Uid string `protobuf:"bytes,14,opt,name=uid,proto3" json:"uid,omitempty"` + // The tag-set for the object. The tag-set must be encoded as URL Query parameters. + Tagging map[string]string `protobuf:"bytes,15,rep,name=tagging,proto3" json:"tagging,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *PutObjectInput) Reset() { @@ -753,6 +755,13 @@ func (x *PutObjectInput) GetUid() string { return "" } +func (x *PutObjectInput) GetTagging() map[string]string { + if x != nil { + return x.Tagging + } + return nil +} + type PutObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1563,7 +1572,7 @@ type CopyObjectInput struct { // The tag-set for the object destination object this value must be used in // conjunction with the TaggingDirective. The tag-set must be encoded as URL Query // parameters. - Tagging string `protobuf:"bytes,5,opt,name=tagging,proto3" json:"tagging,omitempty"` + Tagging map[string]string `protobuf:"bytes,5,rep,name=tagging,proto3" json:"tagging,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // The date and time at which the object is no longer cacheable. Expires int64 `protobuf:"varint,6,opt,name=expires,proto3" json:"expires,omitempty"` // Specifies whether the metadata is copied from the source object or replaced with metadata provided in the request. @@ -1634,11 +1643,11 @@ func (x *CopyObjectInput) GetCopySource() *CopySource { return nil } -func (x *CopyObjectInput) GetTagging() string { +func (x *CopyObjectInput) GetTagging() map[string]string { if x != nil { return x.Tagging } - return "" + return nil } func (x *CopyObjectInput) GetExpires() int64 { @@ -2999,8 +3008,8 @@ type CreateMultipartUploadInput struct { ServerSideEncryption string `protobuf:"bytes,27,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` 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 string `protobuf:"bytes,29,opt,name=tagging,proto3" json:"tagging,omitempty"` - WebsiteRedirectLocation string `protobuf:"bytes,30,opt,name=website_redirect_location,json=websiteRedirectLocation,proto3" json:"website_redirect_location,omitempty"` + 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"` + WebsiteRedirectLocation string `protobuf:"bytes,30,opt,name=website_redirect_location,json=websiteRedirectLocation,proto3" json:"website_redirect_location,omitempty"` // Specify the client used for request Uid string `protobuf:"bytes,31,opt,name=uid,proto3" json:"uid,omitempty"` } @@ -3233,11 +3242,11 @@ func (x *CreateMultipartUploadInput) GetStorageClass() string { return "" } -func (x *CreateMultipartUploadInput) GetTagging() string { +func (x *CreateMultipartUploadInput) GetTagging() map[string]string { if x != nil { return x.Tagging } - return "" + return nil } func (x *CreateMultipartUploadInput) GetWebsiteRedirectLocation() string { @@ -6510,7 +6519,7 @@ var file_oss_proto_rawDesc = []byte{ 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, 0xaf, 0x04, 0x0a, 0x0e, 0x50, 0x75, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbb, 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, @@ -6542,94 +6551,75 @@ var file_oss_proto_rawDesc = []byte{ 0x31, 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, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, - 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x69, 0x64, 0x12, 0x4e, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x0f, 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, 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, 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, 0xb2, 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, 0x12, 0x10, 0x0a, 0x03, - 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0x98, 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, 0x4c, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 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, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x75, 0x69, 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, 0xe8, 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, 0x6c, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 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, 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, 0xc8, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x75, 0x69, 0x64, 0x22, 0xee, 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, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 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, 0xb2, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0x98, + 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, 0x4c, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 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, 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, 0x12, 0x10, + 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0xe8, 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, 0x6c, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 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, 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, @@ -6637,541 +6627,656 @@ var file_oss_proto_rawDesc = []byte{ 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, 0xea, 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, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc8, 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, 0x12, 0x10, 0x0a, + 0x03, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, + 0xee, 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, 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, + 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, 0xea, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xf0, 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, 0x4d, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, + 0x18, 0x01, 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, 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, 0x6c, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 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, 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, 0x99, 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, 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, 0x12, - 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, - 0x64, 0x22, 0xf0, 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, 0x4d, 0x0a, 0x04, - 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 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, 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, 0x6c, 0x0a, 0x0f, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 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, 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, 0xa6, - 0x03, 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, 0x44, 0x0a, 0x0b, 0x63, - 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x23, 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, 0x43, 0x6f, 0x70, 0x79, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 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, 0x52, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 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, 0xaa, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x57, 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, 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, - 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, 0x63, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x07, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 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, 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, 0xbb, 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, 0x37, 0x0a, 0x06, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4f, 0x0a, + 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 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, 0x52, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 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, 0x57, 0x0a, 0x13, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x12, 0x40, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, - 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, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x22, 0xc1, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xdf, 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, 0x3b, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, + 0x2e, 0x76, 0x31, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 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, 0xaa, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x57, 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, 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, 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, 0x63, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x07, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 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, 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, 0xbb, 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, 0x37, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 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, 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, 0xc2, 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, 0x34, 0x0a, 0x05, 0x6f, - 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x73, 0x70, 0x65, + 0x76, 0x31, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 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, 0x57, 0x0a, 0x13, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x12, 0x40, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 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, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x22, 0xc1, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xdf, 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, 0x3b, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 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, 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, 0xc2, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, + 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0x93, 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, 0x12, 0x10, 0x0a, + 0x03, 0x75, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, + 0x98, 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, 0x34, 0x0a, 0x05, 0x6f, + 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0x93, 0x01, 0x0a, 0x17, 0x47, - 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, + 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, 0xa5, 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, - 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, 0x10, - 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, - 0x22, 0x98, 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, 0x34, 0x0a, 0x05, - 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0xa5, 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, + 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, + 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, + 0x69, 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, 0x8e, 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, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0x81, 0x0c, 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, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x75, 0x69, 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, 0x8e, 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, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0x83, 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, 0x5e, 0x0a, 0x09, 0x6d, 0x65, 0x74, - 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 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, 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, 0x18, 0x0a, 0x07, 0x74, 0x61, - 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 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, - 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, - 0x69, 0x64, 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, - 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, - 0xf0, 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, - 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, - 0x69, 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, 0xb8, 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, 0x44, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 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, 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, 0x12, 0x10, 0x0a, - 0x03, 0x75, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 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, 0xb7, 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, 0x51, 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, 0x27, 0x2e, 0x73, 0x70, + 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, 0x5e, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 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, 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, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 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, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, + 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, 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, 0x58, 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, 0x3c, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 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, - 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, - 0x61, 0x72, 0x74, 0x73, 0x22, 0xcd, 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, 0x5c, 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, 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, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x75, 0x69, 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, + 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, 0x5a, 0x0a, 0x07, 0x74, 0x61, 0x67, + 0x67, 0x69, 0x6e, 0x67, 0x18, 0x1d, 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, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x75, 0x69, 0x64, 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, 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, 0xf0, 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, 0x12, 0x10, 0x0a, + 0x03, 0x75, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0xb8, 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, 0x44, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 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, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, + 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 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, 0xb7, 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, 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, + 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, 0x51, + 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, 0x27, 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, 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, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x65, 0x72, + 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, 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, 0xec, 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, 0x12, 0x10, 0x0a, - 0x03, 0x75, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0xdd, 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, 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, 0x58, 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, 0x3c, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, + 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, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, + 0x73, 0x22, 0xcd, 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, 0x5c, 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, 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, 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, 0x12, + 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, + 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, 0xec, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, + 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0xdd, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x75, 0x69, 0x64, 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, 0xfb, 0x01, 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, 0x40, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, + 0x6f, 0x72, 0x18, 0x02, 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, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, + 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0xe4, 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, 0x42, 0x0a, 0x07, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, + 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, + 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, 0xd7, 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, @@ -7185,520 +7290,448 @@ var file_oss_proto_rawDesc = []byte{ 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 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, 0xfb, 0x01, 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, 0x40, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, - 0x69, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 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, 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, 0x34, 0x0a, 0x05, + 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, + 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, + 0x69, 0x64, 0x22, 0xbc, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0xe4, 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, 0x42, 0x0a, 0x07, 0x75, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 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, 0xd7, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xbc, 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, - 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, - 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, 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, 0x85, 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, 0x34, - 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0xaf, 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, 0x51, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x73, 0x70, 0x65, + 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, 0x85, 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, 0x34, 0x0a, 0x05, 0x6f, + 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 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, 0x42, 0x0a, 0x08, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 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, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xf9, - 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, - 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xbd, 0x01, 0x0a, 0x10, 0x48, - 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, - 0x66, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 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, 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, 0x8e, 0x01, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0xa7, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 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, 0xce, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xde, 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, 0x48, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, - 0x18, 0x0f, 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, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x75, 0x69, 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, 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, 0xac, 0x02, 0x0a, - 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, + 0x6e, 0x2e, 0x76, 0x31, 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, 0xaf, 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, + 0x51, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, + 0x73, 0x18, 0x02, 0x20, 0x03, 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, 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, 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, 0x42, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 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, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xf9, 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, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0x84, 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, 0x33, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1d, 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, 0x50, 0x61, 0x72, - 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x32, 0xff, 0x17, 0x0a, 0x14, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x4a, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, - 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, 0x49, 0x6e, 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, 0x62, 0x0a, - 0x09, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x1a, 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, 0x50, 0x75, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, - 0x01, 0x12, 0x62, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, - 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x69, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, + 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x11, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xbd, 0x01, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x64, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x66, 0x0a, 0x0f, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 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, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, - 0x12, 0x75, 0x0a, 0x10, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, - 0x67, 0x69, 0x6e, 0x67, 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, 0x50, - 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 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, 0x7e, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x31, + 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, 0x8e, 0x01, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0xa7, + 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 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, 0xce, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xde, 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, 0x48, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0f, 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, 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, 0x12, + 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, + 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, 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, 0xac, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0x84, + 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, 0x33, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1d, 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, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, + 0x70, 0x61, 0x72, 0x74, 0x73, 0x32, 0xff, 0x17, 0x0a, 0x14, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4a, + 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 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, 0x49, 0x6e, 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, 0x62, 0x0a, 0x09, 0x50, 0x75, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x1a, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x62, + 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x47, + 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x69, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x75, 0x0a, + 0x10, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, + 0x67, 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, 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, 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, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2e, 0x2e, 0x73, 0x70, + 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, 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, 0x7e, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, - 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 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, 0x63, - 0x0a, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 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, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x73, 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, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 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, 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, 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, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, + 0x69, 0x6e, 0x67, 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, 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, 0x63, 0x0a, 0x0a, 0x43, + 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x43, 0x6f, + 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, + 0x12, 0x6c, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x73, 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, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, - 0x00, 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x12, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x12, 0x47, 0x65, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, - 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x1a, 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, 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, 0x7b, 0x0a, 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, + 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x66, + 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 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, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 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, 0x6c, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 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, 0x52, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, - 0x00, 0x12, 0x84, 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, 0x33, 0x2e, 0x73, 0x70, + 0x74, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, + 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 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, 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, 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, 0x65, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, - 0x6f, 0x0a, 0x0e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, - 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, - 0x12, 0x8a, 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, 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, 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, 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, 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, 0x81, 0x01, - 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 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, 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, 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, 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, 0x81, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, - 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 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, 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, 0x33, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 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, 0x6c, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 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, 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, 0x7b, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 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, 0x63, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 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, 0x48, 0x65, 0x61, 0x64, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x49, 0x73, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x12, 0x2b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x84, + 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, 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, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 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, - 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x07, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, - 0x12, 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, 0x53, 0x69, 0x67, 0x6e, 0x55, - 0x52, 0x4c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, - 0x00, 0x12, 0x74, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x4c, - 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 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, - 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, 0x72, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x55, 0x70, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, - 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x36, 0x2e, 0x73, 0x70, 0x65, 0x63, + 0x76, 0x31, 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, 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, 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, 0x65, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x61, 0x72, 0x74, 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, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, + 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x0e, + 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, + 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x8a, 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, 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, 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, 0x6b, 0x0a, 0x0c, 0x41, - 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2a, 0x2e, 0x73, 0x70, + 0x2e, 0x76, 0x31, 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, 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, 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, 0x81, 0x01, 0x0a, 0x14, 0x41, + 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x12, 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, 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, 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, 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, 0x81, + 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, + 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 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, 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, 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, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 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, 0x7b, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 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, + 0x63, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 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, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x60, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, - 0x50, 0x61, 0x72, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, + 0x31, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x45, 0x78, 0x69, 0x73, 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, - 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, - 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x49, 0x73, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x07, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x12, 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, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x53, + 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x74, + 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x4c, 0x6f, 0x61, 0x64, + 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 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, 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, 0x72, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x70, + 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, + 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 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, 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, 0x6b, 0x0a, 0x0c, 0x41, 0x70, 0x70, 0x65, + 0x6e, 0x64, 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, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 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, 0x41, + 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x60, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, + 0x74, 0x73, 0x12, 0x27, 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, 0x4c, 0x69, 0x73, + 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -7713,7 +7746,7 @@ func file_oss_proto_rawDescGZIP() []byte { return file_oss_proto_rawDescData } -var file_oss_proto_msgTypes = make([]protoimpl.MessageInfo, 77) +var file_oss_proto_msgTypes = make([]protoimpl.MessageInfo, 80) var file_oss_proto_goTypes = []interface{}{ (*InitInput)(nil), // 0: spec.proto.extension.v1.InitInput (*GetObjectInput)(nil), // 1: spec.proto.extension.v1.GetObjectInput @@ -7783,109 +7816,115 @@ var file_oss_proto_goTypes = []interface{}{ nil, // 65: spec.proto.extension.v1.InitInput.MetadataEntry nil, // 66: spec.proto.extension.v1.GetObjectOutput.MetadataEntry nil, // 67: spec.proto.extension.v1.PutObjectInput.MetaEntry - nil, // 68: spec.proto.extension.v1.PutObjectTaggingInput.TagsEntry - nil, // 69: spec.proto.extension.v1.PutObjectTaggingOutput.ResultMetadataEntry - nil, // 70: spec.proto.extension.v1.DeleteObjectTaggingOutput.ResultMetadataEntry - nil, // 71: spec.proto.extension.v1.GetObjectTaggingOutput.TagsEntry - nil, // 72: spec.proto.extension.v1.GetObjectTaggingOutput.ResultMetadataEntry - nil, // 73: spec.proto.extension.v1.CopyObjectInput.MetadataEntry - nil, // 74: spec.proto.extension.v1.CreateMultipartUploadInput.MetaDataEntry - nil, // 75: spec.proto.extension.v1.HeadObjectOutput.ResultMetadataEntry - nil, // 76: spec.proto.extension.v1.AppendObjectInput.TagsEntry - (*emptypb.Empty)(nil), // 77: google.protobuf.Empty + nil, // 68: spec.proto.extension.v1.PutObjectInput.TaggingEntry + nil, // 69: spec.proto.extension.v1.PutObjectTaggingInput.TagsEntry + nil, // 70: spec.proto.extension.v1.PutObjectTaggingOutput.ResultMetadataEntry + nil, // 71: spec.proto.extension.v1.DeleteObjectTaggingOutput.ResultMetadataEntry + nil, // 72: spec.proto.extension.v1.GetObjectTaggingOutput.TagsEntry + nil, // 73: spec.proto.extension.v1.GetObjectTaggingOutput.ResultMetadataEntry + nil, // 74: spec.proto.extension.v1.CopyObjectInput.TaggingEntry + nil, // 75: spec.proto.extension.v1.CopyObjectInput.MetadataEntry + nil, // 76: spec.proto.extension.v1.CreateMultipartUploadInput.MetaDataEntry + nil, // 77: spec.proto.extension.v1.CreateMultipartUploadInput.TaggingEntry + nil, // 78: spec.proto.extension.v1.HeadObjectOutput.ResultMetadataEntry + nil, // 79: spec.proto.extension.v1.AppendObjectInput.TagsEntry + (*emptypb.Empty)(nil), // 80: google.protobuf.Empty } var file_oss_proto_depIdxs = []int32{ 65, // 0: spec.proto.extension.v1.InitInput.metadata:type_name -> spec.proto.extension.v1.InitInput.MetadataEntry 66, // 1: spec.proto.extension.v1.GetObjectOutput.metadata:type_name -> spec.proto.extension.v1.GetObjectOutput.MetadataEntry 67, // 2: spec.proto.extension.v1.PutObjectInput.meta:type_name -> spec.proto.extension.v1.PutObjectInput.MetaEntry - 68, // 3: spec.proto.extension.v1.PutObjectTaggingInput.tags:type_name -> spec.proto.extension.v1.PutObjectTaggingInput.TagsEntry - 69, // 4: spec.proto.extension.v1.PutObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.PutObjectTaggingOutput.ResultMetadataEntry - 70, // 5: spec.proto.extension.v1.DeleteObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.DeleteObjectTaggingOutput.ResultMetadataEntry - 71, // 6: spec.proto.extension.v1.GetObjectTaggingOutput.tags:type_name -> spec.proto.extension.v1.GetObjectTaggingOutput.TagsEntry - 72, // 7: spec.proto.extension.v1.GetObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.GetObjectTaggingOutput.ResultMetadataEntry - 13, // 8: spec.proto.extension.v1.CopyObjectInput.copy_source:type_name -> spec.proto.extension.v1.CopySource - 73, // 9: spec.proto.extension.v1.CopyObjectInput.metadata:type_name -> spec.proto.extension.v1.CopyObjectInput.MetadataEntry - 15, // 10: spec.proto.extension.v1.CopyObjectOutput.copy_object_result:type_name -> spec.proto.extension.v1.CopyObjectResult - 18, // 11: spec.proto.extension.v1.Delete.objects:type_name -> spec.proto.extension.v1.ObjectIdentifier - 17, // 12: spec.proto.extension.v1.DeleteObjectsInput.delete:type_name -> spec.proto.extension.v1.Delete - 20, // 13: spec.proto.extension.v1.DeleteObjectsOutput.deleted:type_name -> spec.proto.extension.v1.DeletedObject - 25, // 14: spec.proto.extension.v1.ListObjectsOutput.contents:type_name -> spec.proto.extension.v1.Object - 24, // 15: spec.proto.extension.v1.Object.owner:type_name -> spec.proto.extension.v1.Owner - 24, // 16: spec.proto.extension.v1.GetObjectCannedAclOutput.owner:type_name -> spec.proto.extension.v1.Owner - 74, // 17: spec.proto.extension.v1.CreateMultipartUploadInput.meta_data:type_name -> spec.proto.extension.v1.CreateMultipartUploadInput.MetaDataEntry - 13, // 18: spec.proto.extension.v1.UploadPartCopyInput.copy_source:type_name -> spec.proto.extension.v1.CopySource - 37, // 19: spec.proto.extension.v1.UploadPartCopyOutput.copy_part_result:type_name -> spec.proto.extension.v1.CopyPartResult - 39, // 20: spec.proto.extension.v1.CompletedMultipartUpload.parts:type_name -> spec.proto.extension.v1.CompletedPart - 40, // 21: spec.proto.extension.v1.CompleteMultipartUploadInput.multipart_upload:type_name -> spec.proto.extension.v1.CompletedMultipartUpload - 46, // 22: spec.proto.extension.v1.MultipartUpload.initiator:type_name -> spec.proto.extension.v1.Initiator - 24, // 23: spec.proto.extension.v1.MultipartUpload.owner:type_name -> spec.proto.extension.v1.Owner - 47, // 24: spec.proto.extension.v1.ListMultipartUploadsOutput.uploads:type_name -> spec.proto.extension.v1.MultipartUpload - 24, // 25: spec.proto.extension.v1.DeleteMarkerEntry.owner:type_name -> spec.proto.extension.v1.Owner - 24, // 26: spec.proto.extension.v1.ObjectVersion.owner:type_name -> spec.proto.extension.v1.Owner - 50, // 27: spec.proto.extension.v1.ListObjectVersionsOutput.delete_markers:type_name -> spec.proto.extension.v1.DeleteMarkerEntry - 51, // 28: spec.proto.extension.v1.ListObjectVersionsOutput.versions:type_name -> spec.proto.extension.v1.ObjectVersion - 75, // 29: spec.proto.extension.v1.HeadObjectOutput.result_metadata:type_name -> spec.proto.extension.v1.HeadObjectOutput.ResultMetadataEntry - 76, // 30: spec.proto.extension.v1.AppendObjectInput.tags:type_name -> spec.proto.extension.v1.AppendObjectInput.TagsEntry - 63, // 31: spec.proto.extension.v1.ListPartsOutput.parts:type_name -> spec.proto.extension.v1.Part - 0, // 32: spec.proto.extension.v1.ObjectStorageService.InitClient:input_type -> spec.proto.extension.v1.InitInput - 3, // 33: spec.proto.extension.v1.ObjectStorageService.PutObject:input_type -> spec.proto.extension.v1.PutObjectInput - 1, // 34: spec.proto.extension.v1.ObjectStorageService.GetObject:input_type -> spec.proto.extension.v1.GetObjectInput - 5, // 35: spec.proto.extension.v1.ObjectStorageService.DeleteObject:input_type -> spec.proto.extension.v1.DeleteObjectInput - 7, // 36: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:input_type -> spec.proto.extension.v1.PutObjectTaggingInput - 9, // 37: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:input_type -> spec.proto.extension.v1.DeleteObjectTaggingInput - 11, // 38: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:input_type -> spec.proto.extension.v1.GetObjectTaggingInput - 14, // 39: spec.proto.extension.v1.ObjectStorageService.CopyObject:input_type -> spec.proto.extension.v1.CopyObjectInput - 19, // 40: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:input_type -> spec.proto.extension.v1.DeleteObjectsInput - 22, // 41: spec.proto.extension.v1.ObjectStorageService.ListObjects:input_type -> spec.proto.extension.v1.ListObjectsInput - 26, // 42: spec.proto.extension.v1.ObjectStorageService.GetObjectCannedAcl:input_type -> spec.proto.extension.v1.GetObjectCannedAclInput - 28, // 43: spec.proto.extension.v1.ObjectStorageService.PutObjectCannedAcl:input_type -> spec.proto.extension.v1.PutObjectCannedAclInput - 30, // 44: spec.proto.extension.v1.ObjectStorageService.RestoreObject:input_type -> spec.proto.extension.v1.RestoreObjectInput - 32, // 45: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:input_type -> spec.proto.extension.v1.CreateMultipartUploadInput - 34, // 46: spec.proto.extension.v1.ObjectStorageService.UploadPart:input_type -> spec.proto.extension.v1.UploadPartInput - 36, // 47: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:input_type -> spec.proto.extension.v1.UploadPartCopyInput - 41, // 48: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:input_type -> spec.proto.extension.v1.CompleteMultipartUploadInput - 43, // 49: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:input_type -> spec.proto.extension.v1.AbortMultipartUploadInput - 45, // 50: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:input_type -> spec.proto.extension.v1.ListMultipartUploadsInput - 49, // 51: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:input_type -> spec.proto.extension.v1.ListObjectVersionsInput - 53, // 52: spec.proto.extension.v1.ObjectStorageService.HeadObject:input_type -> spec.proto.extension.v1.HeadObjectInput - 55, // 53: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:input_type -> spec.proto.extension.v1.IsObjectExistInput - 57, // 54: spec.proto.extension.v1.ObjectStorageService.SignURL:input_type -> spec.proto.extension.v1.SignURLInput - 59, // 55: spec.proto.extension.v1.ObjectStorageService.UpdateDownLoadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput - 59, // 56: spec.proto.extension.v1.ObjectStorageService.UpdateUpLoadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput - 60, // 57: spec.proto.extension.v1.ObjectStorageService.AppendObject:input_type -> spec.proto.extension.v1.AppendObjectInput - 62, // 58: spec.proto.extension.v1.ObjectStorageService.ListParts:input_type -> spec.proto.extension.v1.ListPartsInput - 77, // 59: spec.proto.extension.v1.ObjectStorageService.InitClient:output_type -> google.protobuf.Empty - 4, // 60: spec.proto.extension.v1.ObjectStorageService.PutObject:output_type -> spec.proto.extension.v1.PutObjectOutput - 2, // 61: spec.proto.extension.v1.ObjectStorageService.GetObject:output_type -> spec.proto.extension.v1.GetObjectOutput - 6, // 62: spec.proto.extension.v1.ObjectStorageService.DeleteObject:output_type -> spec.proto.extension.v1.DeleteObjectOutput - 8, // 63: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:output_type -> spec.proto.extension.v1.PutObjectTaggingOutput - 10, // 64: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:output_type -> spec.proto.extension.v1.DeleteObjectTaggingOutput - 12, // 65: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:output_type -> spec.proto.extension.v1.GetObjectTaggingOutput - 16, // 66: spec.proto.extension.v1.ObjectStorageService.CopyObject:output_type -> spec.proto.extension.v1.CopyObjectOutput - 21, // 67: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:output_type -> spec.proto.extension.v1.DeleteObjectsOutput - 23, // 68: spec.proto.extension.v1.ObjectStorageService.ListObjects:output_type -> spec.proto.extension.v1.ListObjectsOutput - 27, // 69: spec.proto.extension.v1.ObjectStorageService.GetObjectCannedAcl:output_type -> spec.proto.extension.v1.GetObjectCannedAclOutput - 29, // 70: spec.proto.extension.v1.ObjectStorageService.PutObjectCannedAcl:output_type -> spec.proto.extension.v1.PutObjectCannedAclOutput - 31, // 71: spec.proto.extension.v1.ObjectStorageService.RestoreObject:output_type -> spec.proto.extension.v1.RestoreObjectOutput - 33, // 72: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:output_type -> spec.proto.extension.v1.CreateMultipartUploadOutput - 35, // 73: spec.proto.extension.v1.ObjectStorageService.UploadPart:output_type -> spec.proto.extension.v1.UploadPartOutput - 38, // 74: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:output_type -> spec.proto.extension.v1.UploadPartCopyOutput - 42, // 75: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:output_type -> spec.proto.extension.v1.CompleteMultipartUploadOutput - 44, // 76: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:output_type -> spec.proto.extension.v1.AbortMultipartUploadOutput - 48, // 77: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:output_type -> spec.proto.extension.v1.ListMultipartUploadsOutput - 52, // 78: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:output_type -> spec.proto.extension.v1.ListObjectVersionsOutput - 54, // 79: spec.proto.extension.v1.ObjectStorageService.HeadObject:output_type -> spec.proto.extension.v1.HeadObjectOutput - 56, // 80: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:output_type -> spec.proto.extension.v1.IsObjectExistOutput - 58, // 81: spec.proto.extension.v1.ObjectStorageService.SignURL:output_type -> spec.proto.extension.v1.SignURLOutput - 77, // 82: spec.proto.extension.v1.ObjectStorageService.UpdateDownLoadBandwidthRateLimit:output_type -> google.protobuf.Empty - 77, // 83: spec.proto.extension.v1.ObjectStorageService.UpdateUpLoadBandwidthRateLimit:output_type -> google.protobuf.Empty - 61, // 84: spec.proto.extension.v1.ObjectStorageService.AppendObject:output_type -> spec.proto.extension.v1.AppendObjectOutput - 64, // 85: spec.proto.extension.v1.ObjectStorageService.ListParts:output_type -> spec.proto.extension.v1.ListPartsOutput - 59, // [59:86] is the sub-list for method output_type - 32, // [32:59] is the sub-list for method input_type - 32, // [32:32] is the sub-list for extension type_name - 32, // [32:32] is the sub-list for extension extendee - 0, // [0:32] is the sub-list for field type_name + 68, // 3: spec.proto.extension.v1.PutObjectInput.tagging:type_name -> spec.proto.extension.v1.PutObjectInput.TaggingEntry + 69, // 4: spec.proto.extension.v1.PutObjectTaggingInput.tags:type_name -> spec.proto.extension.v1.PutObjectTaggingInput.TagsEntry + 70, // 5: spec.proto.extension.v1.PutObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.PutObjectTaggingOutput.ResultMetadataEntry + 71, // 6: spec.proto.extension.v1.DeleteObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.DeleteObjectTaggingOutput.ResultMetadataEntry + 72, // 7: spec.proto.extension.v1.GetObjectTaggingOutput.tags:type_name -> spec.proto.extension.v1.GetObjectTaggingOutput.TagsEntry + 73, // 8: spec.proto.extension.v1.GetObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.GetObjectTaggingOutput.ResultMetadataEntry + 13, // 9: spec.proto.extension.v1.CopyObjectInput.copy_source:type_name -> spec.proto.extension.v1.CopySource + 74, // 10: spec.proto.extension.v1.CopyObjectInput.tagging:type_name -> spec.proto.extension.v1.CopyObjectInput.TaggingEntry + 75, // 11: spec.proto.extension.v1.CopyObjectInput.metadata:type_name -> spec.proto.extension.v1.CopyObjectInput.MetadataEntry + 15, // 12: spec.proto.extension.v1.CopyObjectOutput.copy_object_result:type_name -> spec.proto.extension.v1.CopyObjectResult + 18, // 13: spec.proto.extension.v1.Delete.objects:type_name -> spec.proto.extension.v1.ObjectIdentifier + 17, // 14: spec.proto.extension.v1.DeleteObjectsInput.delete:type_name -> spec.proto.extension.v1.Delete + 20, // 15: spec.proto.extension.v1.DeleteObjectsOutput.deleted:type_name -> spec.proto.extension.v1.DeletedObject + 25, // 16: spec.proto.extension.v1.ListObjectsOutput.contents:type_name -> spec.proto.extension.v1.Object + 24, // 17: spec.proto.extension.v1.Object.owner:type_name -> spec.proto.extension.v1.Owner + 24, // 18: spec.proto.extension.v1.GetObjectCannedAclOutput.owner:type_name -> spec.proto.extension.v1.Owner + 76, // 19: spec.proto.extension.v1.CreateMultipartUploadInput.meta_data:type_name -> spec.proto.extension.v1.CreateMultipartUploadInput.MetaDataEntry + 77, // 20: spec.proto.extension.v1.CreateMultipartUploadInput.tagging:type_name -> spec.proto.extension.v1.CreateMultipartUploadInput.TaggingEntry + 13, // 21: spec.proto.extension.v1.UploadPartCopyInput.copy_source:type_name -> spec.proto.extension.v1.CopySource + 37, // 22: spec.proto.extension.v1.UploadPartCopyOutput.copy_part_result:type_name -> spec.proto.extension.v1.CopyPartResult + 39, // 23: spec.proto.extension.v1.CompletedMultipartUpload.parts:type_name -> spec.proto.extension.v1.CompletedPart + 40, // 24: spec.proto.extension.v1.CompleteMultipartUploadInput.multipart_upload:type_name -> spec.proto.extension.v1.CompletedMultipartUpload + 46, // 25: spec.proto.extension.v1.MultipartUpload.initiator:type_name -> spec.proto.extension.v1.Initiator + 24, // 26: spec.proto.extension.v1.MultipartUpload.owner:type_name -> spec.proto.extension.v1.Owner + 47, // 27: spec.proto.extension.v1.ListMultipartUploadsOutput.uploads:type_name -> spec.proto.extension.v1.MultipartUpload + 24, // 28: spec.proto.extension.v1.DeleteMarkerEntry.owner:type_name -> spec.proto.extension.v1.Owner + 24, // 29: spec.proto.extension.v1.ObjectVersion.owner:type_name -> spec.proto.extension.v1.Owner + 50, // 30: spec.proto.extension.v1.ListObjectVersionsOutput.delete_markers:type_name -> spec.proto.extension.v1.DeleteMarkerEntry + 51, // 31: spec.proto.extension.v1.ListObjectVersionsOutput.versions:type_name -> spec.proto.extension.v1.ObjectVersion + 78, // 32: spec.proto.extension.v1.HeadObjectOutput.result_metadata:type_name -> spec.proto.extension.v1.HeadObjectOutput.ResultMetadataEntry + 79, // 33: spec.proto.extension.v1.AppendObjectInput.tags:type_name -> spec.proto.extension.v1.AppendObjectInput.TagsEntry + 63, // 34: spec.proto.extension.v1.ListPartsOutput.parts:type_name -> spec.proto.extension.v1.Part + 0, // 35: spec.proto.extension.v1.ObjectStorageService.InitClient:input_type -> spec.proto.extension.v1.InitInput + 3, // 36: spec.proto.extension.v1.ObjectStorageService.PutObject:input_type -> spec.proto.extension.v1.PutObjectInput + 1, // 37: spec.proto.extension.v1.ObjectStorageService.GetObject:input_type -> spec.proto.extension.v1.GetObjectInput + 5, // 38: spec.proto.extension.v1.ObjectStorageService.DeleteObject:input_type -> spec.proto.extension.v1.DeleteObjectInput + 7, // 39: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:input_type -> spec.proto.extension.v1.PutObjectTaggingInput + 9, // 40: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:input_type -> spec.proto.extension.v1.DeleteObjectTaggingInput + 11, // 41: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:input_type -> spec.proto.extension.v1.GetObjectTaggingInput + 14, // 42: spec.proto.extension.v1.ObjectStorageService.CopyObject:input_type -> spec.proto.extension.v1.CopyObjectInput + 19, // 43: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:input_type -> spec.proto.extension.v1.DeleteObjectsInput + 22, // 44: spec.proto.extension.v1.ObjectStorageService.ListObjects:input_type -> spec.proto.extension.v1.ListObjectsInput + 26, // 45: spec.proto.extension.v1.ObjectStorageService.GetObjectCannedAcl:input_type -> spec.proto.extension.v1.GetObjectCannedAclInput + 28, // 46: spec.proto.extension.v1.ObjectStorageService.PutObjectCannedAcl:input_type -> spec.proto.extension.v1.PutObjectCannedAclInput + 30, // 47: spec.proto.extension.v1.ObjectStorageService.RestoreObject:input_type -> spec.proto.extension.v1.RestoreObjectInput + 32, // 48: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:input_type -> spec.proto.extension.v1.CreateMultipartUploadInput + 34, // 49: spec.proto.extension.v1.ObjectStorageService.UploadPart:input_type -> spec.proto.extension.v1.UploadPartInput + 36, // 50: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:input_type -> spec.proto.extension.v1.UploadPartCopyInput + 41, // 51: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:input_type -> spec.proto.extension.v1.CompleteMultipartUploadInput + 43, // 52: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:input_type -> spec.proto.extension.v1.AbortMultipartUploadInput + 45, // 53: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:input_type -> spec.proto.extension.v1.ListMultipartUploadsInput + 49, // 54: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:input_type -> spec.proto.extension.v1.ListObjectVersionsInput + 53, // 55: spec.proto.extension.v1.ObjectStorageService.HeadObject:input_type -> spec.proto.extension.v1.HeadObjectInput + 55, // 56: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:input_type -> spec.proto.extension.v1.IsObjectExistInput + 57, // 57: spec.proto.extension.v1.ObjectStorageService.SignURL:input_type -> spec.proto.extension.v1.SignURLInput + 59, // 58: spec.proto.extension.v1.ObjectStorageService.UpdateDownLoadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput + 59, // 59: spec.proto.extension.v1.ObjectStorageService.UpdateUpLoadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput + 60, // 60: spec.proto.extension.v1.ObjectStorageService.AppendObject:input_type -> spec.proto.extension.v1.AppendObjectInput + 62, // 61: spec.proto.extension.v1.ObjectStorageService.ListParts:input_type -> spec.proto.extension.v1.ListPartsInput + 80, // 62: spec.proto.extension.v1.ObjectStorageService.InitClient:output_type -> google.protobuf.Empty + 4, // 63: spec.proto.extension.v1.ObjectStorageService.PutObject:output_type -> spec.proto.extension.v1.PutObjectOutput + 2, // 64: spec.proto.extension.v1.ObjectStorageService.GetObject:output_type -> spec.proto.extension.v1.GetObjectOutput + 6, // 65: spec.proto.extension.v1.ObjectStorageService.DeleteObject:output_type -> spec.proto.extension.v1.DeleteObjectOutput + 8, // 66: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:output_type -> spec.proto.extension.v1.PutObjectTaggingOutput + 10, // 67: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:output_type -> spec.proto.extension.v1.DeleteObjectTaggingOutput + 12, // 68: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:output_type -> spec.proto.extension.v1.GetObjectTaggingOutput + 16, // 69: spec.proto.extension.v1.ObjectStorageService.CopyObject:output_type -> spec.proto.extension.v1.CopyObjectOutput + 21, // 70: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:output_type -> spec.proto.extension.v1.DeleteObjectsOutput + 23, // 71: spec.proto.extension.v1.ObjectStorageService.ListObjects:output_type -> spec.proto.extension.v1.ListObjectsOutput + 27, // 72: spec.proto.extension.v1.ObjectStorageService.GetObjectCannedAcl:output_type -> spec.proto.extension.v1.GetObjectCannedAclOutput + 29, // 73: spec.proto.extension.v1.ObjectStorageService.PutObjectCannedAcl:output_type -> spec.proto.extension.v1.PutObjectCannedAclOutput + 31, // 74: spec.proto.extension.v1.ObjectStorageService.RestoreObject:output_type -> spec.proto.extension.v1.RestoreObjectOutput + 33, // 75: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:output_type -> spec.proto.extension.v1.CreateMultipartUploadOutput + 35, // 76: spec.proto.extension.v1.ObjectStorageService.UploadPart:output_type -> spec.proto.extension.v1.UploadPartOutput + 38, // 77: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:output_type -> spec.proto.extension.v1.UploadPartCopyOutput + 42, // 78: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:output_type -> spec.proto.extension.v1.CompleteMultipartUploadOutput + 44, // 79: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:output_type -> spec.proto.extension.v1.AbortMultipartUploadOutput + 48, // 80: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:output_type -> spec.proto.extension.v1.ListMultipartUploadsOutput + 52, // 81: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:output_type -> spec.proto.extension.v1.ListObjectVersionsOutput + 54, // 82: spec.proto.extension.v1.ObjectStorageService.HeadObject:output_type -> spec.proto.extension.v1.HeadObjectOutput + 56, // 83: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:output_type -> spec.proto.extension.v1.IsObjectExistOutput + 58, // 84: spec.proto.extension.v1.ObjectStorageService.SignURL:output_type -> spec.proto.extension.v1.SignURLOutput + 80, // 85: spec.proto.extension.v1.ObjectStorageService.UpdateDownLoadBandwidthRateLimit:output_type -> google.protobuf.Empty + 80, // 86: spec.proto.extension.v1.ObjectStorageService.UpdateUpLoadBandwidthRateLimit:output_type -> google.protobuf.Empty + 61, // 87: spec.proto.extension.v1.ObjectStorageService.AppendObject:output_type -> spec.proto.extension.v1.AppendObjectOutput + 64, // 88: spec.proto.extension.v1.ObjectStorageService.ListParts:output_type -> spec.proto.extension.v1.ListPartsOutput + 62, // [62:89] is the sub-list for method output_type + 35, // [35:62] is the sub-list for method input_type + 35, // [35:35] is the sub-list for extension type_name + 35, // [35:35] is the sub-list for extension extendee + 0, // [0:35] is the sub-list for field type_name } func init() { file_oss_proto_init() } @@ -8681,7 +8720,7 @@ func file_oss_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_oss_proto_rawDesc, NumEnums: 0, - NumMessages: 77, + NumMessages: 80, NumExtensions: 0, NumServices: 1, }, diff --git a/spec/proto/extension/v1/oss.proto b/spec/proto/extension/v1/oss.proto index a8591f0f04..cd89b8ab52 100644 --- a/spec/proto/extension/v1/oss.proto +++ b/spec/proto/extension/v1/oss.proto @@ -201,6 +201,8 @@ message PutObjectInput{ map meta = 13; // Specify the client used for request string uid = 14; + // The tag-set for the object. The tag-set must be encoded as URL Query parameters. + map tagging = 15; } message PutObjectOutput{ // Indicates whether the uploaded object uses an S3 Bucket Key for server-side @@ -342,7 +344,7 @@ message CopyObjectInput{ // The tag-set for the object destination object this value must be used in // conjunction with the TaggingDirective. The tag-set must be encoded as URL Query // parameters. - string tagging = 5; + map tagging = 5; // The date and time at which the object is no longer cacheable. int64 expires = 6; // Specifies whether the metadata is copied from the source object or replaced with metadata provided in the request. @@ -573,7 +575,7 @@ message CreateMultipartUploadInput{ string server_side_encryption = 27; string storage_class = 28; // The tag-set for the object. The tag-set must be encoded as URL Query parameters. - string tagging = 29; + map tagging = 29; string website_redirect_location = 30; // Specify the client used for request string uid = 31; From ea375045b951ece75371e24f62676786a5d7b5d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 12 Jul 2022 16:51:08 +0800 Subject: [PATCH 074/126] add explanation for interface to help review code --- cmd/layotto/main.go | 3 -- components/file/aliyun/oss.go | 2 +- components/file/aws/oss.go | 2 +- components/file/oss.go | 2 +- components/file/types.go | 7 +++ pkg/mock/components/oss/oss.go | 2 +- pkg/runtime/config.go | 2 +- spec/proto/extension/v1/oss.pb.go | 5 +- spec/proto/extension/v1/oss.proto | 31 +++++++++++++ spec/proto/extension/v1/oss_grpc.pb.go | 63 +++++++++++++++++++++++++- 10 files changed, 107 insertions(+), 12 deletions(-) diff --git a/cmd/layotto/main.go b/cmd/layotto/main.go index e959c71f06..523830cde9 100644 --- a/cmd/layotto/main.go +++ b/cmd/layotto/main.go @@ -272,11 +272,8 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp ), runtime.WithOssFactory( file.NewOssFactory("awsOSS", aws.NewAwsOss), - ), - runtime.WithOssFactory( file.NewOssFactory("aliyunOSS", aliyun.NewAliyunOss), ), - // PubSub runtime.WithPubSubFactory( pubsub.NewFactory("redis", func() dapr_comp_pubsub.PubSub { diff --git a/components/file/aliyun/oss.go b/components/file/aliyun/oss.go index 72235ce3fa..b6f5317400 100644 --- a/components/file/aliyun/oss.go +++ b/components/file/aliyun/oss.go @@ -64,7 +64,7 @@ func AliyunDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string return clients, nil } -func (a *AliyunOSS) InitConfig(ctx context.Context, config *file.FileConfig) error { +func (a *AliyunOSS) InitConfig(ctx context.Context, config *file.OssConfig) error { a.method = config.Method a.rawData = config.Metadata return nil diff --git a/components/file/aws/oss.go b/components/file/aws/oss.go index 42896ed5df..7b05dfe260 100644 --- a/components/file/aws/oss.go +++ b/components/file/aws/oss.go @@ -87,7 +87,7 @@ func NewAwsOss() file.Oss { meta: make(map[string]*file.OssMetadata), } } -func (a *AwsOss) InitConfig(ctx context.Context, config *file.FileConfig) error { +func (a *AwsOss) InitConfig(ctx context.Context, config *file.OssConfig) error { a.method = config.Method a.rawData = config.Metadata return nil diff --git a/components/file/oss.go b/components/file/oss.go index 70091ab1b2..2687535c23 100644 --- a/components/file/oss.go +++ b/components/file/oss.go @@ -27,7 +27,7 @@ var ( ) type Oss interface { - InitConfig(context.Context, *FileConfig) error + InitConfig(context.Context, *OssConfig) error InitClient(context.Context, *InitRequest) error GetObject(context.Context, *GetObjectInput) (*GetObjectOutput, error) PutObject(context.Context, *PutObjectInput) (*PutObjectOutput, error) diff --git a/components/file/types.go b/components/file/types.go index ff1f240329..2afc2fa7be 100644 --- a/components/file/types.go +++ b/components/file/types.go @@ -38,6 +38,13 @@ type FileConfig struct { Type string `json:"type"` } +// FileConfig wraps configuration for a file implementation +type OssConfig struct { + Method string `json:"method"` + Metadata json.RawMessage `json:"metadata"` + Type string `json:"type"` +} + type PutFileStu struct { DataStream io.Reader FileName string diff --git a/pkg/mock/components/oss/oss.go b/pkg/mock/components/oss/oss.go index e4eec70f94..112212208b 100644 --- a/pkg/mock/components/oss/oss.go +++ b/pkg/mock/components/oss/oss.go @@ -231,7 +231,7 @@ func (mr *MockOssMockRecorder) InitClient(arg0, arg1 interface{}) *gomock.Call { } // InitConfig mocks base method. -func (m *MockOss) InitConfig(arg0 context.Context, arg1 *file.FileConfig) error { +func (m *MockOss) InitConfig(arg0 context.Context, arg1 *file.OssConfig) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "InitConfig", arg0, arg1) ret0, _ := ret[0].(error) diff --git a/pkg/runtime/config.go b/pkg/runtime/config.go index 926adc3729..4baf765227 100644 --- a/pkg/runtime/config.go +++ b/pkg/runtime/config.go @@ -50,7 +50,7 @@ type MosnRuntimeConfig struct { PubSubManagement map[string]pubsub.Config `json:"pub_subs"` StateManagement map[string]state.Config `json:"state"` Files map[string]file.FileConfig `json:"file"` - Oss map[string]file.FileConfig `json:"oss"` + Oss map[string]file.OssConfig `json:"oss"` LockManagement map[string]lock.Config `json:"lock"` SequencerManagement map[string]sequencer.Config `json:"sequencer"` Bindings map[string]bindings.Metadata `json:"bindings"` diff --git a/spec/proto/extension/v1/oss.pb.go b/spec/proto/extension/v1/oss.pb.go index ce431908a5..d9f535d24a 100644 --- a/spec/proto/extension/v1/oss.pb.go +++ b/spec/proto/extension/v1/oss.pb.go @@ -11,13 +11,12 @@ package s3 import ( - reflect "reflect" - sync "sync" - proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" + reflect "reflect" + sync "sync" ) const ( diff --git a/spec/proto/extension/v1/oss.proto b/spec/proto/extension/v1/oss.proto index cd89b8ab52..a815a906e8 100644 --- a/spec/proto/extension/v1/oss.proto +++ b/spec/proto/extension/v1/oss.proto @@ -10,32 +10,63 @@ import "google/protobuf/empty.proto"; option go_package = "mosn.io/layotto/spec/proto/extension/v1;s3"; service ObjectStorageService{ + //Init oss client rpc InitClient(InitInput) returns (google.protobuf.Empty){} + //Adds an object to a bucket.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html rpc PutObject(stream PutObjectInput) returns(PutObjectOutput){} + //Retrieves objects.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html rpc GetObject(GetObjectInput) returns (stream GetObjectOutput){} + //Delete objects.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html rpc DeleteObject(DeleteObjectInput) returns (DeleteObjectOutput){} + //Sets the supplied tag-set to an object that already exists in a bucket.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html rpc PutObjectTagging(PutObjectTaggingInput) returns (PutObjectTaggingOutput){} + //Removes the entire tag set from the specified object.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html rpc DeleteObjectTagging(DeleteObjectTaggingInput) returns(DeleteObjectTaggingOutput){} + //Returns the tag-set of an object.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObjectTagging.html rpc GetObjectTagging(GetObjectTaggingInput) returns(GetObjectTaggingOutput){} + //Creates a copy of an object that is already stored in oss server.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CopyObject.html rpc CopyObject(CopyObjectInput) returns(CopyObjectOutput){} + //Delete multiple objects from a bucket.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_DeleteObjects.html rpc DeleteObjects(DeleteObjectsInput) returns(DeleteObjectsOutput){} + //Returns some or all (up to 1,000) of the objects in a bucket.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_ListObjects.html rpc ListObjects(ListObjectsInput) returns(ListObjectsOutput){} + //Returns object canned acl.refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL rpc GetObjectCannedAcl(GetObjectCannedAclInput) returns(GetObjectCannedAclOutput){} + //Set object canned acl.refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL rpc PutObjectCannedAcl(PutObjectCannedAclInput) returns(PutObjectCannedAclOutput){} + //Restores an archived copy of an object back.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_RestoreObject.html rpc RestoreObject(RestoreObjectInput) returns(RestoreObjectOutput){} + //Initiates a multipart upload and returns an upload ID.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CreateMultipartUpload.html rpc CreateMultipartUpload(CreateMultipartUploadInput) returns(CreateMultipartUploadOutput){} + //Uploads a part in a multipart upload.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html rpc UploadPart(stream UploadPartInput) returns(UploadPartOutput){} + //Uploads a part by copying data from an existing object as data source.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html rpc UploadPartCopy(UploadPartCopyInput) returns(UploadPartCopyOutput){} + //Completes a multipart upload by assembling previously uploaded parts.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html rpc CompleteMultipartUpload(CompleteMultipartUploadInput) returns(CompleteMultipartUploadOutput){} + //This action aborts a multipart upload.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html rpc AbortMultipartUpload(AbortMultipartUploadInput) returns(AbortMultipartUploadOutput){} + //This action lists in-progress multipart uploads.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html rpc ListMultipartUploads(ListMultipartUploadsInput) returns(ListMultipartUploadsOutput){} + //Returns metadata about all versions of the objects in a bucket.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html rpc ListObjectVersions(ListObjectVersionsInput) returns(ListObjectVersionsOutput){} + //The HEAD action retrieves metadata from an object without returning the object itself. refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html rpc HeadObject(HeadObjectInput) returns(HeadObjectOutput){} + //This action used to check if the file exists. rpc IsObjectExist(IsObjectExistInput) returns(IsObjectExistOutput){} + //A presigned URL gives you access to the object identified in the URL, provided that the creator of the presigned URL has permissions to access that object. + //refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html rpc SignURL(SignURLInput) returns(SignURLOutput){} + //This action used to set download bandwidth limit speed. + //refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2106 rpc UpdateDownLoadBandwidthRateLimit(UpdateBandwidthRateLimitInput) returns(google.protobuf.Empty){} + //This action used to set upload bandwidth limit speed. + //refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2096 rpc UpdateUpLoadBandwidthRateLimit(UpdateBandwidthRateLimitInput) returns(google.protobuf.Empty){} + //This action used to append object. + //refer https://help.aliyun.com/document_detail/31981.html or https://github.com/minio/minio-java/issues/980 rpc AppendObject(stream AppendObjectInput) returns(AppendObjectOutput){} + //Lists the parts that have been uploaded for a specific multipart upload.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html rpc ListParts(ListPartsInput) returns(ListPartsOutput){} } diff --git a/spec/proto/extension/v1/oss_grpc.pb.go b/spec/proto/extension/v1/oss_grpc.pb.go index 32f88dc5ee..eddbf89155 100644 --- a/spec/proto/extension/v1/oss_grpc.pb.go +++ b/spec/proto/extension/v1/oss_grpc.pb.go @@ -4,7 +4,6 @@ package s3 import ( context "context" - grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -20,32 +19,63 @@ const _ = grpc.SupportPackageIsVersion7 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type ObjectStorageServiceClient interface { + //Init oss client InitClient(ctx context.Context, in *InitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) + //Adds an object to a bucket.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html PutObject(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_PutObjectClient, error) + //Retrieves objects.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (ObjectStorageService_GetObjectClient, error) + //Delete objects.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html DeleteObject(ctx context.Context, in *DeleteObjectInput, opts ...grpc.CallOption) (*DeleteObjectOutput, error) + //Sets the supplied tag-set to an object that already exists in a bucket.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html PutObjectTagging(ctx context.Context, in *PutObjectTaggingInput, opts ...grpc.CallOption) (*PutObjectTaggingOutput, error) + //Removes the entire tag set from the specified object.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html DeleteObjectTagging(ctx context.Context, in *DeleteObjectTaggingInput, opts ...grpc.CallOption) (*DeleteObjectTaggingOutput, error) + //Returns the tag-set of an object.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObjectTagging.html GetObjectTagging(ctx context.Context, in *GetObjectTaggingInput, opts ...grpc.CallOption) (*GetObjectTaggingOutput, error) + //Creates a copy of an object that is already stored in oss server.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CopyObject.html CopyObject(ctx context.Context, in *CopyObjectInput, opts ...grpc.CallOption) (*CopyObjectOutput, error) + //Delete multiple objects from a bucket.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_DeleteObjects.html DeleteObjects(ctx context.Context, in *DeleteObjectsInput, opts ...grpc.CallOption) (*DeleteObjectsOutput, error) + //Returns some or all (up to 1,000) of the objects in a bucket.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_ListObjects.html ListObjects(ctx context.Context, in *ListObjectsInput, opts ...grpc.CallOption) (*ListObjectsOutput, error) + //Returns object canned acl.refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL GetObjectCannedAcl(ctx context.Context, in *GetObjectCannedAclInput, opts ...grpc.CallOption) (*GetObjectCannedAclOutput, error) + //Set object canned acl.refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL PutObjectCannedAcl(ctx context.Context, in *PutObjectCannedAclInput, opts ...grpc.CallOption) (*PutObjectCannedAclOutput, error) + //Restores an archived copy of an object back.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_RestoreObject.html RestoreObject(ctx context.Context, in *RestoreObjectInput, opts ...grpc.CallOption) (*RestoreObjectOutput, error) + //Initiates a multipart upload and returns an upload ID.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CreateMultipartUpload.html CreateMultipartUpload(ctx context.Context, in *CreateMultipartUploadInput, opts ...grpc.CallOption) (*CreateMultipartUploadOutput, error) + //Uploads a part in a multipart upload.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html UploadPart(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_UploadPartClient, error) + //Uploads a part by copying data from an existing object as data source.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html UploadPartCopy(ctx context.Context, in *UploadPartCopyInput, opts ...grpc.CallOption) (*UploadPartCopyOutput, error) + //Completes a multipart upload by assembling previously uploaded parts.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html CompleteMultipartUpload(ctx context.Context, in *CompleteMultipartUploadInput, opts ...grpc.CallOption) (*CompleteMultipartUploadOutput, error) + //This action aborts a multipart upload.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html AbortMultipartUpload(ctx context.Context, in *AbortMultipartUploadInput, opts ...grpc.CallOption) (*AbortMultipartUploadOutput, error) + //This action lists in-progress multipart uploads.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html ListMultipartUploads(ctx context.Context, in *ListMultipartUploadsInput, opts ...grpc.CallOption) (*ListMultipartUploadsOutput, error) + //Returns metadata about all versions of the objects in a bucket.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html ListObjectVersions(ctx context.Context, in *ListObjectVersionsInput, opts ...grpc.CallOption) (*ListObjectVersionsOutput, error) + //The HEAD action retrieves metadata from an object without returning the object itself. refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html HeadObject(ctx context.Context, in *HeadObjectInput, opts ...grpc.CallOption) (*HeadObjectOutput, error) + //This action used to check if the file exists. IsObjectExist(ctx context.Context, in *IsObjectExistInput, opts ...grpc.CallOption) (*IsObjectExistOutput, error) + //A presigned URL gives you access to the object identified in the URL, provided that the creator of the presigned URL has permissions to access that object. + //refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html SignURL(ctx context.Context, in *SignURLInput, opts ...grpc.CallOption) (*SignURLOutput, error) + //This action used to set download bandwidth limit speed. + //refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2106 UpdateDownLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) + //This action used to set upload bandwidth limit speed. + //refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2096 UpdateUpLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) + //This action used to append object. + //refer https://help.aliyun.com/document_detail/31981.html or https://github.com/minio/minio-java/issues/980 AppendObject(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_AppendObjectClient, error) + //Lists the parts that have been uploaded for a specific multipart upload.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html ListParts(ctx context.Context, in *ListPartsInput, opts ...grpc.CallOption) (*ListPartsOutput, error) } @@ -402,32 +432,63 @@ func (c *objectStorageServiceClient) ListParts(ctx context.Context, in *ListPart // All implementations should embed UnimplementedObjectStorageServiceServer // for forward compatibility type ObjectStorageServiceServer interface { + //Init oss client InitClient(context.Context, *InitInput) (*emptypb.Empty, error) + //Adds an object to a bucket.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html PutObject(ObjectStorageService_PutObjectServer) error + //Retrieves objects.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html GetObject(*GetObjectInput, ObjectStorageService_GetObjectServer) error + //Delete objects.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html DeleteObject(context.Context, *DeleteObjectInput) (*DeleteObjectOutput, error) + //Sets the supplied tag-set to an object that already exists in a bucket.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html PutObjectTagging(context.Context, *PutObjectTaggingInput) (*PutObjectTaggingOutput, error) + //Removes the entire tag set from the specified object.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html DeleteObjectTagging(context.Context, *DeleteObjectTaggingInput) (*DeleteObjectTaggingOutput, error) + //Returns the tag-set of an object.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObjectTagging.html GetObjectTagging(context.Context, *GetObjectTaggingInput) (*GetObjectTaggingOutput, error) + //Creates a copy of an object that is already stored in oss server.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CopyObject.html CopyObject(context.Context, *CopyObjectInput) (*CopyObjectOutput, error) + //Delete multiple objects from a bucket.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_DeleteObjects.html DeleteObjects(context.Context, *DeleteObjectsInput) (*DeleteObjectsOutput, error) + //Returns some or all (up to 1,000) of the objects in a bucket.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_ListObjects.html ListObjects(context.Context, *ListObjectsInput) (*ListObjectsOutput, error) + //Returns object canned acl.refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL GetObjectCannedAcl(context.Context, *GetObjectCannedAclInput) (*GetObjectCannedAclOutput, error) + //Set object canned acl.refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL PutObjectCannedAcl(context.Context, *PutObjectCannedAclInput) (*PutObjectCannedAclOutput, error) + //Restores an archived copy of an object back.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_RestoreObject.html RestoreObject(context.Context, *RestoreObjectInput) (*RestoreObjectOutput, error) + //Initiates a multipart upload and returns an upload ID.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CreateMultipartUpload.html CreateMultipartUpload(context.Context, *CreateMultipartUploadInput) (*CreateMultipartUploadOutput, error) + //Uploads a part in a multipart upload.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html UploadPart(ObjectStorageService_UploadPartServer) error + //Uploads a part by copying data from an existing object as data source.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html UploadPartCopy(context.Context, *UploadPartCopyInput) (*UploadPartCopyOutput, error) + //Completes a multipart upload by assembling previously uploaded parts.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html CompleteMultipartUpload(context.Context, *CompleteMultipartUploadInput) (*CompleteMultipartUploadOutput, error) + //This action aborts a multipart upload.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html AbortMultipartUpload(context.Context, *AbortMultipartUploadInput) (*AbortMultipartUploadOutput, error) + //This action lists in-progress multipart uploads.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html ListMultipartUploads(context.Context, *ListMultipartUploadsInput) (*ListMultipartUploadsOutput, error) + //Returns metadata about all versions of the objects in a bucket.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html ListObjectVersions(context.Context, *ListObjectVersionsInput) (*ListObjectVersionsOutput, error) + //The HEAD action retrieves metadata from an object without returning the object itself. refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html HeadObject(context.Context, *HeadObjectInput) (*HeadObjectOutput, error) + //This action used to check if the file exists. IsObjectExist(context.Context, *IsObjectExistInput) (*IsObjectExistOutput, error) + //A presigned URL gives you access to the object identified in the URL, provided that the creator of the presigned URL has permissions to access that object. + //refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html SignURL(context.Context, *SignURLInput) (*SignURLOutput, error) + //This action used to set download bandwidth limit speed. + //refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2106 UpdateDownLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) + //This action used to set upload bandwidth limit speed. + //refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2096 UpdateUpLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) + //This action used to append object. + //refer https://help.aliyun.com/document_detail/31981.html or https://github.com/minio/minio-java/issues/980 AppendObject(ObjectStorageService_AppendObjectServer) error + //Lists the parts that have been uploaded for a specific multipart upload.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html ListParts(context.Context, *ListPartsInput) (*ListPartsOutput, error) } From edf6a83e8a8cae051de9e41def64de32f6c2fe37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Tue, 12 Jul 2022 17:03:35 +0800 Subject: [PATCH 075/126] add comments --- spec/proto/extension/v1/oss.proto | 71 ++++++++----- spec/proto/extension/v1/oss_grpc.pb.go | 142 ++++++++++++++++--------- 2 files changed, 138 insertions(+), 75 deletions(-) diff --git a/spec/proto/extension/v1/oss.proto b/spec/proto/extension/v1/oss.proto index a815a906e8..583ab88b16 100644 --- a/spec/proto/extension/v1/oss.proto +++ b/spec/proto/extension/v1/oss.proto @@ -12,61 +12,82 @@ option go_package = "mosn.io/layotto/spec/proto/extension/v1;s3"; service ObjectStorageService{ //Init oss client rpc InitClient(InitInput) returns (google.protobuf.Empty){} - //Adds an object to a bucket.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html + //Adds an object to a bucket. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html rpc PutObject(stream PutObjectInput) returns(PutObjectOutput){} - //Retrieves objects.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html + //Retrieves objects. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html rpc GetObject(GetObjectInput) returns (stream GetObjectOutput){} - //Delete objects.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html + //Delete objects. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html rpc DeleteObject(DeleteObjectInput) returns (DeleteObjectOutput){} - //Sets the supplied tag-set to an object that already exists in a bucket.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html + //Sets the supplied tag-set to an object that already exists in a bucket. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html rpc PutObjectTagging(PutObjectTaggingInput) returns (PutObjectTaggingOutput){} - //Removes the entire tag set from the specified object.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html + //Removes the entire tag set from the specified object. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html rpc DeleteObjectTagging(DeleteObjectTaggingInput) returns(DeleteObjectTaggingOutput){} - //Returns the tag-set of an object.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObjectTagging.html + //Returns the tag-set of an object. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObjectTagging.html rpc GetObjectTagging(GetObjectTaggingInput) returns(GetObjectTaggingOutput){} - //Creates a copy of an object that is already stored in oss server.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CopyObject.html + //Creates a copy of an object that is already stored in oss server. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CopyObject.html rpc CopyObject(CopyObjectInput) returns(CopyObjectOutput){} - //Delete multiple objects from a bucket.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_DeleteObjects.html + //Delete multiple objects from a bucket. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_DeleteObjects.html rpc DeleteObjects(DeleteObjectsInput) returns(DeleteObjectsOutput){} - //Returns some or all (up to 1,000) of the objects in a bucket.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_ListObjects.html + //Returns some or all (up to 1,000) of the objects in a bucket. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_ListObjects.html rpc ListObjects(ListObjectsInput) returns(ListObjectsOutput){} - //Returns object canned acl.refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL + //Returns object canned acl. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL rpc GetObjectCannedAcl(GetObjectCannedAclInput) returns(GetObjectCannedAclOutput){} - //Set object canned acl.refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL + //Set object canned acl. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL rpc PutObjectCannedAcl(PutObjectCannedAclInput) returns(PutObjectCannedAclOutput){} - //Restores an archived copy of an object back.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_RestoreObject.html + //Restores an archived copy of an object back. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_RestoreObject.html rpc RestoreObject(RestoreObjectInput) returns(RestoreObjectOutput){} - //Initiates a multipart upload and returns an upload ID.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CreateMultipartUpload.html + //Initiates a multipart upload and returns an upload ID. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CreateMultipartUpload.html rpc CreateMultipartUpload(CreateMultipartUploadInput) returns(CreateMultipartUploadOutput){} - //Uploads a part in a multipart upload.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html + //Uploads a part in a multipart upload. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html rpc UploadPart(stream UploadPartInput) returns(UploadPartOutput){} - //Uploads a part by copying data from an existing object as data source.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html + //Uploads a part by copying data from an existing object as data source. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html rpc UploadPartCopy(UploadPartCopyInput) returns(UploadPartCopyOutput){} - //Completes a multipart upload by assembling previously uploaded parts.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html + //Completes a multipart upload by assembling previously uploaded parts. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html rpc CompleteMultipartUpload(CompleteMultipartUploadInput) returns(CompleteMultipartUploadOutput){} - //This action aborts a multipart upload.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html + //This action aborts a multipart upload. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html rpc AbortMultipartUpload(AbortMultipartUploadInput) returns(AbortMultipartUploadOutput){} - //This action lists in-progress multipart uploads.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html + //This action lists in-progress multipart uploads. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html rpc ListMultipartUploads(ListMultipartUploadsInput) returns(ListMultipartUploadsOutput){} - //Returns metadata about all versions of the objects in a bucket.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html + //Returns metadata about all versions of the objects in a bucket. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html rpc ListObjectVersions(ListObjectVersionsInput) returns(ListObjectVersionsOutput){} - //The HEAD action retrieves metadata from an object without returning the object itself. refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html + //The HEAD action retrieves metadata from an object without returning the object itself. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html rpc HeadObject(HeadObjectInput) returns(HeadObjectOutput){} //This action used to check if the file exists. rpc IsObjectExist(IsObjectExistInput) returns(IsObjectExistOutput){} //A presigned URL gives you access to the object identified in the URL, provided that the creator of the presigned URL has permissions to access that object. - //refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html + //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html rpc SignURL(SignURLInput) returns(SignURLOutput){} //This action used to set download bandwidth limit speed. - //refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2106 + //Refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2106 rpc UpdateDownLoadBandwidthRateLimit(UpdateBandwidthRateLimitInput) returns(google.protobuf.Empty){} //This action used to set upload bandwidth limit speed. - //refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2096 + //Refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2096 rpc UpdateUpLoadBandwidthRateLimit(UpdateBandwidthRateLimitInput) returns(google.protobuf.Empty){} //This action used to append object. - //refer https://help.aliyun.com/document_detail/31981.html or https://github.com/minio/minio-java/issues/980 + //Refer https://help.aliyun.com/document_detail/31981.html or https://github.com/minio/minio-java/issues/980 rpc AppendObject(stream AppendObjectInput) returns(AppendObjectOutput){} - //Lists the parts that have been uploaded for a specific multipart upload.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html + //Lists the parts that have been uploaded for a specific multipart upload. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html rpc ListParts(ListPartsInput) returns(ListPartsOutput){} } diff --git a/spec/proto/extension/v1/oss_grpc.pb.go b/spec/proto/extension/v1/oss_grpc.pb.go index eddbf89155..89ae9666cc 100644 --- a/spec/proto/extension/v1/oss_grpc.pb.go +++ b/spec/proto/extension/v1/oss_grpc.pb.go @@ -21,61 +21,82 @@ const _ = grpc.SupportPackageIsVersion7 type ObjectStorageServiceClient interface { //Init oss client InitClient(ctx context.Context, in *InitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) - //Adds an object to a bucket.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html + //Adds an object to a bucket. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html PutObject(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_PutObjectClient, error) - //Retrieves objects.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html + //Retrieves objects. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html GetObject(ctx context.Context, in *GetObjectInput, opts ...grpc.CallOption) (ObjectStorageService_GetObjectClient, error) - //Delete objects.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html + //Delete objects. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html DeleteObject(ctx context.Context, in *DeleteObjectInput, opts ...grpc.CallOption) (*DeleteObjectOutput, error) - //Sets the supplied tag-set to an object that already exists in a bucket.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html + //Sets the supplied tag-set to an object that already exists in a bucket. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html PutObjectTagging(ctx context.Context, in *PutObjectTaggingInput, opts ...grpc.CallOption) (*PutObjectTaggingOutput, error) - //Removes the entire tag set from the specified object.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html + //Removes the entire tag set from the specified object. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html DeleteObjectTagging(ctx context.Context, in *DeleteObjectTaggingInput, opts ...grpc.CallOption) (*DeleteObjectTaggingOutput, error) - //Returns the tag-set of an object.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObjectTagging.html + //Returns the tag-set of an object. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObjectTagging.html GetObjectTagging(ctx context.Context, in *GetObjectTaggingInput, opts ...grpc.CallOption) (*GetObjectTaggingOutput, error) - //Creates a copy of an object that is already stored in oss server.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CopyObject.html + //Creates a copy of an object that is already stored in oss server. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CopyObject.html CopyObject(ctx context.Context, in *CopyObjectInput, opts ...grpc.CallOption) (*CopyObjectOutput, error) - //Delete multiple objects from a bucket.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_DeleteObjects.html + //Delete multiple objects from a bucket. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_DeleteObjects.html DeleteObjects(ctx context.Context, in *DeleteObjectsInput, opts ...grpc.CallOption) (*DeleteObjectsOutput, error) - //Returns some or all (up to 1,000) of the objects in a bucket.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_ListObjects.html + //Returns some or all (up to 1,000) of the objects in a bucket. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_ListObjects.html ListObjects(ctx context.Context, in *ListObjectsInput, opts ...grpc.CallOption) (*ListObjectsOutput, error) - //Returns object canned acl.refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL + //Returns object canned acl. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL GetObjectCannedAcl(ctx context.Context, in *GetObjectCannedAclInput, opts ...grpc.CallOption) (*GetObjectCannedAclOutput, error) - //Set object canned acl.refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL + //Set object canned acl. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL PutObjectCannedAcl(ctx context.Context, in *PutObjectCannedAclInput, opts ...grpc.CallOption) (*PutObjectCannedAclOutput, error) - //Restores an archived copy of an object back.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_RestoreObject.html + //Restores an archived copy of an object back. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_RestoreObject.html RestoreObject(ctx context.Context, in *RestoreObjectInput, opts ...grpc.CallOption) (*RestoreObjectOutput, error) - //Initiates a multipart upload and returns an upload ID.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CreateMultipartUpload.html + //Initiates a multipart upload and returns an upload ID. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CreateMultipartUpload.html CreateMultipartUpload(ctx context.Context, in *CreateMultipartUploadInput, opts ...grpc.CallOption) (*CreateMultipartUploadOutput, error) - //Uploads a part in a multipart upload.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html + //Uploads a part in a multipart upload. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html UploadPart(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_UploadPartClient, error) - //Uploads a part by copying data from an existing object as data source.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html + //Uploads a part by copying data from an existing object as data source. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html UploadPartCopy(ctx context.Context, in *UploadPartCopyInput, opts ...grpc.CallOption) (*UploadPartCopyOutput, error) - //Completes a multipart upload by assembling previously uploaded parts.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html + //Completes a multipart upload by assembling previously uploaded parts. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html CompleteMultipartUpload(ctx context.Context, in *CompleteMultipartUploadInput, opts ...grpc.CallOption) (*CompleteMultipartUploadOutput, error) - //This action aborts a multipart upload.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html + //This action aborts a multipart upload. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html AbortMultipartUpload(ctx context.Context, in *AbortMultipartUploadInput, opts ...grpc.CallOption) (*AbortMultipartUploadOutput, error) - //This action lists in-progress multipart uploads.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html + //This action lists in-progress multipart uploads. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html ListMultipartUploads(ctx context.Context, in *ListMultipartUploadsInput, opts ...grpc.CallOption) (*ListMultipartUploadsOutput, error) - //Returns metadata about all versions of the objects in a bucket.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html + //Returns metadata about all versions of the objects in a bucket. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html ListObjectVersions(ctx context.Context, in *ListObjectVersionsInput, opts ...grpc.CallOption) (*ListObjectVersionsOutput, error) - //The HEAD action retrieves metadata from an object without returning the object itself. refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html + //The HEAD action retrieves metadata from an object without returning the object itself. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html HeadObject(ctx context.Context, in *HeadObjectInput, opts ...grpc.CallOption) (*HeadObjectOutput, error) //This action used to check if the file exists. IsObjectExist(ctx context.Context, in *IsObjectExistInput, opts ...grpc.CallOption) (*IsObjectExistOutput, error) //A presigned URL gives you access to the object identified in the URL, provided that the creator of the presigned URL has permissions to access that object. - //refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html + //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html SignURL(ctx context.Context, in *SignURLInput, opts ...grpc.CallOption) (*SignURLOutput, error) //This action used to set download bandwidth limit speed. - //refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2106 + //Refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2106 UpdateDownLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) //This action used to set upload bandwidth limit speed. - //refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2096 + //Refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2096 UpdateUpLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) //This action used to append object. - //refer https://help.aliyun.com/document_detail/31981.html or https://github.com/minio/minio-java/issues/980 + //Refer https://help.aliyun.com/document_detail/31981.html or https://github.com/minio/minio-java/issues/980 AppendObject(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_AppendObjectClient, error) - //Lists the parts that have been uploaded for a specific multipart upload.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html + //Lists the parts that have been uploaded for a specific multipart upload. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html ListParts(ctx context.Context, in *ListPartsInput, opts ...grpc.CallOption) (*ListPartsOutput, error) } @@ -434,61 +455,82 @@ func (c *objectStorageServiceClient) ListParts(ctx context.Context, in *ListPart type ObjectStorageServiceServer interface { //Init oss client InitClient(context.Context, *InitInput) (*emptypb.Empty, error) - //Adds an object to a bucket.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html + //Adds an object to a bucket. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html PutObject(ObjectStorageService_PutObjectServer) error - //Retrieves objects.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html + //Retrieves objects. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html GetObject(*GetObjectInput, ObjectStorageService_GetObjectServer) error - //Delete objects.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html + //Delete objects. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html DeleteObject(context.Context, *DeleteObjectInput) (*DeleteObjectOutput, error) - //Sets the supplied tag-set to an object that already exists in a bucket.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html + //Sets the supplied tag-set to an object that already exists in a bucket. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html PutObjectTagging(context.Context, *PutObjectTaggingInput) (*PutObjectTaggingOutput, error) - //Removes the entire tag set from the specified object.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html + //Removes the entire tag set from the specified object. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html DeleteObjectTagging(context.Context, *DeleteObjectTaggingInput) (*DeleteObjectTaggingOutput, error) - //Returns the tag-set of an object.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObjectTagging.html + //Returns the tag-set of an object. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObjectTagging.html GetObjectTagging(context.Context, *GetObjectTaggingInput) (*GetObjectTaggingOutput, error) - //Creates a copy of an object that is already stored in oss server.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CopyObject.html + //Creates a copy of an object that is already stored in oss server. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CopyObject.html CopyObject(context.Context, *CopyObjectInput) (*CopyObjectOutput, error) - //Delete multiple objects from a bucket.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_DeleteObjects.html + //Delete multiple objects from a bucket. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_DeleteObjects.html DeleteObjects(context.Context, *DeleteObjectsInput) (*DeleteObjectsOutput, error) - //Returns some or all (up to 1,000) of the objects in a bucket.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_ListObjects.html + //Returns some or all (up to 1,000) of the objects in a bucket. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_ListObjects.html ListObjects(context.Context, *ListObjectsInput) (*ListObjectsOutput, error) - //Returns object canned acl.refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL + //Returns object canned acl. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL GetObjectCannedAcl(context.Context, *GetObjectCannedAclInput) (*GetObjectCannedAclOutput, error) - //Set object canned acl.refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL + //Set object canned acl. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL PutObjectCannedAcl(context.Context, *PutObjectCannedAclInput) (*PutObjectCannedAclOutput, error) - //Restores an archived copy of an object back.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_RestoreObject.html + //Restores an archived copy of an object back. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_RestoreObject.html RestoreObject(context.Context, *RestoreObjectInput) (*RestoreObjectOutput, error) - //Initiates a multipart upload and returns an upload ID.refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CreateMultipartUpload.html + //Initiates a multipart upload and returns an upload ID. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CreateMultipartUpload.html CreateMultipartUpload(context.Context, *CreateMultipartUploadInput) (*CreateMultipartUploadOutput, error) - //Uploads a part in a multipart upload.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html + //Uploads a part in a multipart upload. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html UploadPart(ObjectStorageService_UploadPartServer) error - //Uploads a part by copying data from an existing object as data source.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html + //Uploads a part by copying data from an existing object as data source. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html UploadPartCopy(context.Context, *UploadPartCopyInput) (*UploadPartCopyOutput, error) - //Completes a multipart upload by assembling previously uploaded parts.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html + //Completes a multipart upload by assembling previously uploaded parts. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html CompleteMultipartUpload(context.Context, *CompleteMultipartUploadInput) (*CompleteMultipartUploadOutput, error) - //This action aborts a multipart upload.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html + //This action aborts a multipart upload. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html AbortMultipartUpload(context.Context, *AbortMultipartUploadInput) (*AbortMultipartUploadOutput, error) - //This action lists in-progress multipart uploads.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html + //This action lists in-progress multipart uploads. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html ListMultipartUploads(context.Context, *ListMultipartUploadsInput) (*ListMultipartUploadsOutput, error) - //Returns metadata about all versions of the objects in a bucket.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html + //Returns metadata about all versions of the objects in a bucket. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html ListObjectVersions(context.Context, *ListObjectVersionsInput) (*ListObjectVersionsOutput, error) - //The HEAD action retrieves metadata from an object without returning the object itself. refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html + //The HEAD action retrieves metadata from an object without returning the object itself. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html HeadObject(context.Context, *HeadObjectInput) (*HeadObjectOutput, error) //This action used to check if the file exists. IsObjectExist(context.Context, *IsObjectExistInput) (*IsObjectExistOutput, error) //A presigned URL gives you access to the object identified in the URL, provided that the creator of the presigned URL has permissions to access that object. - //refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html + //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html SignURL(context.Context, *SignURLInput) (*SignURLOutput, error) //This action used to set download bandwidth limit speed. - //refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2106 + //Refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2106 UpdateDownLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) //This action used to set upload bandwidth limit speed. - //refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2096 + //Refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2096 UpdateUpLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) //This action used to append object. - //refer https://help.aliyun.com/document_detail/31981.html or https://github.com/minio/minio-java/issues/980 + //Refer https://help.aliyun.com/document_detail/31981.html or https://github.com/minio/minio-java/issues/980 AppendObject(ObjectStorageService_AppendObjectServer) error - //Lists the parts that have been uploaded for a specific multipart upload.refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html + //Lists the parts that have been uploaded for a specific multipart upload. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html ListParts(context.Context, *ListPartsInput) (*ListPartsOutput, error) } From 68b76ab7ddc0405da36281fa2ffe92a460a571cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 13 Jul 2022 11:44:16 +0800 Subject: [PATCH 076/126] add design document --- .../\346\265\201\347\250\213\345\233\276.png" | Bin 0 -> 764097 bytes .../\351\205\215\347\275\256\345\233\276.png" | Bin 0 -> 367744 bytes docs/zh/_sidebar.md | 1 + docs/zh/design/oss/oss-api-design.md | Bin 0 -> 14736 bytes 4 files changed, 1 insertion(+) create mode 100644 "docs/img/oss/\346\265\201\347\250\213\345\233\276.png" create mode 100644 "docs/img/oss/\351\205\215\347\275\256\345\233\276.png" create mode 100644 docs/zh/design/oss/oss-api-design.md diff --git "a/docs/img/oss/\346\265\201\347\250\213\345\233\276.png" "b/docs/img/oss/\346\265\201\347\250\213\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..3ac7a58b6cd2572388270797b21ab05c960e60ce GIT binary patch literal 764097 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%0Aq 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

D4b{g$N<9A&H5PthNIV?mg1h?m6SI?)GtQ+j+ z9&9q0$J^HgTfui&)z7NeW6c+zquRz1d_dFHiVc`sljf{D?{mr#>=LpUEd7gkllg$d z=*s8%NW3yTIouU7kwrr!A8ylHnu-U373@4>lhKiMkoTJRK>SCs8gmm*iOqDU&_?2; zPuFN-n%+p>a}mzDTI6t}fo6b)=mSraq{!!16E>b0e>^a4>@>vFpE+`WhARMO zUvAB={l6e2oGtr@N22&6`0Lh@JzC`Z^~;y z^q2%Lzqg>(OAm=d9tyUquZ@AQBCwHK-CU%O{xVtA!oM_$C-k}pAL}`ryI<`8DZ`z3FK7eh z!#WMA>BTPJ80F+foGF}R$cz*~Tpprj7-!u5>Q#kJUEj*B>=^e*J^(4tR~Lt5nL*8UG@!~A-sS>dcsSU{0%yg}}6+sBYZBO@z{�-2waVLCtN=J#E7a2v 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 -rhp>-)apJYXSf3Pza4y_z(nPz-)&c?}g> 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

  • F-EC~Yi#B(XL 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
    yjXZ2+r3Sd%bP^qX}OG;5|w2js3rIuQCQg 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

    BZfX)4 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 L@?OE6XYc+8F_?7_ literal 0 HcmV?d00001 diff --git "a/docs/img/oss/\351\205\215\347\275\256\345\233\276.png" "b/docs/img/oss/\351\205\215\347\275\256\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..7b9afe649ea6512b12dcfa5400250e451b0f411e GIT binary patch literal 367744 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�Vn2{-@p)X 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%0AjN!TC=D3yd2nBcmD!4O1ZsLW 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

    `(Q0eyUL>rf7A-DSglCMh1}Gzq|VY$oZD1 zAt_zTg2BC{@W4jH19wly)@-LysJn%S9aVDs(Q4?)`Z?2= zB&P{dHOI+){1_J#QRliIj6hN!JxcE;P#RXyqg7P;R-mg`yVS&8r6dBx&sR$8rZd4n z<5D2dZc7MWx&D;K1kd8s1Q^=6XW#NcvMK^kYq~_N zQ0ekWpds2s;{5aNoWIZJ!!X=&F!K)!xl1gt5ZXnnu%CU2c510N|D6cHW@PWYrpUhH zkyq*{T1g+CL_X^KQ{64U}o0R^uW(| zJKmvm?i`RY7M0pbscEX(OFiYce)xK4{?`-aS(}La5VhvY3G<&)ER#WB(n?TN&89%} z9hb?6JqgG-vnjfH2}7*xq}YA_jK)-x@a%g5NLCnO2~)=pJYI@I5f@0t1=q;YrJm|W`n?2AKtc?8g3 z6R^qq`+ZUpLZ{Z?c8w!EV4Z#cnrV;GI*+Kf?S$Kpf!}Wt^@>}o;PLx8Q9p1toQ^Gibs9T@%fS(8d*`S13NKA(yUSF z%H6Qto;W739*^~uc_i&EuURIp3g3{z?Ya~(XC#>=9}IBzfg4{xLYA~2l1}^_Lh$Yk zvk@#oYqMdfiGE0jiryfiV0WBxJO+bagjf_^wLD%F{1fUfKC##Ynfjht3#(^W3gowC zSZm>J5nW?wrWKo56FUC3oDis1<=$)j7)?u-4BJoi?A+~X$;OJ}i@z<01zenJm_J&a z8Cw16sH@;E8{XpCu1dZ?C?4SobIFzxN&un>U7EethK6|2>?GiAOGklB?}o#@K4|&1 z(VY&&mnzo-0e)wu(u^=88ur;$Tp`xEx@rjJh_N&S%Fk6NxDE>9u!qC^0*q@~?=~aO z{EzV04xfh#y;51Yc{ANvZcQ>>f2zM-8_Xo4yz}j59^JQaF_W{eaI;aaQtX=1d%UN2 zOwyLo&uJ97Zlfj9 zOis#D3pdG>B)lPiZzG#rh`i4t^QrJma}lB3wJ>^u;TjY{TG(F zIM-%O;*wU{0C^$fTG=HMYZj-v2Xl64zR$Fyg1AlatGU`=*GG$gdkw$O3yv?duZ~EF zPc=%dm}tJtKMu@og_Ehbja_$nU%jv=%u3pX75Jwm*AfWt zT_A%zaO*;=z9+m?E{|5VfnN5qPu9lPg(}j!X~uY=_Cmo>W){FTHO6}~2hkrW(-tKq zJU0vaJk`IDpF6o6sgfD~KqcIjuR@^=Zh0-xU7j+HTc+nLC_{t0vmimqkgW$D_uNdL zW-upiez35E)ixxa1tOpR;hUa7Y@KX;5x3T#e=p9|kCd6b$0vpQD%Q4~5ppy?T`LcRWr^zTu z3vzjI$InCglfwW!OrcRWkwHSO$}p}v^|q8+g}(bA4(qb*(3Melf#R}8AaCikmsel5 z*Ur|DH`~i4KFMW*^SINK{($ok#2fH4&+~(k=}orqRDm1;xZ6izCJ~!2;aLIc4PArh zzK<+0b;s8jg||lDI$f!!30=Y_PW4-Z)wbPfirAg$Rj7GzE{e-`T!5!=;V{^YRx_@7 z{g<=QHEt81*Y2Et5w(e21-49N&rECk!!ew}^}t$xFLIaoVP^!7%EV%GFSi}lW>(~N zvErBm%;dW_Pc(#pymW$HESt3@=?yruL^gms@CMbDfQZ|aIQ%AGbra#hF;fIQff#^NdU;p5L z9Pk&s--UbCE<6K$3k%{WJ=;L{rR1T$)wgkgs5p?Vcfqbo_UrdE*QMm_l%2l0V?2L# z5?VOc4tK9zlQXRn)@ zeyq)px7`~W;(3bSw(&5F+{}oF-Ixsk(M@Eq+mcqKf^7-*{$v6>F9$wJWn)z{4QXBy z1J;mppQO+aOLx43cw{ts&zvWbCIgG?OtW9s0#|AQ6eQkp>i)AF~Ump#6$P9RzmHgSwxG(jccXirt z)93LgD-rC9fchb(1ZXqYn(^ywS0I$=zXRqrtpFX?(coZ@bAbE5-n1kOjc4q4_S5YH zyfc0C%%nMwOcaA>#eYZq$ezGLZ+Z6*>#opvh8y89)oRZdCYeS z|Izle0~)q3x{W#1?G)VKG6IahUpi0od6Mrx6YdczsgyxB)aDbCSO8+$a-VM!=Rm=K zq+-7qp9+_Nx8k1RKWLr_PADc=gEp8cK^q4N?UeX8-hB_(Qu%JLBmlFj(bF@&er=0= z@8|hXyvzaEr!RL3O^SUTzWS}RF310Rt3xI9LU7WH8r0+hP;Ll zP*G7)BvM9g-aD%v_9!bxG*s+hCLfCao;sj4XM?&;-}>wUCI`lx<~6)GFh`X7JpvU= zx6nr2KmK~Si@GxtYU9-p@}Sw-bc)YXK^wJuq-RLbZ_-~o1P35%5l)crRI4P%1K8ev zXF{I6#dfa3_~NU2DRfR~C5TvLidRgOr_aM?L^&hK;yxY|8U+&87Hcz<|MTo!I5o|x zlf8X*^@cnGsLz2Y=F_=>N9FQ|8v32g8C?1{(RD{qv+7^y)s}!-)tDFj*B+4g_nhu*mC7`;WV!ArFTWoKTyOglx{?ry?#UQEXb7 zFIQJ?vm4`C_Ga=!7cs~RR|?1&E5jNpX&IGg#_==9;IEhZ3+1!&aBbh0CW576X=b=*#*j4RK$Rv1>1t@3MED^q4}>}GYyTC z5tup!p4T?7{*6OAGQlD9d7&CZ{}q;LJko*uSG?k|L@q=m-3Js106ItpL7fj|dQXmO z4e`d;8JR9Afw3)v=YXXJpx41bCg4;)0HeQiX0l*z@T(H)${nxi7V`)!-`;eZE3`}S z9CkAB%o^lvOb?n0%gSf|eJUw#097SyS%Vv$1u+bAt*0c7snLLokzdo0D#HMSxI$^5 z4b-Dgn=O8?;5hf!=GKplTD82{k`BTe+gOHXJ{OAsJY@Y(L|~tU+=>43R^z5^bVCqgMCg193hoVl_xh7wAHk{`xIQQKOdnSMnK0(1Wvxr7% z2#wyGlVTrQRY&a$Il3(f{FXbY2h7ZPan%QA91ta)&g|bBP9hu_2H9Zr^l+tSxAJnl z6X&^>x7?Afq{`EZ+)B+=lIynH3L3Fn$B;di<+1+4!PKzoONDx60ey)#N+`5qODPVq ztt7sa&MJpH!rD$UZWV}ymN1X#rv|Y|6OR~y)GW_00dBA!7gypZ)ss>Gq@r18WY*ky zp6Q}1Jw%@|UFA!X+USgAgkUxbB#mV(l?IA-|FP>E!NZqPCIZwoiWQddiIRj6gG@}_ zf4|^Gt&OS3Am2a@|N8|U#APLmRVSC93*u6M<8^9pvIjIo{CzpCJe<2W20(av>Zo&` zUYI*vU=27mT40J*GUwW{nfHsN7(WW#}tZ z=QO<1=Sdawk19~$u-0rM^eH*%qkJfckLch=)I~$bU7Z^5xOE*qKO9D-V8{PiD$u2)ohZBPkWt==&?m((*Y(-%FIC zh_16DJ>KCi>L9sZceY-DR0ls9? zE`?~{;74gJIRA>Tm@V>;a?5#kpb$BslMg4OD**ZU-5a}_*iYWy_6n3ESDS=&qO@#% z(ZyecT+PUmLEHcG`u#gkMYAxT9Fhhqw!PI@NwH!u&g)ciSVrPNv-39LVTy=KdLRh5 zE_{99^(v(Qn9W6^YW;iuhX|t@SY-Wj7p*ffddTMRT?s#>fTF0eoL$L0&Fo=A0w3?= zH)N2AP%c5Qyh<`a7LKtTc=8gy@_yBpnMTF%fxze$QtR!Pm;}BnXOp5vFR%8~n+m*g9}?Z+=hg-Ds-Su&J+ghZycT`M}yAfBb;!RG&Tp1W<7IJCH{@ z*K}~dKRoE_r$Gxnvqye>gd{}@CdHL=&kwFjz#|Q44eaSdjh{&w8Q|4dOw#ZE?|0ZV z?4^QnCV)rtwIQC%@FAlpu*bIg52@<^3z7h!d_bjVj&pBf{4eUM)*n#h++ZqzK20(R z$yRk&OsJUPbm-L8L^@}ReZQTmbH^z*WHcgTO!lNTK2lx*&tysuO6CmIlBI<#u0 z8;z)X#JZ7W4Gxl@{-tF$wU4q}x@=TOW+ZlTXb6AP9{Il#pGAze3ewYHv~&N5?=4Bs z9hZ_5Jo(U1X#}SR#VM?}o$G$&{0-Z#CBTx;gi_#{EsWiPK{Hv-9yd?`L%DijXU~@j zuQvG{9D)`<{8fX&)Megd>4v@$#tHP(?gA|GDh|EKjl%UVkh)mnV?0uw45|)~FhFbC zKAUtV2_4w?C-$gH+4WoS12O;{E(|ZUskFOf$nFTitsY{5gj&NMJ0l<3wd%v>egzd8 z_z`LV|0fijB-O60MUOK5*z?CY;70rg3<^UR0)f#oKl|6RCpm%D$Z{AV=Js8G4pT?_ zASWOu_aF;N%UbLo_@UeO_PSCXOczo7_PH53kM#T76m2n6_a|d# z2EzL&19GhcZrIGEj%{I^kM9=I$FOlmhx}+Er5tOPx}XI1O+Ufs9KRS7<5@22e|lDV zQn}I4x*V`@Ln-sa;!CM3l^g0dhtL@Sr&+@<4;U(*<3@GTn?Jv(b7+k|tGT=0g8aLn zCZ8D62p#S8LFEI%ql@>+T@nIb;G|uuZ(rODEv}394yX;0bI}+Rf)9<=SR|XhFH|t^ zo4HPIKe_lNDFI~`l)^YUc37RNV4^hir8_hDJMG%3!g*IbeijB+yWT%zEmvb`8azxL zu!c$v1l0X)r2Bw&VlDo8dFs9tB1KaGZk`K`4DGrhJhI4GOzXz{DM8;%1^)Qs6-fIJ zs}lEwTKIzUkNKj4@s&CfT<@XskCKmQwy>^%`cgAr+BHExHo%bH zGv^a#yPYbSKR~sPwxy5$ack~1-_7aGfNf)X&FR1{ zz$kCt*H(hdgxPAxYbZu~Zw9)z#y(Rh*^7G#_x$+ou{wR{eG^%|X80k8^{42oYy=6K zM~$$m(Apmecy(Vu0b}L|wNNt4cQpHXh!$=tfdC|~-<{ao6Fe0;u*m3?nVKF>s-lnq zSOGX| z30dKv*;&TGSZ&|8U}x z0$2z~4UiU9qE(vJLo*%#o4(Umcx6;(DVajXd10B2oM+Mk3dbfVRT4orY5ugi|x&(udLz-V| zU_j!T2)Won=RFuu>AkbZ6SvVuShq{#pr!m0|!^|!!Nd3s&s zn5<)m;wR`dQp2)j`A|PplV;934vu_M)wI~G-4p@*oA^vgKza2j0BJM&zU_};sx;^C zKk*wZaBHb{vigeJ>WbG)9~0EJDcd&qU4~xm1o6!pNJpe#)k8GJtFMQr9M4|by+iY@ z4^V386lGNw$xS#dNHLJ3dU9VjeapN=?sCCns(GLqKG8$A{l6;J{)g#Iw-y5^EeSQ~ z|DRVJ@ON7U9wR0gfJX>(g=O1iQy~CB(t2P&u;vEEZ3#$hwl|Dq0bsoT0DVvB^aWL_ zTPCuxttR5Zc7e5OG(r4)|IMCr*q3g zeTV*Z7?oa&ta!^Su*2(2UOFbkgfqtXlFJGL!lBv<*RL)0e_2cbn^Y%={tt;){WktD z#>5VUhHxmt0dN*_c^%7Z%C|REG$*Ft4v`hy%t$hM$T{+vnwQ%|%rwE)mk(FVVq~h| zBz4_5fXR@(KUc25et~od3L~7-C4q58-*|8U2Xas(eo2oM($FP2*)P>qm>miJpcd@( z^KQyye@Th#tuLwBo;d-8bCaq$scj zETm$k{MD&kq?qSzKhOcd>R8(Y4=(M+rzPxeyUL9|gCF0JfHllxhMy_Alr$zS2T|^n z3&6)0A+nmWoT&_Jr$Kphl20!ba{$wtJ9jdlH)nwI5BMMPLyLBM{l)5KI>iB#jPqj3 zt%nx%I33?e-RT>us3~^jWHfcG#+HoOpJ%2kzX9VUi2OyXA~Ok`OV{g3K5^ysx86n@#$ME2Kn7^F~kyZ?7`dk+@CIs6O zZek7SguSENa+K)T;Bhnkt9&x<7#u*>vQBVVj|hRX8mdDhEmwR2olZXek+Mw!-oD!Q z-E6OTqQPJCv;#ng|NeCUrz~?*!QA8pd$v9zu450z?e-b}2QW6l;>cYHUG;Pfjo}X* z%4%~{?5vsZ~`<1MFDUU>!s_OEvqHVUF z(f$g`os|D#6w!cw4$o_{OS@LdH~S~?`Q8|3fZ;^H{aLO&dNB=TCDp#x;lrlA_IB)h zWlwEMTeTFgTg+-d%u7!~#^J zA~==@Hz71p@(=qnunT^tRT132*im1^=&LpT+!EI1QnuK$PFbX1rav09YWEAg2{EG#L6f7xvnrkFf!fcyZ_E@Y`=h0O z)b;+Q3~yx)f87cIHRet%uB}sCg1!Psb)GH`)>F7~&`v%l1TMq$fQ{5sWQk04ewJw; z(tp=^a*U$zb>JIy8kg4`{i)BJd)vn!tR(8*9xQq<*;sl%tNf$Fxr*kJZJLxx3N@ks zfyGtfVHL0%jlb8l^6WXPiz9 zxW&pMHu%DzhJ-VdZu<f8Wzk5BQOyrYyXon_025XPLy3%78A%kSB z_*t!SHehM(i+Gw?86#R(Srcbko9Za#V(^tU$4GB^jIdw$?&JFDD5-ms|J(}uxjC6T zaS7-MZEjG3IEA@ZQNlysOGTtiUKMS+A^aM<+;|gB>1#zm>PUY8WJF7AP*utX=eL4F z7=ya__z&ULAu{&%?J8`UN!@(2Im;R}t*Fl|0`RCzkAP!UOUAXo93g<_^w42un1D>T z$?zBH-l{B&_GOIb)td8!{LHmvl9oeE6hMezFC>u29t{97G&i|E$}n%?C{!G9DeK;} z^05$3B_nB@4@VM<*wUaV-ASB54wi09FZ?0eWy|)@Fr5CXDEm!nx_hwl!chb=XQwtr z02nYb&!z{#)9S|LM8=ZBa8>`CYo74P`q`)`8}#L~t`$BUV0KQmpm)2ewh5S*G1Sb21ib;^){wcI#Hv7FATS0asX9f%Tv-SuE7$N6XP3_?dQ ztIdqejdEK0bW1IWIj)&v?cF+%Qyq{PPY)vu=W~kY*b;`@CN!pl^?pxoBuA|zi@$1G z`}C_$kafl1PcTCQbDtbS-`wA(TBFUntUK9X51=R^ih*FS+n^2okfa%MDFIBoKbvI{ zC0vPdzaf^sZ8FSvPT*D%DiBX6D8ECH64c1%P0#nd!qA$XVm`wg__Auc7k(IPnst^ z`Vaw**>$W2AK@Y6iN|=*mlg;tOFrn1gqUoqH~E{!5g@t*=Af?_ps{@RG=G(kx0^;gkE6laqVW))d72*|Dtoo zuQSh}+!)BU(E9CuBv9r#JDSFkCfhfMg)_Ei;NP~N?EdtGCbZ2@S9P|CG|maD9+Tzo zv4CWwa6xZXsz6<7OV6hQZ&QNetw)iTywU6T-#J6{u3JHV-GBPz$$^Z*yweg9Gs}b4 z+)2HvViD?qaawg680KbHU`zztCXW*hi0f#0eoJ;}>5LiTcDCSt*6KSH#u%MM1r-w- zDX-b`+!8R(4<*q4XY+W$zk%dj0{?fd_X6mps!Y}TDErm!Mk=lxU}yAEuQsz9I@&3fkj7QGH$wM9MW3j> zP)wY4;W4_HD3j$$Jz_Z2=@DMC`$To3x3JM98>Uac+@z)rog6Na5hz9&<0G1TpT5VJ zGDS;ysWIXQw6JwZr7F*IrykUFW4Z)ZIoBCUc(XTS4K~IrCg|WF4hHq1JUbeps0Rmg z&JAXTcZ-PprbEjE^ICiD*g4$^2gM<+y|+t8?SZ*{kf0ZXFR$XKBy!gbgrM?-%ea$% zARTg<-}JtBD156d{=5j$5Wi~Q^sdsZOH8@c?M_wuRqIdhQaN}Nq`oX+PSks^F16Nl zZVz{3zjJ3HuqZ1C@9rJV_VeZb{p&(F?oWR3qjlxe)viVzGOseAREDwj_3NMwHzv{K z_1EtRzaFMyM>BT)5KULNBLkVux?{Nn=7b4piN!L9#2BWjUG-Iw%E_IVT2$5oT_||w z$Z~VcUZjMm7|=VR&Tv=o$PQg%vCU`0XY0r_=~eK7%WE?<^gl7*owicb4}j(In=9C_ zkNDJkuP@##P7pA`=f=d@8htAyUHaT^@mG>lW|68Eje_=>l%r3`mPwuEyxNfEAg>WR zHOz*Ijn+{ECWM+}ti?}kp(~mrOb~4>o-G0C;x{rqL#!PB`E=+42tA-cXaev?3C7`1 zh<6(g<)~G#LWkr=37UJ94)S0lO7&RSL>9;nI@ib+s`8t$+N?RaJ^-89(>u}v>3vRy z3ACOSUO~^ha(Z`@>@yB$!tih3>DT?#hHe*5yS4}2mTjB&DZa@h#xBOjVC>iTiqt#b za#KL|T}DhEJy3eNx9MrA_t-jLm%Z-xenX7+h>6i-PmabH2189#TXw{|!bhn@3)J~` zM^Uk-ST!PX0@TF0?+Kza_x5bn!AvdmLp`eue;)OB+YIay34t=PgKR`9DD$k{xx<28 zk$1vKW8oCHm-k7P&_NP1-z#Bc{q2eKNcs^OdNTysCN`>4Fo$w_SLFGuQksB>h@b$) zaU8T*=aasn!KZ$Y^^QU1#bkwU!vfR8v}!UC$nGJf(=3KJRhgZAYCT+ywT1fVqCad- zPCZ1sC886q9I{Kx*5G&hCFtk!wOuPB{}go8K7Ggvd;;#LZe-I4be?c#WCprmL<6GD z(`EDF!fTYTI7uw0A@on96{}R2N3;ezPF|?guYPcn zVJtE%i+^EM;tO`qsf_ZhdzXKtZ#6uXnRwj#g+Rh59FDZ%BG5S%oIt#3xVAqoC08}C z?hSazy5&xNmm&hrw!t}0s~wfJ?eUHlgNLD`S2L~h@Z-^|>m%s=n){?s~6p`3)bmfM5`W(FLf zb>GPT7=CeHH{;SgbB39lY698_=-M;rGj7?Qt=soZod_br#NUzGW}O|-)OO8BlR00#>tFKa4 zPs#V&Ff$;pz^%Y%-U(WHM3(|U;J2HDX*Btna_ehyn>YwU*r-T1GdsNYf@M$RW(6Qz zDP|V2X@2P{WO~b$=>_COX^H<~eTl3=bke!rGXMEwC)cbe${3;YWov(BUvX-P3uCCV zJeLvKw`G5Sh+nxp?eF3}%w^_CW_oL&>@Avl23bi3MKG3(@Xh9V2u3`YHjABk-#J*W z)HOUMGmDtuR9EFjkE5I>Nhahd(8 zg!D_7^ThK^5&G^GtLn+~JAJEVJ&v{UjjCK{g(d)o*+_rC_{XfEi}MEFnJG+p#AW-O zUr6$Z`J~3v?Onk(hk2C{{BWwPM%^jw>?*%XA(~tpPE_6nQvNE60?6p{ZSqu4^<+FM zcg3FoDa1*c}S{$>>%WxCm(^|^R0?bOyv2{83-VxZ7;OyHS(~bi+_K4 zNW92N=6&Jqo~2x$#Y6)(0~M|_=+fxjR}F_n!w}s&)+;85kxw-BbsohYVo(OMD&QNR zC(|R4_nbkGJy0j>iup(6x!CeU-l>hU`_aJ(T)Ah^<*irNGY2lt&H-FnLpUz@#5HTi zZgHCYJ)fj*r{jfG;+C?CZaN3={Pn}9{50)Y@LY6K=m9Y_dWRo!R^*c z^auCQoe|1MR+M~ra3d<30_LzrZ=Y4SNx|Bk03m)`?eT{;kr202PV55C-uajWbbV)0 zY9lMRqGclDCA>yYDt;;k2Q=uKR{Z6*5b#rRs5%HTte&he)N~N+=$)>VWGLm_WN|A)DWE?Xq>zKzlNXAh_A~FuiN@R~?k7H!Z z<{aZ#$2`WtvE7$G-}`spzx#Lp*W;b{JlFerU$575{V&2|VngvE!1`Z<)(Vau{8i)nKhr+o?)8HF z7Ip5p^v(kD3Z~a2yKpvtLl;?{1VX;c$eid!EL%co#3vmJ+Yb+x#EmDM(d4Uy%I^k1 zRHq#G_6gG5moYI1YvqQ%J7ME{sQ6=dYK!&yh~7lpoEo{^?|%27nowa7&1=Qr^;)4? zH{Z);F{mwL(SXn|d3A5AgzSwC_YN1C>?0=XJ~6WqhwCenQzZDf;Yw=dT<+fRH@Z@o zS|JCe<@{0up%t0G6e5!nn=dNAhfAZ)KkN`G9r^UOu&V z*^<+w8lxE+}=P74PR z!p&y6J4%Ly1a}d0r+aKf^X%OhJ=Yqy1`zA-oADfrAtWqvIlI098==VQ)k#fuPfTYr z%4artPO$wasR;4eneUT#1oS3*LXpQ(<5wZJ@wq-wIresm^kLOr>{iki{#g~S%`PA< zya``!qKSDF!?9rxiD3BACnR7p8JviBuoPCXj*k>;>d8KXk@7lV%-FFbsyKf8ePn-p zxP8|WtR%Hh|IB|4iYS5Wd5Tdc2(L)Mhq4?#My%?)FBAAif`+;ZscI!4JKi4;S8gnC z0#2!9mftl?X;JPoN|s96taolQyt-+Hu08x{Gb{1qNUgE9#aP@z8fQ?^iQN7ZKiwX1 zc{d2O@A`k4+SDzxzLd}p;^3q&j44SW9ijMfnKhZ{{LpPoMpYC5S23p~WCE>1nu zXt@^N5&lzL`!Tqg=cx>eJkR_A68YrwkCmT+Cwre~xE`9Z-lITQK&~RlE^8(4X)}D8 zQn{wtFA~I6#Py5j>*q_MLA};N8W%N9060mXW(@(icbzKzQBc#=z#4A|*Hd;a$@`EW zqc1OJfv5KA71P)6oZ?9Dd5Q8pLi9&wGc&igz&E__Xk+5vaXCEFd;23JAlJ2KP!w0q zGJf_em&2V7Jm^>a^%2v`Ra6`Zm&A7Hf=W00p>}nDVEe)go8pFeI?&<$J9pa5BENf;;971^0DBpa;+4VLzRG7lH&~*&|OL_zk`^J*${d zb_>fXrTy)E8R>0sWy-~n@8XtcK;M@^G>T5@y&Cgg(ebMO_Ht1(<#DcQH_JgKrZT4J zc)g2qL~CN5l3qgcDEE1hS=Hg#I*+ny?v)Er$^O~`J6Xt7QIs8l)V%9oTkF&!!%7~Z zQy$-#dt{xuvNZA7ZBk-`Z`I?StlL^by`$1$_57}CqnGwUuw0ZwG1enQCMA(x(SKI5(+(Iey^6kV_R zHrV@``-<=htn0(fF}A~&)vELU2ewBS`@b;f$an{yI%zhVlZS1@nG~(xFki99nilB z9lDHlRW57;NDU}bi+0i%|6a;Pix*?YPA*bWkUwB+2?JaDvDY()P-Y&gi}#0?mAZ7| z9lG&K0_y=WwXn&Z+%>Z z<*WF2i!MY##V14jgfQ2>wqHy0$(6kdR^9cEGplrx!N-<^UDl6JR|vxBM zu}?pNa#7z3t#ZcgM{9b*x6AwUs(08?^ncyjq`1Zawy2(E9#!e<&FI~#V${a5KipFI zyL9xUedS82*O%LgO#rjzw~tNMY&rYE4dvYROd@@y;d4R;Xr?GU6j9hGh!iJbz2~1b zcIevEkdrDJ=#@4HyyneF1735sJTuWQikDajwv~BEonh`hfV5ic0>jOA%AFfM8OP7OzM z9-ltKUQ|l6rydjEXhl5jsr!kTyimdQoHFnIxrm%|gHA3AbZn34dI0*B@1kz@K?SZ+ zjvh+Q`Uh(7PKMLFrUuY|d}Zn61h=nw5_B=#DGSbDB_h>eRba%1<6?6CP>1 ziAYFrq6>_^0b;uVzo^k~JjVu(I5gY60&CPu#`5D97US}8^aM55k9dUYnm70^`nY-~ z7$oMgyZwX9At_(W)laZ;EOkz~B^uixb_ePe40-yU_%2JiT*^5FBl}|LEkSL0^b<-~ z6t|*$alY|KCj+vw*WL8nhxOnPQ-Z8pL2%^)EaJ+8xa8QpLNtx_%H*gYObqyNRo|l} zcYaNBv*U>+Uan&&225N6w3Npxw`kbupiYc*G*21h(KqVf&4+r+pf6+oi2R6uew7gF zLg(#4L!sZZtP{(^q%*_V8KS#o7((w_pvWdqK3jM&l^gM$^07mFMOMgNFUfLODw=;V z;)&qTdBMR{ppvBK4st&V>`O<2?Mns*?UCLm@`it`+Y?0Y#IOQ>tyP<`R1BwZaU~h~ zzHfOhx}Yz9cae?hf|B&qA2(k&nZI9voX@q9|19@Kcw>-)G|rnIU0Ou-ThMv4yGirv ze702LPUKo#UTz5r0yO5wisdvV7}-cvz_@*`h#eT%EB<0YIcNk}^Rl4Hopm>c{yA7% z0Uh1s#PhTf&vIeN5&>{FZpX|ln!K%LCSKa28FNVu?9=XoMd)ibE0^8hXZ|NyEHWrt zfeo2MFN}@$I4P)`%@a3hPh^dW6fSa_o-OjD#pd3l5qwOXau_ za2+X!B&G&-CsVi6DBveVgwfs2G%ib8VVjM1Iswf2#Y1^4aLNH1R*&2<0wJ)*-)5pk z8thgyPvIgNojw=F*bZGp{#+5p$iDx{O!R-!4Ws+6Cw<2(xbo`T&*{m;{H<>L?}-TI zxN^ONms|6f3?x4d;f=25hCVu-hpFa$q6-$};z~q&0ssOE@XpVewdXfWP;iddqNL)L zs-^NWw*_XRY?g$@dRR_9UeF3%#!j4TWfZV`q{ASKfu`EeLuss;LgdN!7^L3UcnNIQ zj{$!Obp!Xt?VfJD(FLwt)l%!{I`;l)wyv%$ynKA+F5H`S6auSg*Hc4S5KczGjT|w_ z6+zufL-mL-w0cg$Bzbq-F$w58nRK3~QfmEro7!g=Kk5|hZE}oLtNiQaqbf_KDLu90 zQdtmZCXuFfUX5TxJ{#mUcNdPn8vo>T1Wd_La;sy=h?Xqgup8e_AFHNS?1?b$46cZ~ zwIZC>fSa)<0eVw5D&ZR~*_Ybj7Lw0IrU#@YBeJwRu=g%Ba43Izd`alU8W-!*Et_reW>geA zyZ)_3Cb;^@Ezb&smI~|-`5o$RcWJ4aa_+4mN6Kms?Y9$*kK>b-Qa&d+AK#wIJpOXu z^kmerIpMeKldJ=#*V}h=p%=yOHXeqgL%$REY9or~{zV3|O!OPCkFW&Md;Jb#xH)hFA zaGqEPKj&xxWJdCwK~sSDD61FgGNYf9qkVjQ2>MFet)a5H-WB!mFS9+HMK(2JfoweO zDGPijTkW~5n8v}=SuSiBG*@DCI=kQEcc8T0VRgjd-KLe)khB)a2Wt^$!x=c*OIQC! zesKp*f>!Wx&rA}_9rKqQlJVPE$J%+P240vF7RzYC*p1O2-qqgX4dqyBj*&_0G>@bu=kr)JSeKQr z*fnGULPMQ?_@kJ?I{p5-cc>SlILu&(mKA!Hp~~iM{8b?|QlC6M|%m&2#)J`ip^N+KpHO>wF@g|ldeGWiCn~=|f$_PlLbj5g%ZT)1Q zZgZN6RNCONLDcd4)}5wg*~LUOE9b>bE3125F;1FWF6y=fj<|i_No8usi`3WlnV`?H zvzh$`p};O+?Z}h5bK{mxQb7=g-4>mRa9AaV6ln;FnHp$jQ1~ht9+1kIV-)V7dx2mn3;Sn-D$tT>|8XK!;N-D)7_}vnd|2wuMZr?6`aW%Q+^C&+i89VeU zA%j={ih^ARQ>A|fguRVlTr12CjqRI*)yyUDjwZ7mlA7rmCv=M<&HMU~SZCuOfE`Ln zg9bE*U4ADour_2>OPt}jPG6?8PCo>--%Y_kH`lm&yBuZiGV>&UV>GF-6H80ZowbX7 zT3vdT7XHX?eHP4r^sabV?QMS`6b?-JR$=*!1<3!|EiZOnu1^}EhT9cmt%4y&vdUW@ zFFeca=S4Y4r;7tV?3du&ij8_7JG+unyLaD19c15+n?4Zp4X(^`3{Ep`A5hKgZ|)aU z=oNlju^_Bs4Ys-TH(_Szd|?#E$ir53-$Hx{h{r-S zW*wEM8v>BJVCD<-mnSl1;7QfHRJxhefh%F@AuKH-O48> zPh+WPh=VzCNbbQ?dBv{0bdK+cI!(xX71pB}a-2?kn%ZzgB?C zyAPXEZpV~W1<7u%Df|%LHXD3F&4K8KtRl9D->&S8Q?@PLCS6V5d9qy?TN6$9jH&1m z#S)tLf4jV=53i`@IPhIr;*H7v@H_M!ccSUvl_zFnjm{+)A0+_Vy%Wm%61d&{f$l*l z4BgIS@pxay0W^KndGl?4S(&_>j+r)bQ70mT6m&u74WC5?688q(#iM#8U6qv#)yKdq zaGx}Q>{(e15&iiwF4d2=bMn!3_2MTvc)+Kdvt=#nq@bGqUg{!KxfweRUjL6M17F8i z#oYf4qd;ej&GWka9a()0qmVEb_xKwd<`S497zD4$?T~;;Z&PSN@DeLKDPJ2~bVxV^F zX!Q_`5IpV}xZTX^_~yj%endlwy(wIJDYs~=tvDpd0=kERlUlh9jN ziUPr#7p%&-o4_&_GlIz7RTC|OU7rJC)k%-9(Ojpjv7z{^HQXW;8?2%&(vi)|Q?pA^n>fQL| zqa`QS#M2zwz}K0sP=3EiUUVohFOd-8cQ8FdBY~@{*)GW|_|NpVdewq2$>WyyK(=wy zHWqHYt?Rd?YlnTra>$lN!CEZmw7)W<%!g_O8QyXcTsNS$yMMM+F?k6Sa?3YuhMnE| z`2TJAZUDi-e+&Yhuafm~)u*ifKy6y`6IScTu@Kx+INgOJXy`0ps7ongJ&6{>67cF&Jn8s zt;lzgmJ7EBsS7(gwqa9c{)b?!O;>gBYZnAVYD@Fz+|m0N$D+@vX$jDsLGCB*Z@%u6 ze5(2~tw%MbKei;+CPW9q?<&jE9-C)ke6$fevft&!X;5I6&av_|{5$aRaT#uTkF;}gitvLO zUs-}hL}e<26GdhFYR+f$3@0jU$n!r?44gPVA}@c{4 zcA0<-zkA-U76)R(&s)4&c(XzFFu!*Lr+ocwp>Pls@~T@ifS^fDeUizGPiQzAp@roC zrWo``UIl4KWUC=#I7(0o=bAHpo&Nz?dJL#v8oS1lAj-eU7o>Q$Js9}VhH7Of9Kw(g zW6W4V+KaSY!?!<5mLH}CtI3kSLZ&u{9o{&hb;Hr~VmNlfjGYSuGWdDhQTbU5mFlWz z8=cn}NySnnX)hiuF5GLA&^t3K^VxJM89V77emYXhKG>UXx1y8KTjJSIO}^3SY+4W? zAov!vD0?+-DxZ&^T1meEA#+m|x~SxT8l;9J9<7O>^`^f*V0+7S^wd06EAaVO)6RmI z$Fijkvfh8!*~L|%jmKQwt}Z;fVr$Y}3cAn&o5jC?$1>3|9C%cDN%FkBvkY4+XBD;M zVK6(=YkG>7EE|Y9oD86|Y+;8RE_q<+9VbOkld+ESNtT%?ceBhS_d5oaig63$CAScE zirY?&kxKal*;UVFV6Q7OA*p_j@sTYSUm+^F_AcM@CE=S!Yo3yqbn#v0(uYRawLHY< z$kaa7nz_+eOK*p2FC+K=lo;lovFaZ)TuzlJ|7Ch%l`|pC@LYILQ^~5q#NPGVZJFjG z?sm@Obn2C;nK zVS7EoFOmHL8hPBBeDFboanZl*^wB~0aiY(*ynK5ymzTzJ>P=mL(Z!g3rKh=XZ*Two z&aeZBGy}BoW!n__$~HoO&7lihzi7_79d&1%|6D(JLPD~wPps-tjN;=dsw`UrJ4j zmwd#s6#!np6XE(?`$@97v-5iinZPZ{Esr;LAK4MOpmkbuTy3P^BrTb0 zWTW1ZGSy+vvCZd2;fKYt54D{hPQ$LI@2`=&>qp$@@&*O04iheM4vZzVb8 zRd1Wgqw$m>15u9k=%q77mo?zg7-;zQ3R=Se;pgSfv#9~w`DLCRB2tpyoAR8VR4qx) zd{)@mU0#KuGh3i7W3B%?Gg*RGCeX;al?O5AI`$!l17-+vw28|UjK1$=K`mR+(c@3r zI|&Pojn(Kj$J&?mMS1Co&dW@z-sv!F$?>gr=%)zZ1+KqZvBP1lTaXi1jQ_=ZezYW> zkRca~a@m$@7R^|_u#()u7PUo!`KfN!zAP=!F<;g=!i68j#|a)?K9r9h2wQTm!?PL1 zn$|E_U+mN-$TsnLnes~sOr*4o>{ZsJ0=p*SuUAzLwMXTW#nOt*DRKFNLo{t=&M#wO zSCA!@c^%K8=MM%ImcG4B?!jc-T}Bi}@w$QTK%%qeQnuffH5-L`OZ+dTt$z5xfzcQ0qVvINe)ZI%S{{^ zuv(sQpJ3L}0(?s4w*Acxfk1mHPvmER&k80KUIE@D>Zkrx_3RYshzZ-4Qk3+KZ5iu7Yittexq)Evv>sbWU*dPd7fW=g7sD`KhsQ zQIq-Y=dv+!2+DDp&!V_bN6AfcGp2XTzU@lWi({o;GR{($x=ek4;JM##?{LJckNoSN z@vqh9v29oMnWJd$PFg>&G6&zY3nlt{O zL=s0OccPb)Pz@^3Qd?!30WLtjP+IufK%Vbc_~iOK#9vCG`-9pT+q6?>P_WEw_`8cbRi{ zOUqD=sP!*pph<zX&A&>d2jF9`3~_#G-&3)J;j~1uyE6%`=2jBh zj0#=(y+IUkTP|BPrJ5TG$$oLC{phz!`&>Xu^-8nRP6K11=md$w9n1{tOXp7p z?fF@`FR|?Ht>42%NLMD1`9WxuX?LVe>J5_qHh zxyZ5HB{@xv(aYiZw&lCGkV%)jOP(K5I`4W``14_ym0VFQ26`@_A^Bj2Z})t*7pj#) zg~aC9uzs+$2$(;^Og~lHT=g)r#eN(L;U%cQ5tkD(GWhwD2G()mawf~5I|E!+wd1L% zSeYz;WU%chVnaHwC6pEKzdJD?;@>BHVY8>*r%&LQ9&``qZebz9>>giLd6V|AR4Oq( zYZP%(WCx-`XQOsD&RzU-(qioUjZf<9x|&;%+}c%bi&pB@$3P?O=+}Kx5(?{V;=!Wi zi6=4`G>OHaR6CzQM)5ify;R`)Rw22b_~%fNLl^3)xiBF*1 zpjZb4UC=g%eB{ohk{R|{3*da?7dER=EY>yaztt_jKhnKHIbeMywoC|}=SOr&wt_6L zJ@7TYx$tr>JMW0s8=QJfpU>BJVBu)EC7-IR_8olVOJ7P=!oBjv6KBHzjy?mRHpTv@ z*2jrge^d_F^H2X}2uD-Xk{3ACm~T<#?&I)sSPVYbLS-&Q%N1Y82nLBen!Ku_q6sPm zKqDE_4Lv1lV5?;KCnMstT@O~qKPPc4xx<%f)X@6NN?%IHNh$f4I>#mTbU~ z#}W*ls3`>Db2XqP3&ua}`@Mn?M_uJ4x9Vg!-$8n}IRB#lSd#y!bk{2aBYQ@waE|qn zF{FC91H{cyxjba}5t)#&!A$I1R~%rHR_xhl?)j=KW{U<%fO-c%vN(3aPhc?H-13ZZ z$*naEovl=j>7P{u0pfupB_AWU2cyQ@9BOtgw?mB&-uolgXFkf$=%(RvLXXt1Qq<$azP8nmVy-9@;&5!JtYYSa=Y2W)UbHp=j=70 zD&5YIsQ!R7Z{Cetm5LhM#Bdfu{G9lb*Zn#~TKXq;LDqYMskuo1Zl?UKCPH%Ldp#B(x-(v2u>!2 zmk^wcRa+hX_E~GvMy5H)lBt4D-;=tf2#F39jNmhK*}o##I}<=Dha}i_5M#=rt%Tdt zrp3HeGCcc>OEAvzx)Sc10f;}hA!;=2-WiqoAo?+VC0T_<$*^ME|ByR*S06IfTT%|1 zxJzWqVv;Fx8ztQL_>pH~8hgEE^HcL>Bvg7pQF^8*a_&o-#pCTkKl8hs&@2Sz zmiMIp{z$g*;oGF+StLiB{UwtX($#Qzf8=TjC?Vr*Yp~LsGB1r__;Xtd(xHf*)MMu#wyBS33~?GlM@FQ@dZz-2tJw62_M(*ZFD|R1bJRhKh}!`fRbAw~EO8 zN=b0tXyqe43cwie>zmJ2*!J~be(7L$t=Nm2YkqI*C)V*HsAdguWim)_!^6NR@bbT0 zl$2js+UbI<&e#@atC_mJ+RirGx+6Eq?7cGjrQT=blOuu)3%(=NNC>T6+FrVluSWN) zdDYwr>;EKyY@2RqzR*vw_3zwDI&W{Hci)_gm$ubndaC9KUG{lB;TvCm{&U&lYE2Mesp`yj zo71|v!sdQ0_}H+5rf?X@>-eD3Zxw?5OQ==aOw<+2yQ=13618>IDM0<1MTI*d>$}j( z#CIEQKW2E>^A%(S{0#gpeCN@raXZU1qJeb@e_ogbzy5y3;k|UmmnczOR^Yw(v%gZj zY5rX81TFiUmS}T+hJ#A;t;+)P?b9bsnM!;xYrJm89s8V=aE~0VaOSD$rDn?JPYQNS zAH}FeQdui1S8G_4@6mw=WmPiG+O_D_>6+dF`?*G=1b@Iz6w+oR((QuG7ktfa!I@PL z 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 z%0D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

    $C>+=#Wt!VDl(*0S?7u7snqdwR-s5J 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 literal 0 HcmV?d00001 diff --git a/docs/zh/_sidebar.md b/docs/zh/_sidebar.md index 95cd8cad52..23149d0b67 100644 --- a/docs/zh/_sidebar.md +++ b/docs/zh/_sidebar.md @@ -90,6 +90,7 @@ - [FaaS 设计文档](zh/design/faas/faas-poc-design.md) - [API插件](zh/design/api_plugin/design.md) - [支持Dapr API](zh/design/api_plugin/dapr_api.md) + - [OSS API设计文档](zh/design/oss/oss-api-design.md) - 贡献指南 - [Layotto 贡献指南](zh/development/CONTRIBUTING.md) - [新手攻略:从零开始成为 Layotto 贡献者](zh/development/start-from-zero.md) diff --git a/docs/zh/design/oss/oss-api-design.md b/docs/zh/design/oss/oss-api-design.md new file mode 100644 index 0000000000000000000000000000000000000000..7c67e4c385d2ed38c09198410c19bb30a5892bc8 GIT binary patch literal 14736 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 F{|^Iv*24e* literal 0 HcmV?d00001 From 9068a3eb3a9ff24e65682dfa3936751ca0afc748 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 13 Jul 2022 11:45:29 +0800 Subject: [PATCH 077/126] change picture name from chinese to english --- .../img/oss/configure.png | Bin .../img/oss/flow.png | Bin docs/zh/design/oss/oss-api-design.md | Bin 14736 -> 14731 bytes 3 files changed, 0 insertions(+), 0 deletions(-) rename "docs/img/oss/\351\205\215\347\275\256\345\233\276.png" => docs/img/oss/configure.png (100%) rename "docs/img/oss/\346\265\201\347\250\213\345\233\276.png" => docs/img/oss/flow.png (100%) diff --git "a/docs/img/oss/\351\205\215\347\275\256\345\233\276.png" b/docs/img/oss/configure.png similarity index 100% rename from "docs/img/oss/\351\205\215\347\275\256\345\233\276.png" rename to docs/img/oss/configure.png diff --git "a/docs/img/oss/\346\265\201\347\250\213\345\233\276.png" b/docs/img/oss/flow.png similarity index 100% rename from "docs/img/oss/\346\265\201\347\250\213\345\233\276.png" rename to docs/img/oss/flow.png diff --git a/docs/zh/design/oss/oss-api-design.md b/docs/zh/design/oss/oss-api-design.md index 7c67e4c385d2ed38c09198410c19bb30a5892bc8..76220ea780fca0a3e531282043c5b66d5b03cd3b 100644 GIT binary patch delta 31 ncmbPG++Dn35+`SJeqLH;dTCMW07D5+~=&*52oP*FBxRZ}MzT56)*>8=tS}2J$vP=Uk!>0C7zeQvd(} From cee61db5c1532563b79bbae11006c78e9c0ebd64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 13 Jul 2022 12:09:50 +0800 Subject: [PATCH 078/126] fix typo in design document --- docs/zh/design/oss/oss-api-design.md | Bin 14731 -> 14666 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/zh/design/oss/oss-api-design.md b/docs/zh/design/oss/oss-api-design.md index 76220ea780fca0a3e531282043c5b66d5b03cd3b..83198747e77347e881130ed5fc35ae2f12dbdbd4 100644 GIT binary patch delta 824 zcmZ8g&rcIU6wXp5vJ#1U;l}hpY>BkQ7~_w`n}`W$B6>2KZngugZFkDda3I7`E1_Va zHCe3zYl~5^5-m+O;fJ*9&0q14Anfec6GyMkvMZvu_r3Yv_q{i7CQZKKidXQk%B1cU z+J)A7`9r<@!kV8jpRTgRTs`sNXDZ8~*4?n>*{RNG9iDSdh!B=3ve#){_MB;GH1luG zTuPfeSh%oLEs7#rN}7edQTu2;E*aGYYqQ7&NH}6ub5<$MMR?wvT5}-xahQ6naZ6}7 zi;s-;W$RhlTu4DR97l>uw-ZUxs7pI*c z04;Ggc&RHeL}O6^cy@@=I5{5-hLKDHF+~k1Xg3ZHqNt<}b~;X-Qe5f8Z~$Vc%FwCS z0?nVtmy*VM+MG^Uuio!e=S49T3JoHWj>aMAMRKH{A`Af^7~%m*hG0wt00e{JimFf$ z`ip{(r^$U3CnjP$K)) zZ>siqj<^%=)BcnAPx{{O{b@grT+`ZG-Uy=prKKkH%<58PJ8_>x_*UzgHI~hpxeZp$ zvh0ez@_ebDT6Xr#rk?W`%w}>dRWqMdjP-Y{T(B|~{yys~i~7XTJ3=%67JGdC*RikO M1_1O=r@tTg4Jrh6H2?qr delta 752 zcmY*XO>5Lp6eXQ1c9e=rMbL#s8+4J$=gUkA5fKZDLN^5$rN~S2G81Pe3CSyU+{{q4 zAGGQsen4AWu@-6fHe0yya$~pNrN+;Y})_2A8s`J;cHh(U0-LpU2wZ-*0O z^_@?|E(}&kvR<%|jbq1G9cQRSSXl_Rk_)E^(Ri{HK3xn~XX+m&W9uvD2ZQxfy}{M4 z&Y-<(Ban`LDL-1OZ%u`>yN$_8^mco{Hj_+t4_ZZ-MJdhRle3Ml=l$h!Qm7uP?Ovx@oAxrVh1?ZgPx?48TaV?m4c?{de)Lh^I}@ zDXK2?F`{$G%I2`jr!%xgTnq?A#7PoegkILN)gExo(aQIbj(Y^IUuyzzowi{SsecDR zJDx?vH(FLAkPnDEmVtAsA}I$kEDV%fq-vH8y%Oy~Y&j}Vdk&6~O^Wq%&d7j;3rIC# z!AG=jJwU1?4W>Dn_K9lPR}IG|JT4K99YYNLeB8baxr`ym8Y3$T8JVsiMw11BAkzeb zXrQz~ZTL From 9c2deadf66184daba60411f01838eaebe8665004 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 13 Jul 2022 13:18:34 +0800 Subject: [PATCH 079/126] fix oss quickstart file --- docs/zh/start/oss/oss.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/docs/zh/start/oss/oss.md b/docs/zh/start/oss/oss.md index 2c42ea48e1..171b9c48b9 100644 --- a/docs/zh/start/oss/oss.md +++ b/docs/zh/start/oss/oss.md @@ -7,7 +7,7 @@ Layotto提供了访问OSS的示例 [demo](https://github.com/mosn/layotto/blob/m ### step 1. 启动layotto -layotto提供了minio的配置文件[oss配置](../../../../configs/oss.json) ,如下所示: +layotto提供了aws的配置文件`configs/oss.json`,配置文件内容如下所示: ```json "grpc_config": { @@ -48,7 +48,6 @@ go build -o layotto ```shell @background ./layotto start -c ../../configs/oss.json ``` - ### step 2. 启动测试demo @@ -72,7 +71,5 @@ go build client.go ``` - - #### 细节以后再说,继续体验其他API 通过左侧的导航栏,继续体验别的API吧! From 7febd070e5062036743239d2ebe792d5a0e6e83f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 13 Jul 2022 14:33:49 +0800 Subject: [PATCH 080/126] add oss component in all main --- cmd/layotto_multiple_api/main.go | 6 ++++++ cmd/layotto_without_xds/main.go | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/cmd/layotto_multiple_api/main.go b/cmd/layotto_multiple_api/main.go index 85f89e2c99..cf9ebce459 100644 --- a/cmd/layotto_multiple_api/main.go +++ b/cmd/layotto_multiple_api/main.go @@ -285,6 +285,12 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp file.NewFileFactory("qiniuOSS", qiniu.NewQiniuOSS), ), + //OSS + runtime.WithOssFactory( + file.NewOssFactory("awsOSS", aws.NewAwsOss), + file.NewOssFactory("aliyunOSS", aliyun.NewAliyunOss), + ), + // PubSub runtime.WithPubSubFactory( pubsub.NewFactory("redis", func() dapr_comp_pubsub.PubSub { diff --git a/cmd/layotto_without_xds/main.go b/cmd/layotto_without_xds/main.go index 9bbc5db09c..04744107e5 100644 --- a/cmd/layotto_without_xds/main.go +++ b/cmd/layotto_without_xds/main.go @@ -393,6 +393,12 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp }), ), + //OSS + runtime.WithOssFactory( + file.NewOssFactory("awsOSS", aws.NewAwsOss), + file.NewOssFactory("aliyunOSS", aliyun.NewAliyunOss), + ), + // Sequencer runtime.WithSequencerFactory( runtime_sequencer.NewFactory("etcd", func() sequencer.Store { From d7346f45ccc4289db9e5058705dd9b36e26b75c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 13 Jul 2022 18:53:40 +0800 Subject: [PATCH 081/126] seperate oss and file implemet --- cmd/layotto/main.go | 10 +- cmd/layotto_multiple_api/main.go | 10 +- cmd/layotto_without_xds/main.go | 10 +- components/file/aliyun/file.go | 34 ++-- components/file/aliyun/file_test.go | 14 +- components/file/aws/file.go | 14 +- components/file/aws/file_test.go | 10 +- components/file/registry.go | 45 ----- components/file/types.go | 17 -- components/{file => oss}/aliyun/option.go | 0 .../{file => oss}/aliyun/option_test.go | 0 components/{file => oss}/aliyun/oss.go | 162 ++++++++++------- components/{file => oss}/aliyun/oss_test.go | 76 ++++---- components/{file => oss}/aws/option.go | 0 components/{file => oss}/aws/option_test.go | 0 components/{file => oss}/aws/oss.go | 164 +++++++++++------- components/{file => oss}/aws/oss_test.go | 79 ++++----- components/{file => oss}/factory/factory.go | 0 components/{file => oss}/oss.go | 7 +- components/oss/registry.go | 68 ++++++++ components/oss/types.go | 32 ++++ components/pkg/utils/oss.go | 32 ++++ pkg/grpc/extension/s3/s3.go | 3 +- pkg/grpc/extension/s3/s3_test.go | 67 ++++--- pkg/grpc/grpc_api.go | 4 +- pkg/mock/components/oss/oss.go | 104 +++++------ pkg/runtime/config.go | 4 +- pkg/runtime/options.go | 6 +- pkg/runtime/runtime.go | 12 +- 29 files changed, 577 insertions(+), 407 deletions(-) rename components/{file => oss}/aliyun/option.go (100%) rename components/{file => oss}/aliyun/option_test.go (100%) rename components/{file => oss}/aliyun/oss.go (71%) rename components/{file => oss}/aliyun/oss_test.go (60%) rename components/{file => oss}/aws/option.go (100%) rename components/{file => oss}/aws/option_test.go (100%) rename components/{file => oss}/aws/oss.go (72%) rename components/{file => oss}/aws/oss_test.go (56%) rename components/{file => oss}/factory/factory.go (100%) rename components/{file => oss}/oss.go (99%) create mode 100644 components/oss/registry.go create mode 100644 components/oss/types.go create mode 100644 components/pkg/utils/oss.go diff --git a/cmd/layotto/main.go b/cmd/layotto/main.go index d402c2ab4c..10f809cd81 100644 --- a/cmd/layotto/main.go +++ b/cmd/layotto/main.go @@ -22,6 +22,12 @@ import ( "strconv" "time" + "mosn.io/layotto/components/oss" + + aws2 "mosn.io/layotto/components/oss/aws" + + aliyun2 "mosn.io/layotto/components/oss/aliyun" + "mosn.io/mosn/pkg/istio" "mosn.io/layotto/components/file/aliyun" @@ -274,8 +280,8 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp file.NewFileFactory("qiniuOSS", qiniu.NewQiniuOSS), ), runtime.WithOssFactory( - file.NewOssFactory("awsOSS", aws.NewAwsOss), - file.NewOssFactory("aliyunOSS", aliyun.NewAliyunOss), + oss.NewOssFactory("awsOSS", aws2.NewAwsOss), + oss.NewOssFactory("aliyunOSS", aliyun2.NewAliyunOss), ), // PubSub runtime.WithPubSubFactory( diff --git a/cmd/layotto_multiple_api/main.go b/cmd/layotto_multiple_api/main.go index cf9ebce459..371560cd7e 100644 --- a/cmd/layotto_multiple_api/main.go +++ b/cmd/layotto_multiple_api/main.go @@ -22,6 +22,12 @@ import ( "strconv" "time" + "mosn.io/layotto/components/oss" + + aws2 "mosn.io/layotto/components/oss/aws" + + aliyun2 "mosn.io/layotto/components/oss/aliyun" + "mosn.io/layotto/components/file/aliyun" "mosn.io/layotto/components/file/local" @@ -287,8 +293,8 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp //OSS runtime.WithOssFactory( - file.NewOssFactory("awsOSS", aws.NewAwsOss), - file.NewOssFactory("aliyunOSS", aliyun.NewAliyunOss), + oss.NewOssFactory("awsOSS", aws2.NewAwsOss), + oss.NewOssFactory("aliyunOSS", aliyun2.NewAliyunOss), ), // PubSub diff --git a/cmd/layotto_without_xds/main.go b/cmd/layotto_without_xds/main.go index 04744107e5..c4dcf16547 100644 --- a/cmd/layotto_without_xds/main.go +++ b/cmd/layotto_without_xds/main.go @@ -22,6 +22,12 @@ import ( "strconv" "time" + "mosn.io/layotto/components/oss" + + aws2 "mosn.io/layotto/components/oss/aws" + + aliyun2 "mosn.io/layotto/components/oss/aliyun" + "mosn.io/layotto/components/file/aliyun" "mosn.io/layotto/components/file/aws" "mosn.io/layotto/components/file/minio" @@ -395,8 +401,8 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp //OSS runtime.WithOssFactory( - file.NewOssFactory("awsOSS", aws.NewAwsOss), - file.NewOssFactory("aliyunOSS", aliyun.NewAliyunOss), + oss.NewOssFactory("awsOSS", aws2.NewAwsOss), + oss.NewOssFactory("aliyunOSS", aliyun2.NewAliyunOss), ), // Sequencer diff --git a/components/file/aliyun/file.go b/components/file/aliyun/file.go index bb0253b5ca..26aadeb74f 100644 --- a/components/file/aliyun/file.go +++ b/components/file/aliyun/file.go @@ -24,32 +24,32 @@ import ( "io" "strconv" - "mosn.io/layotto/components/file/util" - "github.com/aliyun/aliyun-oss-go-sdk/oss" "mosn.io/layotto/components/file" + "mosn.io/layotto/components/file/util" + "mosn.io/layotto/components/pkg/utils" ) const ( storageTypeKey = "storageType" ) -// AliyunOSS is a binding for an AliCloud OSS storage bucketKey -type AliyunOSS struct { +// AliyunFile is a binding for an AliCloud OSS storage bucketKey +type AliyunFile struct { client map[string]*oss.Client method string rawData json.RawMessage } func NewAliyunFile() file.File { - oss := &AliyunOSS{client: make(map[string]*oss.Client)} + oss := &AliyunFile{client: make(map[string]*oss.Client)} return oss } // Init does metadata parsing and connection creation -func (s *AliyunOSS) Init(ctx context.Context, metadata *file.FileConfig) error { - m := make([]*file.OssMetadata, 0) +func (s *AliyunFile) Init(ctx context.Context, metadata *file.FileConfig) error { + m := make([]*utils.OssMetadata, 0) err := json.Unmarshal(metadata.Metadata, &m) if err != nil { return file.ErrInvalid @@ -75,7 +75,7 @@ func (s *AliyunOSS) Init(ctx context.Context, metadata *file.FileConfig) error { return nil } -func (s *AliyunOSS) Put(ctx context.Context, st *file.PutFileStu) error { +func (s *AliyunFile) Put(ctx context.Context, st *file.PutFileStu) error { storageType := st.Metadata[storageTypeKey] if storageType == "" { storageType = "Standard" @@ -96,7 +96,7 @@ func (s *AliyunOSS) Put(ctx context.Context, st *file.PutFileStu) error { return nil } -func (s *AliyunOSS) Get(ctx context.Context, st *file.GetFileStu) (io.ReadCloser, error) { +func (s *AliyunFile) Get(ctx context.Context, st *file.GetFileStu) (io.ReadCloser, error) { bucket, err := s.getBucket(st.FileName, st.Metadata) if err != nil { return nil, fmt.Errorf("get file[%s] fail, err: %s", st.FileName, err.Error()) @@ -109,7 +109,7 @@ func (s *AliyunOSS) Get(ctx context.Context, st *file.GetFileStu) (io.ReadCloser return bucket.GetObject(fileNameWithoutBucket) } -func (s *AliyunOSS) List(ctx context.Context, request *file.ListRequest) (*file.ListResp, error) { +func (s *AliyunFile) List(ctx context.Context, request *file.ListRequest) (*file.ListResp, error) { bucket, err := s.getBucket(request.DirectoryName, request.Metadata) if err != nil { return nil, fmt.Errorf("list directory[%s] fail, err: %s", request.DirectoryName, err.Error()) @@ -136,7 +136,7 @@ func (s *AliyunOSS) List(ctx context.Context, request *file.ListRequest) (*file. return resp, nil } -func (s *AliyunOSS) Del(ctx context.Context, request *file.DelRequest) error { +func (s *AliyunFile) Del(ctx context.Context, request *file.DelRequest) error { bucket, err := s.getBucket(request.FileName, request.Metadata) if err != nil { return fmt.Errorf("del file[%s] fail, err: %s", request.FileName, err.Error()) @@ -152,7 +152,7 @@ func (s *AliyunOSS) Del(ctx context.Context, request *file.DelRequest) error { return nil } -func (s *AliyunOSS) Stat(ctx context.Context, request *file.FileMetaRequest) (*file.FileMetaResp, error) { +func (s *AliyunFile) Stat(ctx context.Context, request *file.FileMetaRequest) (*file.FileMetaResp, error) { resp := &file.FileMetaResp{} resp.Metadata = make(map[string][]string) bucket, err := s.getBucket(request.FileName, request.Metadata) @@ -192,14 +192,14 @@ func (s *AliyunOSS) Stat(ctx context.Context, request *file.FileMetaRequest) (*f return resp, nil } -func (s *AliyunOSS) checkMetadata(m *file.OssMetadata) bool { +func (s *AliyunFile) checkMetadata(m *utils.OssMetadata) bool { if m.AccessKeySecret == "" || m.Endpoint == "" || m.AccessKeyID == "" { return false } return true } -func (s *AliyunOSS) getClient(metadata *file.OssMetadata) (*oss.Client, error) { +func (s *AliyunFile) getClient(metadata *utils.OssMetadata) (*oss.Client, error) { client, err := oss.New(metadata.Endpoint, metadata.AccessKeyID, metadata.AccessKeySecret) if err != nil { return nil, err @@ -207,7 +207,7 @@ func (s *AliyunOSS) getClient(metadata *file.OssMetadata) (*oss.Client, error) { return client, nil } -func (s *AliyunOSS) getBucket(fileName string, metaData map[string]string) (*oss.Bucket, error) { +func (s *AliyunFile) getBucket(fileName string, metaData map[string]string) (*oss.Bucket, error) { var ossClient *oss.Client var err error // get oss bucket @@ -227,7 +227,7 @@ func (s *AliyunOSS) getBucket(fileName string, metaData map[string]string) (*oss return bucket, nil } -func (s *AliyunOSS) selectClient(uid, bucket string) (*oss.Client, error) { +func (s *AliyunFile) selectClient(uid, bucket string) (*oss.Client, error) { // 1. if user specify client uid, use specify client first if uid != "" { if client, ok := s.client[uid]; ok { @@ -244,5 +244,5 @@ func (s *AliyunOSS) selectClient(uid, bucket string) (*oss.Client, error) { return client, nil } } - return nil, file.ErrNotSpecifyEndpoint + return nil, utils.ErrNotSpecifyEndpoint } diff --git a/components/file/aliyun/file_test.go b/components/file/aliyun/file_test.go index 771bcd2033..6384877513 100644 --- a/components/file/aliyun/file_test.go +++ b/components/file/aliyun/file_test.go @@ -21,6 +21,8 @@ import ( "io" "testing" + "mosn.io/layotto/components/pkg/utils" + "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/stretchr/testify/assert" @@ -50,7 +52,7 @@ func TestInit(t *testing.T) { } func TestSelectClient(t *testing.T) { - ossObject := &AliyunOSS{client: make(map[string]*oss.Client)} + ossObject := &AliyunFile{client: make(map[string]*oss.Client)} client, err := ossObject.selectClient("", "") assert.Equal(t, err.Error(), "should specific endpoint in metadata") assert.Nil(t, client) @@ -75,7 +77,7 @@ func TestGetBucket(t *testing.T) { err := oss.Init(context.TODO(), &fc) assert.Nil(t, err) - ac := oss.(*AliyunOSS) + ac := oss.(*AliyunFile) mt := make(map[string]string) bucket, err := ac.getBucket("/", mt) @@ -98,8 +100,8 @@ func TestGetClient(t *testing.T) { err := oss.Init(context.TODO(), &fc) assert.Nil(t, err) - ac := oss.(*AliyunOSS) - mt := &file.OssMetadata{ + ac := oss.(*AliyunFile) + mt := &utils.OssMetadata{ Endpoint: "endpoint", AccessKeyID: "ak", AccessKeySecret: "ak", @@ -119,8 +121,8 @@ func TestCheckMetadata(t *testing.T) { err := oss.Init(context.TODO(), &fc) assert.Nil(t, err) - ac := oss.(*AliyunOSS) - mt := &file.OssMetadata{ + ac := oss.(*AliyunFile) + mt := &utils.OssMetadata{ Endpoint: "", AccessKeyID: "", AccessKeySecret: "", diff --git a/components/file/aws/file.go b/components/file/aws/file.go index 872a6c3207..682dd62e36 100644 --- a/components/file/aws/file.go +++ b/components/file/aws/file.go @@ -24,6 +24,8 @@ import ( "io" "strings" + "mosn.io/layotto/components/pkg/utils" + "github.com/aws/aws-sdk-go-v2/aws" aws_config "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/credentials" @@ -41,7 +43,7 @@ const ( // AwsOss is a binding for aws oss storage. type AwsOss struct { client map[string]*s3.Client - meta map[string]*file.OssMetadata + meta map[string]*utils.OssMetadata method string rawData json.RawMessage } @@ -49,13 +51,13 @@ type AwsOss struct { func NewAwsFile() file.File { return &AwsOss{ client: make(map[string]*s3.Client), - meta: make(map[string]*file.OssMetadata), + meta: make(map[string]*utils.OssMetadata), } } // Init instance by config. func (a *AwsOss) Init(ctx context.Context, config *file.FileConfig) error { - m := make([]*file.OssMetadata, 0) + m := make([]*utils.OssMetadata, 0) err := json.Unmarshal(config.Metadata, &m) if err != nil { return errors.New("invalid config for aws oss") @@ -81,7 +83,7 @@ func (a *AwsOss) Init(ctx context.Context, config *file.FileConfig) error { } // isAwsMetaValid check if the metadata valid. -func (a *AwsOss) isAwsMetaValid(v *file.OssMetadata) bool { +func (a *AwsOss) isAwsMetaValid(v *utils.OssMetadata) bool { if v.AccessKeySecret == "" || v.Endpoint == "" || v.AccessKeyID == "" { return false } @@ -89,7 +91,7 @@ func (a *AwsOss) isAwsMetaValid(v *file.OssMetadata) bool { } // createOssClient by input meta info. -func (a *AwsOss) createOssClient(meta *file.OssMetadata) (*s3.Client, error) { +func (a *AwsOss) createOssClient(meta *utils.OssMetadata) (*s3.Client, error) { customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) { if region == meta.Region { return aws.Endpoint{ @@ -167,7 +169,7 @@ func (a *AwsOss) selectClient(uid, bucket string) (*s3.Client, error) { return client, nil } } - return nil, file.ErrNotSpecifyEndpoint + return nil, utils.ErrNotSpecifyEndpoint } // Get object from aws oss. diff --git a/components/file/aws/file_test.go b/components/file/aws/file_test.go index a3d2094764..f05714de0f 100644 --- a/components/file/aws/file_test.go +++ b/components/file/aws/file_test.go @@ -22,6 +22,10 @@ import ( "reflect" "testing" + "mosn.io/layotto/components/pkg/utils" + + "mosn.io/layotto/components/oss" + "github.com/jinzhu/copier" "github.com/aws/aws-sdk-go-v2/service/s3" @@ -62,7 +66,7 @@ func TestAwsOss_Init(t *testing.T) { func TestAwsOss_SelectClient(t *testing.T) { oss := &AwsOss{ client: make(map[string]*s3.Client), - meta: make(map[string]*file.OssMetadata), + meta: make(map[string]*utils.OssMetadata), } err := oss.Init(context.TODO(), &file.FileConfig{Metadata: []byte(cfg)}) assert.Equal(t, nil, err) @@ -94,7 +98,7 @@ func TestAwsOss_SelectClient(t *testing.T) { } func TestAwsOss_IsAwsMetaValid(t *testing.T) { - mt := &file.OssMetadata{} + mt := &utils.OssMetadata{} a := AwsOss{} assert.False(t, a.isAwsMetaValid(mt)) mt.AccessKeyID = "a" @@ -149,7 +153,7 @@ type fun = func() (string, error) func TestCopier(t *testing.T) { hello := "hello" - target := &file.ListObjectsOutput{} + target := &oss.ListObjectsOutput{} source := &s3.ListObjectsOutput{Delimiter: &hello, EncodingType: "encoding type"} re := reflect.TypeOf(source) h, _ := re.Elem().FieldByName("EncodingType") diff --git a/components/file/registry.go b/components/file/registry.go index ca33854b48..c3102a237b 100644 --- a/components/file/registry.go +++ b/components/file/registry.go @@ -66,48 +66,3 @@ func (r *FileStoreRegistry) Create(compType string) (File, error) { } return nil, fmt.Errorf("service component %s is not regsitered", compType) } - -type OssRegistry interface { - Register(fs ...*OssFactory) - Create(name string) (Oss, error) -} - -type OssFactory struct { - Name string - FactoryMethod func() Oss -} - -func NewOssFactory(name string, f func() Oss) *OssFactory { - return &OssFactory{ - Name: name, - FactoryMethod: f, - } -} - -type OssStoreRegistry struct { - files map[string]func() Oss - info *info.RuntimeInfo -} - -func NewOssRegistry(info *info.RuntimeInfo) OssRegistry { - info.AddService(ServiceName) - return &OssStoreRegistry{ - files: make(map[string]func() Oss), - info: info, - } -} - -func (r *OssStoreRegistry) Register(fs ...*OssFactory) { - for _, f := range fs { - r.files[f.Name] = f.FactoryMethod - r.info.RegisterComponent(ServiceName, f.Name) - } -} - -func (r *OssStoreRegistry) Create(compType string) (Oss, error) { - if f, ok := r.files[compType]; ok { - r.info.LoadComponent(ServiceName, compType) - return f(), nil - } - return nil, fmt.Errorf("service component %s is not regsitered", compType) -} diff --git a/components/file/types.go b/components/file/types.go index 2afc2fa7be..8e378375c6 100644 --- a/components/file/types.go +++ b/components/file/types.go @@ -21,16 +21,6 @@ import ( "io" ) -// OssMetadata wraps the configuration of oss implementation -type OssMetadata struct { - Buckets []string `json:"buckets"` // contained buckets in this oss client - Uid string `json:"uid"` // specify the uid of oss client - Endpoint string `json:"endpoint"` - AccessKeyID string `json:"accessKeyID"` - AccessKeySecret string `json:"accessKeySecret"` - Region string `json:"region"` -} - // FileConfig wraps configuration for a file implementation type FileConfig struct { Method string `json:"method"` @@ -38,13 +28,6 @@ type FileConfig struct { Type string `json:"type"` } -// FileConfig wraps configuration for a file implementation -type OssConfig struct { - Method string `json:"method"` - Metadata json.RawMessage `json:"metadata"` - Type string `json:"type"` -} - type PutFileStu struct { DataStream io.Reader FileName string diff --git a/components/file/aliyun/option.go b/components/oss/aliyun/option.go similarity index 100% rename from components/file/aliyun/option.go rename to components/oss/aliyun/option.go diff --git a/components/file/aliyun/option_test.go b/components/oss/aliyun/option_test.go similarity index 100% rename from components/file/aliyun/option_test.go rename to components/oss/aliyun/option_test.go diff --git a/components/file/aliyun/oss.go b/components/oss/aliyun/oss.go similarity index 71% rename from components/file/aliyun/oss.go rename to components/oss/aliyun/oss.go index b6f5317400..a4678e7da4 100644 --- a/components/file/aliyun/oss.go +++ b/components/oss/aliyun/oss.go @@ -21,17 +21,27 @@ import ( "encoding/json" "net/http" - "github.com/aliyun/aliyun-oss-go-sdk/oss" + "mosn.io/layotto/components/oss/factory" + + "mosn.io/layotto/components/pkg/utils" - "mosn.io/layotto/components/file" - "mosn.io/layotto/components/file/factory" + l8oss "mosn.io/layotto/components/oss" + + "github.com/aliyun/aliyun-oss-go-sdk/oss" ) const ( DefaultClientInitFunc = "aliyun" ) -func NewAliyunOss() file.Oss { +// AliyunOSS is a binding for an aliyun OSS storage bucketKey +type AliyunOSS struct { + client map[string]*oss.Client + method string + rawData json.RawMessage +} + +func NewAliyunOss() l8oss.Oss { return &AliyunOSS{ client: make(map[string]*oss.Client), } @@ -42,11 +52,11 @@ func init() { } func AliyunDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string) (map[string]interface{}, error) { - m := make([]*file.OssMetadata, 0) + m := make([]*utils.OssMetadata, 0) clients := make(map[string]interface{}) err := json.Unmarshal(staticConf, &m) if err != nil { - return nil, file.ErrInvalid + return nil, l8oss.ErrInvalid } for _, v := range m { client, err := oss.New(v.Endpoint, v.AccessKeyID, v.AccessKeySecret) @@ -64,13 +74,13 @@ func AliyunDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string return clients, nil } -func (a *AliyunOSS) InitConfig(ctx context.Context, config *file.OssConfig) error { +func (a *AliyunOSS) InitConfig(ctx context.Context, config *l8oss.OssConfig) error { a.method = config.Method a.rawData = config.Metadata return nil } -func (a *AliyunOSS) InitClient(ctx context.Context, req *file.InitRequest) error { +func (a *AliyunOSS) InitClient(ctx context.Context, req *l8oss.InitRequest) error { if a.method == "" { a.method = DefaultClientInitFunc } @@ -85,7 +95,7 @@ func (a *AliyunOSS) InitClient(ctx context.Context, req *file.InitRequest) error return nil } -func (a *AliyunOSS) GetObject(ctx context.Context, req *file.GetObjectInput) (*file.GetObjectOutput, error) { +func (a *AliyunOSS) GetObject(ctx context.Context, req *l8oss.GetObjectInput) (*l8oss.GetObjectOutput, error) { client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -97,7 +107,7 @@ func (a *AliyunOSS) GetObject(ctx context.Context, req *file.GetObjectInput) (*f //user can use SignedUrl to get file without ak、sk if req.SignedUrl != "" { body, err := bucket.GetObjectWithURL(req.SignedUrl) - return &file.GetObjectOutput{DataStream: body}, err + return &l8oss.GetObjectOutput{DataStream: body}, err } body, err := bucket.GetObject(req.Key, IfUnmodifiedSince(req.IfUnmodifiedSince), @@ -108,10 +118,10 @@ func (a *AliyunOSS) GetObject(ctx context.Context, req *file.GetObjectInput) (*f AcceptEncoding(req.AcceptEncoding), ) - return &file.GetObjectOutput{DataStream: body}, err + return &l8oss.GetObjectOutput{DataStream: body}, err } -func (a *AliyunOSS) PutObject(ctx context.Context, req *file.PutObjectInput) (*file.PutObjectOutput, error) { +func (a *AliyunOSS) PutObject(ctx context.Context, req *l8oss.PutObjectInput) (*l8oss.PutObjectOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -143,10 +153,10 @@ func (a *AliyunOSS) PutObject(ctx context.Context, req *file.PutObjectInput) (*f metaOption..., ) } - return &file.PutObjectOutput{}, err + return &l8oss.PutObjectOutput{}, err } -func (a *AliyunOSS) DeleteObject(ctx context.Context, req *file.DeleteObjectInput) (*file.DeleteObjectOutput, error) { +func (a *AliyunOSS) DeleteObject(ctx context.Context, req *l8oss.DeleteObjectInput) (*l8oss.DeleteObjectOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -156,9 +166,9 @@ func (a *AliyunOSS) DeleteObject(ctx context.Context, req *file.DeleteObjectInpu return nil, err } err = bucket.DeleteObject(req.Key, RequestPayer(req.RequestPayer), VersionId(req.VersionId)) - return &file.DeleteObjectOutput{}, err + return &l8oss.DeleteObjectOutput{}, err } -func (a *AliyunOSS) DeleteObjects(ctx context.Context, req *file.DeleteObjectsInput) (*file.DeleteObjectsOutput, error) { +func (a *AliyunOSS) DeleteObjects(ctx context.Context, req *l8oss.DeleteObjectsInput) (*l8oss.DeleteObjectsOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -176,15 +186,15 @@ func (a *AliyunOSS) DeleteObjects(ctx context.Context, req *file.DeleteObjectsIn if err != nil { return nil, err } - out := &file.DeleteObjectsOutput{} + out := &l8oss.DeleteObjectsOutput{} for _, v := range resp.DeletedObjectsDetail { - object := &file.DeletedObject{Key: v.Key, VersionId: v.VersionId, DeleteMarker: v.DeleteMarker, DeleteMarkerVersionId: v.DeleteMarkerVersionId} + object := &l8oss.DeletedObject{Key: v.Key, VersionId: v.VersionId, DeleteMarker: v.DeleteMarker, DeleteMarkerVersionId: v.DeleteMarkerVersionId} out.Deleted = append(out.Deleted, object) } return out, err } -func (a *AliyunOSS) PutObjectTagging(ctx context.Context, req *file.PutObjectTaggingInput) (*file.PutObjectTaggingOutput, error) { +func (a *AliyunOSS) PutObjectTagging(ctx context.Context, req *l8oss.PutObjectTaggingInput) (*l8oss.PutObjectTaggingOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -202,7 +212,7 @@ func (a *AliyunOSS) PutObjectTagging(ctx context.Context, req *file.PutObjectTag return nil, err } -func (a *AliyunOSS) DeleteObjectTagging(ctx context.Context, req *file.DeleteObjectTaggingInput) (*file.DeleteObjectTaggingOutput, error) { +func (a *AliyunOSS) DeleteObjectTagging(ctx context.Context, req *l8oss.DeleteObjectTaggingInput) (*l8oss.DeleteObjectTaggingOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -215,7 +225,7 @@ func (a *AliyunOSS) DeleteObjectTagging(ctx context.Context, req *file.DeleteObj return nil, err } -func (a *AliyunOSS) GetObjectTagging(ctx context.Context, req *file.GetObjectTaggingInput) (*file.GetObjectTaggingOutput, error) { +func (a *AliyunOSS) GetObjectTagging(ctx context.Context, req *l8oss.GetObjectTaggingInput) (*l8oss.GetObjectTaggingOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -228,14 +238,14 @@ func (a *AliyunOSS) GetObjectTagging(ctx context.Context, req *file.GetObjectTag if err != nil { return nil, err } - out := &file.GetObjectTaggingOutput{Tags: map[string]string{}} + out := &l8oss.GetObjectTaggingOutput{Tags: map[string]string{}} for _, v := range resp.Tags { out.Tags[v.Key] = v.Value } return out, err } -func (a *AliyunOSS) GetObjectCannedAcl(ctx context.Context, req *file.GetObjectCannedAclInput) (*file.GetObjectCannedAclOutput, error) { +func (a *AliyunOSS) GetObjectCannedAcl(ctx context.Context, req *l8oss.GetObjectCannedAclInput) (*l8oss.GetObjectCannedAclOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -248,10 +258,10 @@ func (a *AliyunOSS) GetObjectCannedAcl(ctx context.Context, req *file.GetObjectC if err != nil { return nil, err } - output := &file.GetObjectCannedAclOutput{CannedAcl: resp.ACL, Owner: &file.Owner{DisplayName: resp.Owner.DisplayName, ID: resp.Owner.ID}} + output := &l8oss.GetObjectCannedAclOutput{CannedAcl: resp.ACL, Owner: &l8oss.Owner{DisplayName: resp.Owner.DisplayName, ID: resp.Owner.ID}} return output, err } -func (a *AliyunOSS) PutObjectCannedAcl(ctx context.Context, req *file.PutObjectCannedAclInput) (*file.PutObjectCannedAclOutput, error) { +func (a *AliyunOSS) PutObjectCannedAcl(ctx context.Context, req *l8oss.PutObjectCannedAclInput) (*l8oss.PutObjectCannedAclOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -261,10 +271,10 @@ func (a *AliyunOSS) PutObjectCannedAcl(ctx context.Context, req *file.PutObjectC return nil, err } err = bucket.SetObjectACL(req.Key, oss.ACLType(req.Acl)) - output := &file.PutObjectCannedAclOutput{} + output := &l8oss.PutObjectCannedAclOutput{} return output, err } -func (a *AliyunOSS) ListObjects(ctx context.Context, req *file.ListObjectsInput) (*file.ListObjectsOutput, error) { +func (a *AliyunOSS) ListObjects(ctx context.Context, req *l8oss.ListObjectsInput) (*l8oss.ListObjectsOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -277,7 +287,7 @@ func (a *AliyunOSS) ListObjects(ctx context.Context, req *file.ListObjectsInput) if err != nil { return nil, err } - out := &file.ListObjectsOutput{ + out := &l8oss.ListObjectsOutput{ CommonPrefixes: resp.CommonPrefixes, Delimiter: resp.Delimiter, IsTruncated: resp.IsTruncated, @@ -287,11 +297,11 @@ func (a *AliyunOSS) ListObjects(ctx context.Context, req *file.ListObjectsInput) Prefix: resp.Prefix, } for _, v := range resp.Objects { - object := &file.Object{ + object := &l8oss.Object{ ETag: v.ETag, Key: v.Key, LastModified: v.LastModified.Unix(), - Owner: &file.Owner{ID: v.Owner.ID, DisplayName: v.Owner.DisplayName}, + Owner: &l8oss.Owner{ID: v.Owner.ID, DisplayName: v.Owner.DisplayName}, Size: v.Size, StorageClass: v.StorageClass, } @@ -299,7 +309,7 @@ func (a *AliyunOSS) ListObjects(ctx context.Context, req *file.ListObjectsInput) } return out, nil } -func (a *AliyunOSS) CopyObject(ctx context.Context, req *file.CopyObjectInput) (*file.CopyObjectOutput, error) { +func (a *AliyunOSS) CopyObject(ctx context.Context, req *l8oss.CopyObjectInput) (*l8oss.CopyObjectOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -319,11 +329,11 @@ func (a *AliyunOSS) CopyObject(ctx context.Context, req *file.CopyObjectInput) ( if err != nil { return nil, err } - out := &file.CopyObjectOutput{CopyObjectResult: &file.CopyObjectResult{ETag: resp.ETag, LastModified: resp.LastModified.Unix()}} + out := &l8oss.CopyObjectOutput{CopyObjectResult: &l8oss.CopyObjectResult{ETag: resp.ETag, LastModified: resp.LastModified.Unix()}} return out, err } -func (a *AliyunOSS) CreateMultipartUpload(ctx context.Context, req *file.CreateMultipartUploadInput) (*file.CreateMultipartUploadOutput, error) { +func (a *AliyunOSS) CreateMultipartUpload(ctx context.Context, req *l8oss.CreateMultipartUploadInput) (*l8oss.CreateMultipartUploadOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -333,10 +343,10 @@ func (a *AliyunOSS) CreateMultipartUpload(ctx context.Context, req *file.CreateM return nil, err } resp, err := bucket.InitiateMultipartUpload(req.Key) - output := &file.CreateMultipartUploadOutput{Bucket: resp.Bucket, Key: resp.Key, UploadId: resp.UploadID} + output := &l8oss.CreateMultipartUploadOutput{Bucket: resp.Bucket, Key: resp.Key, UploadId: resp.UploadID} return output, err } -func (a *AliyunOSS) UploadPart(ctx context.Context, req *file.UploadPartInput) (*file.UploadPartOutput, error) { +func (a *AliyunOSS) UploadPart(ctx context.Context, req *l8oss.UploadPartInput) (*l8oss.UploadPartOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -350,10 +360,10 @@ func (a *AliyunOSS) UploadPart(ctx context.Context, req *file.UploadPartInput) ( req.DataStream, req.ContentLength, int(req.PartNumber)) - output := &file.UploadPartOutput{ETag: resp.ETag} + output := &l8oss.UploadPartOutput{ETag: resp.ETag} return output, err } -func (a *AliyunOSS) UploadPartCopy(ctx context.Context, req *file.UploadPartCopyInput) (*file.UploadPartCopyOutput, error) { +func (a *AliyunOSS) UploadPartCopy(ctx context.Context, req *l8oss.UploadPartCopyInput) (*l8oss.UploadPartCopyOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -371,10 +381,10 @@ func (a *AliyunOSS) UploadPartCopy(ctx context.Context, req *file.UploadPartCopy int(req.PartNumber), VersionId(req.CopySource.CopySourceVersionId), ) - output := &file.UploadPartCopyOutput{CopyPartResult: &file.CopyPartResult{ETag: resp.ETag}} + output := &l8oss.UploadPartCopyOutput{CopyPartResult: &l8oss.CopyPartResult{ETag: resp.ETag}} return output, err } -func (a *AliyunOSS) CompleteMultipartUpload(ctx context.Context, req *file.CompleteMultipartUploadInput) (*file.CompleteMultipartUploadOutput, error) { +func (a *AliyunOSS) CompleteMultipartUpload(ctx context.Context, req *l8oss.CompleteMultipartUploadInput) (*l8oss.CompleteMultipartUploadOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -395,10 +405,10 @@ func (a *AliyunOSS) CompleteMultipartUpload(ctx context.Context, req *file.Compl oss.InitiateMultipartUploadResult{Bucket: req.Bucket, Key: req.Key, UploadID: req.UploadId}, parts, ) - output := &file.CompleteMultipartUploadOutput{Location: resp.Location, Bucket: resp.Bucket, Key: resp.Key, ETag: resp.ETag} + output := &l8oss.CompleteMultipartUploadOutput{Location: resp.Location, Bucket: resp.Bucket, Key: resp.Key, ETag: resp.ETag} return output, err } -func (a *AliyunOSS) AbortMultipartUpload(ctx context.Context, req *file.AbortMultipartUploadInput) (*file.AbortMultipartUploadOutput, error) { +func (a *AliyunOSS) AbortMultipartUpload(ctx context.Context, req *l8oss.AbortMultipartUploadInput) (*l8oss.AbortMultipartUploadOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -411,10 +421,10 @@ func (a *AliyunOSS) AbortMultipartUpload(ctx context.Context, req *file.AbortMul err = bucket.AbortMultipartUpload( oss.InitiateMultipartUploadResult{Bucket: req.Bucket, Key: req.Key, UploadID: req.UploadId}, ) - output := &file.AbortMultipartUploadOutput{} + output := &l8oss.AbortMultipartUploadOutput{} return output, err } -func (a *AliyunOSS) ListMultipartUploads(ctx context.Context, req *file.ListMultipartUploadsInput) (*file.ListMultipartUploadsOutput, error) { +func (a *AliyunOSS) ListMultipartUploads(ctx context.Context, req *l8oss.ListMultipartUploadsInput) (*l8oss.ListMultipartUploadsOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -424,7 +434,7 @@ func (a *AliyunOSS) ListMultipartUploads(ctx context.Context, req *file.ListMult return nil, err } resp, err := bucket.ListMultipartUploads(Prefix(req.Prefix), KeyMarker(req.KeyMarker), MaxUploads(int(req.MaxUploads)), Delimiter(req.Delimiter), UploadIDMarker(req.UploadIdMarker)) - output := &file.ListMultipartUploadsOutput{ + output := &l8oss.ListMultipartUploadsOutput{ Bucket: resp.Bucket, Delimiter: resp.Delimiter, Prefix: resp.Prefix, @@ -437,13 +447,13 @@ func (a *AliyunOSS) ListMultipartUploads(ctx context.Context, req *file.ListMult CommonPrefixes: resp.CommonPrefixes, } for _, v := range resp.Uploads { - upload := &file.MultipartUpload{Initiated: v.Initiated.Unix(), UploadId: v.UploadID, Key: v.Key} + upload := &l8oss.MultipartUpload{Initiated: v.Initiated.Unix(), UploadId: v.UploadID, Key: v.Key} output.Uploads = append(output.Uploads, upload) } return output, err } -func (a *AliyunOSS) RestoreObject(ctx context.Context, req *file.RestoreObjectInput) (*file.RestoreObjectOutput, error) { +func (a *AliyunOSS) RestoreObject(ctx context.Context, req *l8oss.RestoreObjectInput) (*l8oss.RestoreObjectOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -453,11 +463,11 @@ func (a *AliyunOSS) RestoreObject(ctx context.Context, req *file.RestoreObjectIn return nil, err } err = bucket.RestoreObject(req.Key) - output := &file.RestoreObjectOutput{} + output := &l8oss.RestoreObjectOutput{} return output, err } -func (a *AliyunOSS) ListObjectVersions(ctx context.Context, req *file.ListObjectVersionsInput) (*file.ListObjectVersionsOutput, error) { +func (a *AliyunOSS) ListObjectVersions(ctx context.Context, req *l8oss.ListObjectVersionsInput) (*l8oss.ListObjectVersionsOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -467,7 +477,7 @@ func (a *AliyunOSS) ListObjectVersions(ctx context.Context, req *file.ListObject return nil, err } resp, err := bucket.ListObjectVersions() - output := &file.ListObjectVersionsOutput{ + output := &l8oss.ListObjectVersionsOutput{ Name: resp.Name, Prefix: resp.Prefix, KeyMarker: resp.KeyMarker, @@ -480,11 +490,11 @@ func (a *AliyunOSS) ListObjectVersions(ctx context.Context, req *file.ListObject CommonPrefixes: resp.CommonPrefixes, } for _, v := range resp.ObjectDeleteMarkers { - marker := &file.DeleteMarkerEntry{ + marker := &l8oss.DeleteMarkerEntry{ IsLatest: v.IsLatest, Key: v.Key, LastModified: v.LastModified.Unix(), - Owner: &file.Owner{ + Owner: &l8oss.Owner{ ID: v.Owner.ID, DisplayName: v.Owner.DisplayName, }, @@ -494,12 +504,12 @@ func (a *AliyunOSS) ListObjectVersions(ctx context.Context, req *file.ListObject } for _, v := range resp.ObjectVersions { - version := &file.ObjectVersion{ + version := &l8oss.ObjectVersion{ ETag: v.ETag, IsLatest: v.IsLatest, Key: v.Key, LastModified: v.LastModified.Unix(), - Owner: &file.Owner{ + Owner: &l8oss.Owner{ ID: v.Owner.ID, DisplayName: v.Owner.DisplayName, }, @@ -513,7 +523,7 @@ func (a *AliyunOSS) ListObjectVersions(ctx context.Context, req *file.ListObject return output, err } -func (a *AliyunOSS) HeadObject(ctx context.Context, req *file.HeadObjectInput) (*file.HeadObjectOutput, error) { +func (a *AliyunOSS) HeadObject(ctx context.Context, req *l8oss.HeadObjectInput) (*l8oss.HeadObjectOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -522,7 +532,7 @@ func (a *AliyunOSS) HeadObject(ctx context.Context, req *file.HeadObjectInput) ( if err != nil { return nil, err } - output := &file.HeadObjectOutput{ResultMetadata: map[string]string{}} + output := &l8oss.HeadObjectOutput{ResultMetadata: map[string]string{}} var resp http.Header if req.WithDetails { resp, err = bucket.GetObjectDetailedMeta(req.Key) @@ -545,7 +555,7 @@ func (a *AliyunOSS) HeadObject(ctx context.Context, req *file.HeadObjectInput) ( return output, err } -func (a *AliyunOSS) IsObjectExist(ctx context.Context, req *file.IsObjectExistInput) (*file.IsObjectExistOutput, error) { +func (a *AliyunOSS) IsObjectExist(ctx context.Context, req *l8oss.IsObjectExistInput) (*l8oss.IsObjectExistOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -555,10 +565,10 @@ func (a *AliyunOSS) IsObjectExist(ctx context.Context, req *file.IsObjectExistIn return nil, err } resp, err := bucket.IsObjectExist(req.Key) - return &file.IsObjectExistOutput{FileExist: resp}, err + return &l8oss.IsObjectExistOutput{FileExist: resp}, err } -func (a *AliyunOSS) SignURL(ctx context.Context, req *file.SignURLInput) (*file.SignURLOutput, error) { +func (a *AliyunOSS) SignURL(ctx context.Context, req *l8oss.SignURLInput) (*l8oss.SignURLOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -568,11 +578,11 @@ func (a *AliyunOSS) SignURL(ctx context.Context, req *file.SignURLInput) (*file. return nil, err } resp, err := bucket.SignURL(req.Key, oss.HTTPMethod(req.Method), req.ExpiredInSec) - return &file.SignURLOutput{SignedUrl: resp}, err + return &l8oss.SignURLOutput{SignedUrl: resp}, err } //UpdateDownLoadBandwidthRateLimit update all client rate -func (a *AliyunOSS) UpdateDownLoadBandwidthRateLimit(ctx context.Context, req *file.UpdateBandwidthRateLimitInput) error { +func (a *AliyunOSS) UpdateDownLoadBandwidthRateLimit(ctx context.Context, req *l8oss.UpdateBandwidthRateLimitInput) error { for _, cli := range a.client { err := cli.LimitDownloadSpeed(int(req.AverageRateLimitInBitsPerSec)) return err @@ -581,7 +591,7 @@ func (a *AliyunOSS) UpdateDownLoadBandwidthRateLimit(ctx context.Context, req *f } //UpdateUpLoadBandwidthRateLimit update all client rate -func (a *AliyunOSS) UpdateUpLoadBandwidthRateLimit(ctx context.Context, req *file.UpdateBandwidthRateLimitInput) error { +func (a *AliyunOSS) UpdateUpLoadBandwidthRateLimit(ctx context.Context, req *l8oss.UpdateBandwidthRateLimitInput) error { for _, cli := range a.client { err := cli.LimitUploadSpeed(int(req.AverageRateLimitInBitsPerSec)) return err @@ -589,7 +599,7 @@ func (a *AliyunOSS) UpdateUpLoadBandwidthRateLimit(ctx context.Context, req *fil return nil } -func (a *AliyunOSS) AppendObject(ctx context.Context, req *file.AppendObjectInput) (*file.AppendObjectOutput, error) { +func (a *AliyunOSS) AppendObject(ctx context.Context, req *l8oss.AppendObjectInput) (*l8oss.AppendObjectOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -609,10 +619,10 @@ func (a *AliyunOSS) AppendObject(ctx context.Context, req *file.AppendObjectInpu if err != nil { return nil, err } - return &file.AppendObjectOutput{AppendPosition: resp}, err + return &l8oss.AppendObjectOutput{AppendPosition: resp}, err } -func (a *AliyunOSS) ListParts(ctx context.Context, req *file.ListPartsInput) (*file.ListPartsOutput, error) { +func (a *AliyunOSS) ListParts(ctx context.Context, req *l8oss.ListPartsInput) (*l8oss.ListPartsOutput, error) { cli, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -629,7 +639,7 @@ func (a *AliyunOSS) ListParts(ctx context.Context, req *file.ListPartsInput) (*f if err != nil { return nil, err } - out := &file.ListPartsOutput{ + out := &l8oss.ListPartsOutput{ Bucket: resp.Bucket, Key: resp.Key, UploadId: resp.UploadID, @@ -638,8 +648,28 @@ func (a *AliyunOSS) ListParts(ctx context.Context, req *file.ListPartsInput) (*f IsTruncated: resp.IsTruncated, } for _, v := range resp.UploadedParts { - part := &file.Part{Etag: v.ETag, LastModified: v.LastModified.Unix(), PartNumber: int64(v.PartNumber), Size: int64(v.Size)} + part := &l8oss.Part{Etag: v.ETag, LastModified: v.LastModified.Unix(), PartNumber: int64(v.PartNumber), Size: int64(v.Size)} out.Parts = append(out.Parts, part) } return out, err } + +func (s *AliyunOSS) selectClient(uid, bucket string) (*oss.Client, error) { + // 1. if user specify client uid, use specify client first + if uid != "" { + if client, ok := s.client[uid]; ok { + return client, nil + } + } + // 2. if user not specify client uid, use bucket to select client + if client, ok := s.client[bucket]; ok { + return client, nil + } + // 3. if not specify uid and bucket, select default one + if len(s.client) == 1 { + for _, client := range s.client { + return client, nil + } + } + return nil, utils.ErrNotSpecifyEndpoint +} diff --git a/components/file/aliyun/oss_test.go b/components/oss/aliyun/oss_test.go similarity index 60% rename from components/file/aliyun/oss_test.go rename to components/oss/aliyun/oss_test.go index c6eaef24a3..c43993e412 100644 --- a/components/file/aliyun/oss_test.go +++ b/components/oss/aliyun/oss_test.go @@ -20,13 +20,15 @@ import ( "context" "testing" - "mosn.io/pkg/buffer" + "mosn.io/layotto/components/oss/factory" + + "mosn.io/layotto/components/oss" - "mosn.io/layotto/components/file" + "mosn.io/pkg/buffer" "github.com/stretchr/testify/assert" - "mosn.io/layotto/components/file/factory" + l8oss "mosn.io/layotto/components/oss" ) const ( @@ -60,17 +62,17 @@ func TestInitAliyunOss(t *testing.T) { NewAliyunOss() f := factory.GetInitFunc(DefaultClientInitFunc) clients, err := f([]byte("hello"), map[string]string{}) - assert.Equal(t, err, file.ErrInvalid) + assert.Equal(t, err, l8oss.ErrInvalid) assert.Nil(t, clients) clients, err = f([]byte(confWithoutUidAndBucket), map[string]string{}) - assert.NotEqual(t, file.ErrInvalid, err) + assert.NotEqual(t, l8oss.ErrInvalid, err) assert.NotNil(t, clients) client, ok := clients[""] assert.Equal(t, true, ok) assert.NotNil(t, client) clients, err = f([]byte(confWithUid), map[string]string{}) - assert.NotEqual(t, file.ErrInvalid, err) + assert.NotEqual(t, l8oss.ErrInvalid, err) assert.NotNil(t, clients) client, ok = clients[""] assert.Equal(t, false, ok) @@ -80,7 +82,7 @@ func TestInitAliyunOss(t *testing.T) { assert.NotNil(t, client) clients, err = f([]byte(confWithUidAndBucket), map[string]string{}) - assert.NotEqual(t, file.ErrInvalid, err) + assert.NotEqual(t, l8oss.ErrInvalid, err) assert.NotNil(t, clients) client, ok = clients[""] assert.Equal(t, false, ok) @@ -102,9 +104,9 @@ func TestInitAliyunOss(t *testing.T) { func TestAliyunOss(t *testing.T) { instance := NewAliyunOss() - err := instance.InitConfig(context.TODO(), &file.FileConfig{Method: "", Metadata: []byte(confWithUidAndBucket)}) + err := instance.InitConfig(context.TODO(), &l8oss.OssConfig{Method: "", Metadata: []byte(confWithUidAndBucket)}) assert.Nil(t, err) - err = instance.InitClient(context.TODO(), &file.InitRequest{}) + err = instance.InitClient(context.TODO(), &oss.InitRequest{}) assert.Nil(t, err) aliyun := instance.(*AliyunOSS) @@ -117,80 +119,80 @@ func TestAliyunOss(t *testing.T) { clientBucket2, _ := aliyun.selectClient("123", "bucket2") assert.Equal(t, clientBucket2, aliyun.client["bucket2"]) - appendObjectResp, err := instance.AppendObject(context.TODO(), &file.AppendObjectInput{}) + appendObjectResp, err := instance.AppendObject(context.TODO(), &oss.AppendObjectInput{}) assert.NotNil(t, err) assert.Nil(t, appendObjectResp) - _, err = instance.AbortMultipartUpload(context.TODO(), &file.AbortMultipartUploadInput{}) + _, err = instance.AbortMultipartUpload(context.TODO(), &oss.AbortMultipartUploadInput{}) assert.NotNil(t, err) - _, err = instance.CompleteMultipartUpload(context.TODO(), &file.CompleteMultipartUploadInput{}) + _, err = instance.CompleteMultipartUpload(context.TODO(), &oss.CompleteMultipartUploadInput{}) assert.NotNil(t, err) - _, err = instance.CopyObject(context.TODO(), &file.CopyObjectInput{}) + _, err = instance.CopyObject(context.TODO(), &oss.CopyObjectInput{}) assert.NotNil(t, err) - _, err = instance.CreateMultipartUpload(context.TODO(), &file.CreateMultipartUploadInput{}) + _, err = instance.CreateMultipartUpload(context.TODO(), &oss.CreateMultipartUploadInput{}) assert.NotNil(t, err) - _, err = instance.DeleteObject(context.TODO(), &file.DeleteObjectInput{}) + _, err = instance.DeleteObject(context.TODO(), &oss.DeleteObjectInput{}) assert.NotNil(t, err) - _, err = instance.DeleteObjects(context.TODO(), &file.DeleteObjectsInput{ - Delete: &file.Delete{}, + _, err = instance.DeleteObjects(context.TODO(), &oss.DeleteObjectsInput{ + Delete: &oss.Delete{}, }) assert.NotNil(t, err) - _, err = instance.DeleteObjectTagging(context.TODO(), &file.DeleteObjectTaggingInput{}) + _, err = instance.DeleteObjectTagging(context.TODO(), &oss.DeleteObjectTaggingInput{}) assert.NotNil(t, err) - _, err = instance.GetObject(context.TODO(), &file.GetObjectInput{}) + _, err = instance.GetObject(context.TODO(), &oss.GetObjectInput{}) assert.NotNil(t, err) - _, err = instance.GetObjectCannedAcl(context.TODO(), &file.GetObjectCannedAclInput{}) + _, err = instance.GetObjectCannedAcl(context.TODO(), &oss.GetObjectCannedAclInput{}) assert.NotNil(t, err) - _, err = instance.GetObjectTagging(context.TODO(), &file.GetObjectTaggingInput{}) + _, err = instance.GetObjectTagging(context.TODO(), &oss.GetObjectTaggingInput{}) assert.NotNil(t, err) - _, err = instance.HeadObject(context.TODO(), &file.HeadObjectInput{}) + _, err = instance.HeadObject(context.TODO(), &oss.HeadObjectInput{}) assert.NotNil(t, err) - _, err = instance.IsObjectExist(context.TODO(), &file.IsObjectExistInput{}) + _, err = instance.IsObjectExist(context.TODO(), &oss.IsObjectExistInput{}) assert.NotNil(t, err) - _, err = instance.ListParts(context.TODO(), &file.ListPartsInput{}) + _, err = instance.ListParts(context.TODO(), &oss.ListPartsInput{}) assert.NotNil(t, err) - _, err = instance.ListMultipartUploads(context.TODO(), &file.ListMultipartUploadsInput{}) + _, err = instance.ListMultipartUploads(context.TODO(), &oss.ListMultipartUploadsInput{}) assert.NotNil(t, err) - _, err = instance.ListObjects(context.TODO(), &file.ListObjectsInput{}) + _, err = instance.ListObjects(context.TODO(), &oss.ListObjectsInput{}) assert.NotNil(t, err) - _, err = instance.ListObjectVersions(context.TODO(), &file.ListObjectVersionsInput{}) + _, err = instance.ListObjectVersions(context.TODO(), &oss.ListObjectVersionsInput{}) assert.NotNil(t, err) stream := buffer.NewIoBufferString("hello") - _, err = instance.PutObject(context.TODO(), &file.PutObjectInput{DataStream: stream}) + _, err = instance.PutObject(context.TODO(), &oss.PutObjectInput{DataStream: stream}) assert.NotNil(t, err) - _, err = instance.PutObjectCannedAcl(context.TODO(), &file.PutObjectCannedAclInput{}) + _, err = instance.PutObjectCannedAcl(context.TODO(), &oss.PutObjectCannedAclInput{}) assert.NotNil(t, err) - _, err = instance.PutObjectTagging(context.TODO(), &file.PutObjectTaggingInput{}) + _, err = instance.PutObjectTagging(context.TODO(), &oss.PutObjectTaggingInput{}) assert.NotNil(t, err) - _, err = instance.RestoreObject(context.TODO(), &file.RestoreObjectInput{}) + _, err = instance.RestoreObject(context.TODO(), &oss.RestoreObjectInput{}) assert.NotNil(t, err) - _, err = instance.SignURL(context.TODO(), &file.SignURLInput{}) + _, err = instance.SignURL(context.TODO(), &oss.SignURLInput{}) assert.NotNil(t, err) - _, err = instance.UploadPartCopy(context.TODO(), &file.UploadPartCopyInput{ - CopySource: &file.CopySource{CopySourceBucket: "bucket", CopySourceKey: "key"}, + _, err = instance.UploadPartCopy(context.TODO(), &oss.UploadPartCopyInput{ + CopySource: &oss.CopySource{CopySourceBucket: "bucket", CopySourceKey: "key"}, }) assert.NotNil(t, err) - _, err = instance.UploadPart(context.TODO(), &file.UploadPartInput{}) + _, err = instance.UploadPart(context.TODO(), &oss.UploadPartInput{}) assert.NotNil(t, err) - err = instance.UpdateDownLoadBandwidthRateLimit(context.TODO(), &file.UpdateBandwidthRateLimitInput{}) + err = instance.UpdateDownLoadBandwidthRateLimit(context.TODO(), &oss.UpdateBandwidthRateLimitInput{}) assert.Nil(t, err) - err = instance.UpdateUpLoadBandwidthRateLimit(context.TODO(), &file.UpdateBandwidthRateLimitInput{}) + err = instance.UpdateUpLoadBandwidthRateLimit(context.TODO(), &oss.UpdateBandwidthRateLimitInput{}) assert.Nil(t, err) } diff --git a/components/file/aws/option.go b/components/oss/aws/option.go similarity index 100% rename from components/file/aws/option.go rename to components/oss/aws/option.go diff --git a/components/file/aws/option_test.go b/components/oss/aws/option_test.go similarity index 100% rename from components/file/aws/option_test.go rename to components/oss/aws/option_test.go diff --git a/components/file/aws/oss.go b/components/oss/aws/oss.go similarity index 72% rename from components/file/aws/oss.go rename to components/oss/aws/oss.go index 7b05dfe260..b1c9af8285 100644 --- a/components/file/aws/oss.go +++ b/components/oss/aws/oss.go @@ -25,6 +25,12 @@ import ( "strings" "time" + "mosn.io/layotto/components/pkg/utils" + + "mosn.io/layotto/components/oss/factory" + + "mosn.io/layotto/components/oss" + "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" @@ -34,9 +40,6 @@ import ( "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/jinzhu/copier" "mosn.io/pkg/log" - - "mosn.io/layotto/components/file" - "mosn.io/layotto/components/file/factory" ) const ( @@ -47,12 +50,20 @@ func init() { factory.RegisterInitFunc(DefaultClientInitFunc, AwsDefaultInitFunc) } +// AwsOss is a binding for aws oss storage. +type AwsOss struct { + client map[string]*s3.Client + meta map[string]*utils.OssMetadata + method string + rawData json.RawMessage +} + func AwsDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string) (map[string]interface{}, error) { - m := make([]*file.OssMetadata, 0) + m := make([]*utils.OssMetadata, 0) err := json.Unmarshal(staticConf, &m) clients := make(map[string]interface{}) if err != nil { - return nil, file.ErrInvalid + return nil, oss.ErrInvalid } for _, data := range m { optFunc := []func(options *aws_config.LoadOptions) error{ @@ -60,7 +71,7 @@ func AwsDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string) ( aws_config.WithCredentialsProvider(credentials.StaticCredentialsProvider{ Value: aws.Credentials{ AccessKeyID: data.AccessKeyID, SecretAccessKey: data.AccessKeySecret, - Source: defaultCredentialsSource, + Source: "provider", }, }), } @@ -81,19 +92,19 @@ func AwsDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string) ( return clients, nil } -func NewAwsOss() file.Oss { +func NewAwsOss() oss.Oss { return &AwsOss{ client: make(map[string]*s3.Client), - meta: make(map[string]*file.OssMetadata), + meta: make(map[string]*utils.OssMetadata), } } -func (a *AwsOss) InitConfig(ctx context.Context, config *file.OssConfig) error { +func (a *AwsOss) InitConfig(ctx context.Context, config *oss.OssConfig) error { a.method = config.Method a.rawData = config.Metadata return nil } -func (a *AwsOss) InitClient(ctx context.Context, req *file.InitRequest) error { +func (a *AwsOss) InitClient(ctx context.Context, req *oss.InitRequest) error { if a.method == "" { a.method = DefaultClientInitFunc } @@ -108,7 +119,7 @@ func (a *AwsOss) InitClient(ctx context.Context, req *file.InitRequest) error { return nil } -func (a *AwsOss) GetObject(ctx context.Context, req *file.GetObjectInput) (*file.GetObjectOutput, error) { +func (a *AwsOss) GetObject(ctx context.Context, req *oss.GetObjectInput) (*oss.GetObjectOutput, error) { input := &s3.GetObjectInput{} client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { @@ -122,7 +133,7 @@ func (a *AwsOss) GetObject(ctx context.Context, req *file.GetObjectInput) (*file if err != nil { return nil, err } - out := &file.GetObjectOutput{} + out := &oss.GetObjectOutput{} err = copier.Copy(out, ob) if err != nil { return nil, err @@ -131,7 +142,7 @@ func (a *AwsOss) GetObject(ctx context.Context, req *file.GetObjectInput) (*file return out, nil } -func (a *AwsOss) PutObject(ctx context.Context, req *file.PutObjectInput) (*file.PutObjectOutput, error) { +func (a *AwsOss) PutObject(ctx context.Context, req *oss.PutObjectInput) (*oss.PutObjectOutput, error) { client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -147,7 +158,7 @@ func (a *AwsOss) PutObject(ctx context.Context, req *file.PutObjectInput) (*file if err != nil { return nil, err } - out := &file.PutObjectOutput{} + out := &oss.PutObjectOutput{} err = copier.Copy(out, resp) if err != nil { return nil, err @@ -155,7 +166,7 @@ func (a *AwsOss) PutObject(ctx context.Context, req *file.PutObjectInput) (*file return out, err } -func (a *AwsOss) DeleteObject(ctx context.Context, req *file.DeleteObjectInput) (*file.DeleteObjectOutput, error) { +func (a *AwsOss) DeleteObject(ctx context.Context, req *oss.DeleteObjectInput) (*oss.DeleteObjectOutput, error) { input := &s3.DeleteObjectInput{ Bucket: &req.Bucket, Key: &req.Key, @@ -168,10 +179,10 @@ func (a *AwsOss) DeleteObject(ctx context.Context, req *file.DeleteObjectInput) if err != nil { return nil, err } - return &file.DeleteObjectOutput{DeleteMarker: resp.DeleteMarker, RequestCharged: string(resp.RequestCharged), VersionId: *resp.VersionId}, err + return &oss.DeleteObjectOutput{DeleteMarker: resp.DeleteMarker, RequestCharged: string(resp.RequestCharged), VersionId: *resp.VersionId}, err } -func (a *AwsOss) PutObjectTagging(ctx context.Context, req *file.PutObjectTaggingInput) (*file.PutObjectTaggingOutput, error) { +func (a *AwsOss) PutObjectTagging(ctx context.Context, req *oss.PutObjectTaggingInput) (*oss.PutObjectTaggingOutput, error) { client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -186,9 +197,9 @@ func (a *AwsOss) PutObjectTagging(ctx context.Context, req *file.PutObjectTaggin input.Tagging.TagSet = append(input.Tagging.TagSet, types.Tag{Key: &k, Value: &v}) } _, err = client.PutObjectTagging(ctx, input) - return &file.PutObjectTaggingOutput{}, err + return &oss.PutObjectTaggingOutput{}, err } -func (a *AwsOss) DeleteObjectTagging(ctx context.Context, req *file.DeleteObjectTaggingInput) (*file.DeleteObjectTaggingOutput, error) { +func (a *AwsOss) DeleteObjectTagging(ctx context.Context, req *oss.DeleteObjectTaggingInput) (*oss.DeleteObjectTaggingOutput, error) { client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -202,10 +213,10 @@ func (a *AwsOss) DeleteObjectTagging(ctx context.Context, req *file.DeleteObject if err != nil { return nil, err } - return &file.DeleteObjectTaggingOutput{VersionId: *resp.VersionId}, err + return &oss.DeleteObjectTaggingOutput{VersionId: *resp.VersionId}, err } -func (a *AwsOss) GetObjectTagging(ctx context.Context, req *file.GetObjectTaggingInput) (*file.GetObjectTaggingOutput, error) { +func (a *AwsOss) GetObjectTagging(ctx context.Context, req *oss.GetObjectTaggingInput) (*oss.GetObjectTaggingOutput, error) { client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -220,14 +231,14 @@ func (a *AwsOss) GetObjectTagging(ctx context.Context, req *file.GetObjectTaggin return nil, err } - output := &file.GetObjectTaggingOutput{Tags: map[string]string{}} + output := &oss.GetObjectTaggingOutput{Tags: map[string]string{}} for _, tags := range resp.TagSet { output.Tags[*tags.Key] = *tags.Value } return output, err } -func (a *AwsOss) CopyObject(ctx context.Context, req *file.CopyObjectInput) (*file.CopyObjectOutput, error) { +func (a *AwsOss) CopyObject(ctx context.Context, req *oss.CopyObjectInput) (*oss.CopyObjectOutput, error) { client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -252,9 +263,9 @@ func (a *AwsOss) CopyObject(ctx context.Context, req *file.CopyObjectInput) (*fi if err != nil { return nil, err } - return &file.CopyObjectOutput{CopyObjectResult: &file.CopyObjectResult{ETag: *resp.CopyObjectResult.ETag, LastModified: resp.CopyObjectResult.LastModified.Unix()}}, err + return &oss.CopyObjectOutput{CopyObjectResult: &oss.CopyObjectResult{ETag: *resp.CopyObjectResult.ETag, LastModified: resp.CopyObjectResult.LastModified.Unix()}}, err } -func (a *AwsOss) DeleteObjects(ctx context.Context, req *file.DeleteObjectsInput) (*file.DeleteObjectsOutput, error) { +func (a *AwsOss) DeleteObjects(ctx context.Context, req *oss.DeleteObjectsInput) (*oss.DeleteObjectsOutput, error) { client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -277,11 +288,11 @@ func (a *AwsOss) DeleteObjects(ctx context.Context, req *file.DeleteObjectsInput if err != nil { return nil, err } - output := &file.DeleteObjectsOutput{} + output := &oss.DeleteObjectsOutput{} copier.Copy(output, resp) return output, err } -func (a *AwsOss) ListObjects(ctx context.Context, req *file.ListObjectsInput) (*file.ListObjectsOutput, error) { +func (a *AwsOss) ListObjects(ctx context.Context, req *oss.ListObjectsInput) (*oss.ListObjectsOutput, error) { client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -304,7 +315,7 @@ func (a *AwsOss) ListObjects(ctx context.Context, req *file.ListObjectsInput) (* if err != nil { return nil, err } - output := &file.ListObjectsOutput{} + output := &oss.ListObjectsOutput{} err = copier.CopyWithOption(output, resp, copier.Option{ IgnoreEmpty: true, DeepCopy: true, @@ -328,10 +339,10 @@ func (a *AwsOss) ListObjects(ctx context.Context, req *file.ListObjectsInput) (* } return output, err } -func (a *AwsOss) GetObjectCannedAcl(ctx context.Context, req *file.GetObjectCannedAclInput) (*file.GetObjectCannedAclOutput, error) { +func (a *AwsOss) GetObjectCannedAcl(ctx context.Context, req *oss.GetObjectCannedAclInput) (*oss.GetObjectCannedAclOutput, error) { return nil, errors.New("GetObjectCannedAcl method not supported on AWS") } -func (a *AwsOss) PutObjectCannedAcl(ctx context.Context, req *file.PutObjectCannedAclInput) (*file.PutObjectCannedAclOutput, error) { +func (a *AwsOss) PutObjectCannedAcl(ctx context.Context, req *oss.PutObjectCannedAclInput) (*oss.PutObjectCannedAclOutput, error) { client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -345,9 +356,9 @@ func (a *AwsOss) PutObjectCannedAcl(ctx context.Context, req *file.PutObjectCann if err != nil { return nil, err } - return &file.PutObjectCannedAclOutput{RequestCharged: string(resp.RequestCharged)}, err + return &oss.PutObjectCannedAclOutput{RequestCharged: string(resp.RequestCharged)}, err } -func (a *AwsOss) RestoreObject(ctx context.Context, req *file.RestoreObjectInput) (*file.RestoreObjectOutput, error) { +func (a *AwsOss) RestoreObject(ctx context.Context, req *oss.RestoreObjectInput) (*oss.RestoreObjectOutput, error) { client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -360,9 +371,9 @@ func (a *AwsOss) RestoreObject(ctx context.Context, req *file.RestoreObjectInput if err != nil { return nil, err } - return &file.RestoreObjectOutput{RequestCharged: string(resp.RequestCharged), RestoreOutputPath: *resp.RestoreOutputPath}, err + return &oss.RestoreObjectOutput{RequestCharged: string(resp.RequestCharged), RestoreOutputPath: *resp.RestoreOutputPath}, err } -func (a *AwsOss) CreateMultipartUpload(ctx context.Context, req *file.CreateMultipartUploadInput) (*file.CreateMultipartUploadOutput, error) { +func (a *AwsOss) CreateMultipartUpload(ctx context.Context, req *oss.CreateMultipartUploadInput) (*oss.CreateMultipartUploadOutput, error) { client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -385,7 +396,7 @@ func (a *AwsOss) CreateMultipartUpload(ctx context.Context, req *file.CreateMult if err != nil { return nil, err } - output := &file.CreateMultipartUploadOutput{} + output := &oss.CreateMultipartUploadOutput{} copier.CopyWithOption( output, resp, @@ -397,7 +408,7 @@ func (a *AwsOss) CreateMultipartUpload(ctx context.Context, req *file.CreateMult ) return output, err } -func (a *AwsOss) UploadPart(ctx context.Context, req *file.UploadPartInput) (*file.UploadPartOutput, error) { +func (a *AwsOss) UploadPart(ctx context.Context, req *oss.UploadPartInput) (*oss.UploadPartOutput, error) { client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -418,14 +429,14 @@ func (a *AwsOss) UploadPart(ctx context.Context, req *file.UploadPartInput) (*fi if err != nil { return nil, err } - output := &file.UploadPartOutput{} + output := &oss.UploadPartOutput{} err = copier.Copy(output, resp) if err != nil { return nil, err } return output, err } -func (a *AwsOss) UploadPartCopy(ctx context.Context, req *file.UploadPartCopyInput) (*file.UploadPartCopyOutput, error) { +func (a *AwsOss) UploadPartCopy(ctx context.Context, req *oss.UploadPartCopyInput) (*oss.UploadPartCopyOutput, error) { client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -446,11 +457,11 @@ func (a *AwsOss) UploadPartCopy(ctx context.Context, req *file.UploadPartCopyInp if err != nil { return nil, err } - output := &file.UploadPartCopyOutput{} + output := &oss.UploadPartCopyOutput{} err = copier.Copy(output, resp) return output, err } -func (a *AwsOss) CompleteMultipartUpload(ctx context.Context, req *file.CompleteMultipartUploadInput) (*file.CompleteMultipartUploadOutput, error) { +func (a *AwsOss) CompleteMultipartUpload(ctx context.Context, req *oss.CompleteMultipartUploadInput) (*oss.CompleteMultipartUploadOutput, error) { client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -472,11 +483,11 @@ func (a *AwsOss) CompleteMultipartUpload(ctx context.Context, req *file.Complete if err != nil { return nil, err } - output := &file.CompleteMultipartUploadOutput{} + output := &oss.CompleteMultipartUploadOutput{} err = copier.Copy(output, resp) return output, err } -func (a *AwsOss) AbortMultipartUpload(ctx context.Context, req *file.AbortMultipartUploadInput) (*file.AbortMultipartUploadOutput, error) { +func (a *AwsOss) AbortMultipartUpload(ctx context.Context, req *oss.AbortMultipartUploadInput) (*oss.AbortMultipartUploadOutput, error) { client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -490,12 +501,12 @@ func (a *AwsOss) AbortMultipartUpload(ctx context.Context, req *file.AbortMultip if err != nil { return nil, err } - output := &file.AbortMultipartUploadOutput{ + output := &oss.AbortMultipartUploadOutput{ RequestCharged: string(resp.RequestCharged), } return output, err } -func (a *AwsOss) ListMultipartUploads(ctx context.Context, req *file.ListMultipartUploadsInput) (*file.ListMultipartUploadsOutput, error) { +func (a *AwsOss) ListMultipartUploads(ctx context.Context, req *oss.ListMultipartUploadsInput) (*oss.ListMultipartUploadsOutput, error) { client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -511,7 +522,7 @@ func (a *AwsOss) ListMultipartUploads(ctx context.Context, req *file.ListMultipa if err != nil { return nil, err } - output := &file.ListMultipartUploadsOutput{CommonPrefixes: []string{}, Uploads: []*file.MultipartUpload{}} + output := &oss.ListMultipartUploadsOutput{CommonPrefixes: []string{}, Uploads: []*oss.MultipartUpload{}} err = copier.Copy(output, resp) if err != nil { return nil, err @@ -520,11 +531,11 @@ func (a *AwsOss) ListMultipartUploads(ctx context.Context, req *file.ListMultipa output.CommonPrefixes = append(output.CommonPrefixes, *v.Prefix) } for _, v := range resp.Uploads { - upload := &file.MultipartUpload{ + upload := &oss.MultipartUpload{ //Initiated: timestamppb.New(*v.Initiated), - Initiator: &file.Initiator{DisplayName: *v.Initiator.DisplayName, ID: *v.Initiator.ID}, + Initiator: &oss.Initiator{DisplayName: *v.Initiator.DisplayName, ID: *v.Initiator.ID}, Key: *v.Key, - Owner: &file.Owner{ID: *v.Owner.ID, DisplayName: *v.Owner.DisplayName}, + Owner: &oss.Owner{ID: *v.Owner.ID, DisplayName: *v.Owner.DisplayName}, StorageClass: string(v.StorageClass), UploadId: *v.UploadId, } @@ -532,7 +543,7 @@ func (a *AwsOss) ListMultipartUploads(ctx context.Context, req *file.ListMultipa } return output, err } -func (a *AwsOss) ListObjectVersions(ctx context.Context, req *file.ListObjectVersionsInput) (*file.ListObjectVersionsOutput, error) { +func (a *AwsOss) ListObjectVersions(ctx context.Context, req *oss.ListObjectVersionsInput) (*oss.ListObjectVersionsOutput, error) { client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -546,7 +557,7 @@ func (a *AwsOss) ListObjectVersions(ctx context.Context, req *file.ListObjectVer if err != nil { return nil, err } - output := &file.ListObjectVersionsOutput{} + output := &oss.ListObjectVersionsOutput{} err = copier.Copy(output, resp) if err != nil { return nil, err @@ -555,22 +566,22 @@ func (a *AwsOss) ListObjectVersions(ctx context.Context, req *file.ListObjectVer output.CommonPrefixes = append(output.CommonPrefixes, *v.Prefix) } for _, v := range resp.DeleteMarkers { - entry := &file.DeleteMarkerEntry{ + entry := &oss.DeleteMarkerEntry{ IsLatest: v.IsLatest, Key: *v.Key, //LastModified: timestamppb.New(*v.LastModified), - Owner: &file.Owner{DisplayName: *v.Owner.DisplayName, ID: *v.Owner.ID}, + 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 := &file.ObjectVersion{ + version := &oss.ObjectVersion{ ETag: *v.ETag, IsLatest: v.IsLatest, Key: *v.Key, LastModified: v.LastModified.Unix(), - Owner: &file.Owner{DisplayName: *v.Owner.DisplayName, ID: *v.Owner.ID}, + Owner: &oss.Owner{DisplayName: *v.Owner.DisplayName, ID: *v.Owner.ID}, Size: v.Size, StorageClass: string(v.StorageClass), VersionId: *v.VersionId, @@ -580,7 +591,7 @@ func (a *AwsOss) ListObjectVersions(ctx context.Context, req *file.ListObjectVer return output, err } -func (a *AwsOss) HeadObject(ctx context.Context, req *file.HeadObjectInput) (*file.HeadObjectOutput, error) { +func (a *AwsOss) HeadObject(ctx context.Context, req *oss.HeadObjectInput) (*oss.HeadObjectOutput, error) { client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -594,10 +605,10 @@ func (a *AwsOss) HeadObject(ctx context.Context, req *file.HeadObjectInput) (*fi if err != nil { return nil, err } - return &file.HeadObjectOutput{ResultMetadata: resp.Metadata}, nil + return &oss.HeadObjectOutput{ResultMetadata: resp.Metadata}, nil } -func (a *AwsOss) IsObjectExist(ctx context.Context, req *file.IsObjectExistInput) (*file.IsObjectExistOutput, error) { +func (a *AwsOss) IsObjectExist(ctx context.Context, req *oss.IsObjectExistInput) (*oss.IsObjectExistOutput, error) { client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -607,14 +618,14 @@ func (a *AwsOss) IsObjectExist(ctx context.Context, req *file.IsObjectExistInput if err != nil { errorMsg := err.Error() if strings.Contains(errorMsg, "StatusCode: 404") { - return &file.IsObjectExistOutput{FileExist: false}, nil + return &oss.IsObjectExistOutput{FileExist: false}, nil } return nil, err } - return &file.IsObjectExistOutput{FileExist: true}, nil + return &oss.IsObjectExistOutput{FileExist: true}, nil } -func (a *AwsOss) SignURL(ctx context.Context, req *file.SignURLInput) (*file.SignURLOutput, error) { +func (a *AwsOss) SignURL(ctx context.Context, req *oss.SignURLInput) (*oss.SignURLOutput, error) { client, err := a.selectClient(req.Uid, req.Bucket) if err != nil { return nil, err @@ -627,30 +638,51 @@ func (a *AwsOss) SignURL(ctx context.Context, req *file.SignURLInput) (*file.Sig if err != nil { return nil, err } - return &file.SignURLOutput{SignedUrl: resp.URL}, nil + 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 &file.SignURLOutput{SignedUrl: resp.URL}, nil + return &oss.SignURLOutput{SignedUrl: resp.URL}, nil default: return nil, fmt.Errorf("not supported method %+v now", req.Method) } } -func (a *AwsOss) UpdateDownLoadBandwidthRateLimit(ctx context.Context, req *file.UpdateBandwidthRateLimitInput) error { +func (a *AwsOss) UpdateDownLoadBandwidthRateLimit(ctx context.Context, req *oss.UpdateBandwidthRateLimitInput) error { return errors.New("UpdateDownLoadBandwidthRateLimit method not supported now") } -func (a *AwsOss) UpdateUpLoadBandwidthRateLimit(ctx context.Context, req *file.UpdateBandwidthRateLimitInput) error { +func (a *AwsOss) UpdateUpLoadBandwidthRateLimit(ctx context.Context, req *oss.UpdateBandwidthRateLimitInput) error { return errors.New("UpdateUpLoadBandwidthRateLimit method not supported now") } -func (a *AwsOss) AppendObject(ctx context.Context, req *file.AppendObjectInput) (*file.AppendObjectOutput, error) { +func (a *AwsOss) AppendObject(ctx context.Context, req *oss.AppendObjectInput) (*oss.AppendObjectOutput, error) { return nil, errors.New("AppendObject method not supported on AWS") } -func (a *AwsOss) ListParts(ctx context.Context, req *file.ListPartsInput) (*file.ListPartsOutput, error) { +func (a *AwsOss) ListParts(ctx context.Context, req *oss.ListPartsInput) (*oss.ListPartsOutput, error) { return nil, errors.New("ListParts method not supported on AWS") } + +// selectClient choose aws client from exist client-map, key is endpoint, value is client instance. +func (a *AwsOss) selectClient(uid, bucket string) (*s3.Client, error) { + // 1. if user specify client uid, use specify client first + if uid != "" { + if client, ok := a.client[uid]; ok { + return client, nil + } + } + // 2. if user not specify client uid, use bucket to select client + if client, ok := a.client[bucket]; ok { + return client, nil + } + // 3.if not specify uid and bucket, select default one + if len(a.client) == 1 { + for _, client := range a.client { + return client, nil + } + } + return nil, utils.ErrNotSpecifyEndpoint +} diff --git a/components/file/aws/oss_test.go b/components/oss/aws/oss_test.go similarity index 56% rename from components/file/aws/oss_test.go rename to components/oss/aws/oss_test.go index 4815ac4d9d..bb952744ae 100644 --- a/components/file/aws/oss_test.go +++ b/components/oss/aws/oss_test.go @@ -21,10 +21,11 @@ import ( "errors" "testing" - "mosn.io/pkg/buffer" + "mosn.io/layotto/components/oss/factory" + + "mosn.io/layotto/components/oss" - "mosn.io/layotto/components/file" - "mosn.io/layotto/components/file/factory" + "mosn.io/pkg/buffer" "github.com/stretchr/testify/assert" ) @@ -60,17 +61,17 @@ func TestAwsDefaultInitFunc(t *testing.T) { NewAwsOss() f := factory.GetInitFunc(DefaultClientInitFunc) clients, err := f([]byte("hello"), map[string]string{}) - assert.Equal(t, err, file.ErrInvalid) + assert.Equal(t, err, oss.ErrInvalid) assert.Nil(t, clients) clients, err = f([]byte(confWithoutUidAndBucket), map[string]string{}) - assert.NotEqual(t, file.ErrInvalid, err) + assert.NotEqual(t, oss.ErrInvalid, err) assert.NotNil(t, clients) client, ok := clients[""] assert.Equal(t, true, ok) assert.NotNil(t, client) clients, err = f([]byte(confWithUid), map[string]string{}) - assert.NotEqual(t, file.ErrInvalid, err) + assert.NotEqual(t, oss.ErrInvalid, err) assert.NotNil(t, clients) client, ok = clients[""] assert.Equal(t, false, ok) @@ -80,7 +81,7 @@ func TestAwsDefaultInitFunc(t *testing.T) { assert.NotNil(t, client) clients, err = f([]byte(confWithUidAndBucket), map[string]string{}) - assert.NotEqual(t, file.ErrInvalid, err) + assert.NotEqual(t, oss.ErrInvalid, err) assert.NotNil(t, clients) client, ok = clients[""] assert.Equal(t, false, ok) @@ -101,88 +102,88 @@ func TestAwsDefaultInitFunc(t *testing.T) { func TestAwsOss(t *testing.T) { instance := NewAwsOss() - err := instance.InitConfig(context.TODO(), &file.FileConfig{Method: "", Metadata: []byte(confWithoutUidAndBucket)}) + err := instance.InitConfig(context.TODO(), &oss.OssConfig{Method: "", Metadata: []byte(confWithoutUidAndBucket)}) assert.Nil(t, err) - err = instance.InitClient(context.TODO(), &file.InitRequest{}) + err = instance.InitClient(context.TODO(), &oss.InitRequest{}) assert.Nil(t, err) - appendObjectResp, err := instance.AppendObject(context.TODO(), &file.AppendObjectInput{}) + 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(), &file.AbortMultipartUploadInput{}) + _, err = instance.AbortMultipartUpload(context.TODO(), &oss.AbortMultipartUploadInput{}) assert.NotNil(t, err) - _, err = instance.CompleteMultipartUpload(context.TODO(), &file.CompleteMultipartUploadInput{}) + _, err = instance.CompleteMultipartUpload(context.TODO(), &oss.CompleteMultipartUploadInput{}) assert.NotNil(t, err) - _, err = instance.CopyObject(context.TODO(), &file.CopyObjectInput{}) + _, err = instance.CopyObject(context.TODO(), &oss.CopyObjectInput{}) assert.Equal(t, errors.New("must specific copy_source"), err) - _, err = instance.CopyObject(context.TODO(), &file.CopyObjectInput{ - CopySource: &file.CopySource{CopySourceBucket: "bucket", CopySourceKey: "key"}, + _, 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(), &file.CreateMultipartUploadInput{}) + _, err = instance.CreateMultipartUpload(context.TODO(), &oss.CreateMultipartUploadInput{}) assert.NotNil(t, err) - _, err = instance.DeleteObject(context.TODO(), &file.DeleteObjectInput{}) + _, err = instance.DeleteObject(context.TODO(), &oss.DeleteObjectInput{}) assert.NotNil(t, err) - _, err = instance.DeleteObjects(context.TODO(), &file.DeleteObjectsInput{ - Delete: &file.Delete{}, + _, err = instance.DeleteObjects(context.TODO(), &oss.DeleteObjectsInput{ + Delete: &oss.Delete{}, }) assert.NotNil(t, err) - _, err = instance.DeleteObjectTagging(context.TODO(), &file.DeleteObjectTaggingInput{}) + _, err = instance.DeleteObjectTagging(context.TODO(), &oss.DeleteObjectTaggingInput{}) assert.NotNil(t, err) - _, err = instance.GetObject(context.TODO(), &file.GetObjectInput{}) + _, err = instance.GetObject(context.TODO(), &oss.GetObjectInput{}) assert.NotNil(t, err) - _, err = instance.GetObjectCannedAcl(context.TODO(), &file.GetObjectCannedAclInput{}) + _, err = instance.GetObjectCannedAcl(context.TODO(), &oss.GetObjectCannedAclInput{}) assert.NotNil(t, err) - _, err = instance.GetObjectTagging(context.TODO(), &file.GetObjectTaggingInput{}) + _, err = instance.GetObjectTagging(context.TODO(), &oss.GetObjectTaggingInput{}) assert.NotNil(t, err) - _, err = instance.HeadObject(context.TODO(), &file.HeadObjectInput{}) + _, err = instance.HeadObject(context.TODO(), &oss.HeadObjectInput{}) assert.NotNil(t, err) - _, err = instance.IsObjectExist(context.TODO(), &file.IsObjectExistInput{}) + _, err = instance.IsObjectExist(context.TODO(), &oss.IsObjectExistInput{}) assert.NotNil(t, err) - _, err = instance.ListParts(context.TODO(), &file.ListPartsInput{}) + _, err = instance.ListParts(context.TODO(), &oss.ListPartsInput{}) assert.NotNil(t, err) - _, err = instance.ListMultipartUploads(context.TODO(), &file.ListMultipartUploadsInput{}) + _, err = instance.ListMultipartUploads(context.TODO(), &oss.ListMultipartUploadsInput{}) assert.NotNil(t, err) - _, err = instance.ListObjects(context.TODO(), &file.ListObjectsInput{}) + _, err = instance.ListObjects(context.TODO(), &oss.ListObjectsInput{}) assert.NotNil(t, err) - _, err = instance.ListObjectVersions(context.TODO(), &file.ListObjectVersionsInput{}) + _, err = instance.ListObjectVersions(context.TODO(), &oss.ListObjectVersionsInput{}) assert.NotNil(t, err) stream := buffer.NewIoBufferString("hello") - _, err = instance.PutObject(context.TODO(), &file.PutObjectInput{DataStream: stream}) + _, err = instance.PutObject(context.TODO(), &oss.PutObjectInput{DataStream: stream}) assert.NotNil(t, err) - _, err = instance.PutObjectCannedAcl(context.TODO(), &file.PutObjectCannedAclInput{}) + _, err = instance.PutObjectCannedAcl(context.TODO(), &oss.PutObjectCannedAclInput{}) assert.NotNil(t, err) - _, err = instance.PutObjectTagging(context.TODO(), &file.PutObjectTaggingInput{}) + _, err = instance.PutObjectTagging(context.TODO(), &oss.PutObjectTaggingInput{}) assert.NotNil(t, err) - _, err = instance.RestoreObject(context.TODO(), &file.RestoreObjectInput{}) + _, err = instance.RestoreObject(context.TODO(), &oss.RestoreObjectInput{}) assert.NotNil(t, err) - _, err = instance.SignURL(context.TODO(), &file.SignURLInput{}) + _, err = instance.SignURL(context.TODO(), &oss.SignURLInput{}) assert.NotNil(t, err) - _, err = instance.UploadPartCopy(context.TODO(), &file.UploadPartCopyInput{ - CopySource: &file.CopySource{CopySourceBucket: "bucket", CopySourceKey: "key"}, + _, err = instance.UploadPartCopy(context.TODO(), &oss.UploadPartCopyInput{ + CopySource: &oss.CopySource{CopySourceBucket: "bucket", CopySourceKey: "key"}, }) assert.NotNil(t, err) - _, err = instance.UploadPart(context.TODO(), &file.UploadPartInput{}) + _, err = instance.UploadPart(context.TODO(), &oss.UploadPartInput{}) assert.NotNil(t, err) - err = instance.UpdateDownLoadBandwidthRateLimit(context.TODO(), &file.UpdateBandwidthRateLimitInput{}) + err = instance.UpdateDownLoadBandwidthRateLimit(context.TODO(), &oss.UpdateBandwidthRateLimitInput{}) assert.NotNil(t, err) - err = instance.UpdateUpLoadBandwidthRateLimit(context.TODO(), &file.UpdateBandwidthRateLimitInput{}) + err = instance.UpdateUpLoadBandwidthRateLimit(context.TODO(), &oss.UpdateBandwidthRateLimitInput{}) assert.NotNil(t, err) } diff --git a/components/file/factory/factory.go b/components/oss/factory/factory.go similarity index 100% rename from components/file/factory/factory.go rename to components/oss/factory/factory.go diff --git a/components/file/oss.go b/components/oss/oss.go similarity index 99% rename from components/file/oss.go rename to components/oss/oss.go index 2687535c23..3418fcf58a 100644 --- a/components/file/oss.go +++ b/components/oss/oss.go @@ -14,16 +14,15 @@ * limitations under the License. */ -package file +package oss import ( "context" - "errors" "io" ) -var ( - ErrNotSpecifyEndpoint = errors.New("should specific endpoint in metadata") +const ( + ServiceName = "oss" ) type Oss interface { diff --git a/components/oss/registry.go b/components/oss/registry.go new file mode 100644 index 0000000000..711319e4e8 --- /dev/null +++ b/components/oss/registry.go @@ -0,0 +1,68 @@ +/* + * 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 oss + +import ( + "fmt" + + "mosn.io/layotto/components/pkg/info" +) + +type OssRegistry interface { + Register(fs ...*OssFactory) + Create(name string) (Oss, error) +} + +type OssFactory struct { + Name string + FactoryMethod func() Oss +} + +func NewOssFactory(name string, f func() Oss) *OssFactory { + return &OssFactory{ + Name: name, + FactoryMethod: f, + } +} + +type OssStoreRegistry struct { + files map[string]func() Oss + info *info.RuntimeInfo +} + +func NewOssRegistry(info *info.RuntimeInfo) OssRegistry { + info.AddService(ServiceName) + return &OssStoreRegistry{ + files: make(map[string]func() Oss), + info: info, + } +} + +func (r *OssStoreRegistry) Register(fs ...*OssFactory) { + for _, f := range fs { + r.files[f.Name] = f.FactoryMethod + r.info.RegisterComponent(ServiceName, f.Name) + } +} + +func (r *OssStoreRegistry) Create(compType string) (Oss, error) { + if f, ok := r.files[compType]; ok { + r.info.LoadComponent(ServiceName, compType) + return f(), nil + } + return nil, fmt.Errorf("service component %s is not regsitered", compType) +} diff --git a/components/oss/types.go b/components/oss/types.go new file mode 100644 index 0000000000..4487e2df85 --- /dev/null +++ b/components/oss/types.go @@ -0,0 +1,32 @@ +/* + * 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 oss + +import ( + "encoding/json" + "errors" +) + +var ( + ErrInvalid = errors.New("invalid argument") +) + +// OssConfig wraps configuration for a oss implementation +type OssConfig struct { + Method string `json:"method"` + Metadata json.RawMessage `json:"metadata"` + Type string `json:"type"` +} diff --git a/components/pkg/utils/oss.go b/components/pkg/utils/oss.go new file mode 100644 index 0000000000..6a8263a6da --- /dev/null +++ b/components/pkg/utils/oss.go @@ -0,0 +1,32 @@ +// +// 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 utils + +import ( + "errors" +) + +var ( + ErrNotSpecifyEndpoint = errors.New("should specific endpoint in metadata") +) + +// OssMetadata wraps the configuration of oss implementation +type OssMetadata struct { + Buckets []string `json:"buckets"` // contained buckets in this oss client + Uid string `json:"uid"` // specify the uid of oss client + Endpoint string `json:"endpoint"` + AccessKeyID string `json:"accessKeyID"` + AccessKeySecret string `json:"accessKeySecret"` + Region string `json:"region"` +} diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go index 1077c2b4d9..a2fa99e2f5 100644 --- a/pkg/grpc/extension/s3/s3.go +++ b/pkg/grpc/extension/s3/s3.go @@ -22,13 +22,14 @@ import ( "io" "sync" + l8s3 "mosn.io/layotto/components/oss" + rawGRPC "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/emptypb" "mosn.io/pkg/log" - l8s3 "mosn.io/layotto/components/file" "mosn.io/layotto/pkg/grpc" s3 "mosn.io/layotto/spec/proto/extension/v1" ) diff --git a/pkg/grpc/extension/s3/s3_test.go b/pkg/grpc/extension/s3/s3_test.go index 5b5e5b90e6..cc9387e895 100644 --- a/pkg/grpc/extension/s3/s3_test.go +++ b/pkg/grpc/extension/s3/s3_test.go @@ -21,6 +21,8 @@ import ( "io" "testing" + l8s3 "mosn.io/layotto/components/oss" + mockoss "mosn.io/layotto/pkg/mock/components/oss" lgrpc "google.golang.org/grpc" @@ -34,9 +36,6 @@ import ( s3 "mosn.io/layotto/spec/proto/extension/v1" - "mosn.io/layotto/components/file" - l8s3 "mosn.io/layotto/components/file" - "github.com/golang/mock/gomock" "mosn.io/layotto/pkg/grpc" @@ -59,7 +58,7 @@ func (m *MockDataStream) Close() error { //TestInitClient func TestInitClient(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -89,7 +88,7 @@ func TestInitClient(t *testing.T) { // TestGetObject func TestGetObject(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -104,7 +103,7 @@ func TestGetObject(t *testing.T) { assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) iobuf := buffer.NewIoBufferBytes([]byte("hello")) dataStream := &MockDataStream{iobuf} - output := &file.GetObjectOutput{Etag: "tag"} + output := &l8s3.GetObjectOutput{Etag: "tag"} output.DataStream = dataStream mockServer.EXPECT().Context().Return(ctx) mockossServer.EXPECT().GetObject(ctx, &l8s3.GetObjectInput{Bucket: "layotto", Key: "object"}).Return(output, nil) @@ -117,7 +116,7 @@ func TestGetObject(t *testing.T) { // TestPutObject func TestPutObject(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -133,7 +132,7 @@ func TestPutObject(t *testing.T) { assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) putObjectReq.StoreName = MOCKSERVER - output := &file.PutObjectOutput{ETag: "tag"} + output := &l8s3.PutObjectOutput{ETag: "tag"} mockStream.EXPECT().Context().Return(ctx) mockStream.EXPECT().Recv().Return(putObjectReq, nil) mockStream.EXPECT().SendAndClose(&s3.PutObjectOutput{Etag: "tag"}).Times(1) @@ -152,7 +151,7 @@ func TestPutObject(t *testing.T) { // TestUploadPart func TestUploadPart(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -168,7 +167,7 @@ func TestUploadPart(t *testing.T) { assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) UploadPartReq.StoreName = MOCKSERVER - output := &file.UploadPartOutput{ETag: "tag"} + output := &l8s3.UploadPartOutput{ETag: "tag"} mockStream.EXPECT().Context().Return(ctx) mockStream.EXPECT().Recv().Return(UploadPartReq, nil) mockStream.EXPECT().SendAndClose(&s3.UploadPartOutput{Etag: "tag"}).Times(1) @@ -187,7 +186,7 @@ func TestUploadPart(t *testing.T) { // TestAppendObject func TestAppendObject(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -203,7 +202,7 @@ func TestAppendObject(t *testing.T) { assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) req.StoreName = MOCKSERVER - output := &file.AppendObjectOutput{AppendPosition: 123} + output := &l8s3.AppendObjectOutput{AppendPosition: 123} mockStream.EXPECT().Context().Return(ctx) mockStream.EXPECT().Recv().Return(req, nil) mockStream.EXPECT().SendAndClose(&s3.AppendObjectOutput{AppendPosition: 123}).Times(1) @@ -222,7 +221,7 @@ func TestAppendObject(t *testing.T) { // TestDeleteObject func TestDeleteObject(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -245,7 +244,7 @@ func TestDeleteObject(t *testing.T) { //TestPutObjectTagging func TestPutObjectTagging(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -266,7 +265,7 @@ func TestPutObjectTagging(t *testing.T) { //TestDeleteObjectTagging func TestDeleteObjectTagging(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -287,7 +286,7 @@ func TestDeleteObjectTagging(t *testing.T) { //TestGetObjectTagging func TestGetObjectTagging(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -310,7 +309,7 @@ func TestGetObjectTagging(t *testing.T) { //TestCopyObject func TestCopyObject(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -332,7 +331,7 @@ func TestCopyObject(t *testing.T) { //TestDeleteObjects func TestDeleteObjects(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -355,7 +354,7 @@ func TestDeleteObjects(t *testing.T) { //TestListObjects func TestListObjects(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -399,7 +398,7 @@ func TestListObjects(t *testing.T) { //TestGetObjectCannedAcl func TestGetObjectCannedAcl(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -433,7 +432,7 @@ func TestGetObjectCannedAcl(t *testing.T) { //TestPutObjectCannedAcl func TestPutObjectCannedAcl(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -466,7 +465,7 @@ func TestPutObjectCannedAcl(t *testing.T) { //TestRestoreObject func TestRestoreObject(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -500,7 +499,7 @@ func TestRestoreObject(t *testing.T) { //TestCreateMultipartUpload func TestCreateMultipartUpload(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -533,7 +532,7 @@ func TestCreateMultipartUpload(t *testing.T) { //TestUploadPartCopy func TestUploadPartCopy(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -566,7 +565,7 @@ func TestUploadPartCopy(t *testing.T) { //TestCompleteMultipartUpload func TestCompleteMultipartUpload(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -605,7 +604,7 @@ func TestCompleteMultipartUpload(t *testing.T) { //TestAbortMultipartUpload func TestAbortMultipartUpload(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -640,7 +639,7 @@ func TestAbortMultipartUpload(t *testing.T) { //TestListMultipartUploads func TestListMultipartUploads(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -671,7 +670,7 @@ func TestListMultipartUploads(t *testing.T) { //TestListObjectVersions func TestListObjectVersions(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -704,7 +703,7 @@ func TestListObjectVersions(t *testing.T) { //TestHeadObject func TestHeadObject(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -737,7 +736,7 @@ func TestHeadObject(t *testing.T) { //TestIsObjectExist func TestIsObjectExist(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -770,7 +769,7 @@ func TestIsObjectExist(t *testing.T) { //TestSignURL func TestSignURL(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -803,7 +802,7 @@ func TestSignURL(t *testing.T) { //TestUpdateDownLoadBandwidthRateLimit func TestUpdateDownLoadBandwidthRateLimit(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -830,7 +829,7 @@ func TestUpdateDownLoadBandwidthRateLimit(t *testing.T) { //TestUpdateUpLoadBandwidthRateLimit func TestUpdateUpLoadBandwidthRateLimit(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer @@ -857,7 +856,7 @@ func TestUpdateUpLoadBandwidthRateLimit(t *testing.T) { //TestListParts func TestListParts(t *testing.T) { // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]file.Oss{}} + ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} ctrl := gomock.NewController(t) mockossServer := mockoss.NewMockOss(ctrl) ac.Oss[MOCKSERVER] = mockossServer diff --git a/pkg/grpc/grpc_api.go b/pkg/grpc/grpc_api.go index d8e370e8c2..d2c2c98059 100644 --- a/pkg/grpc/grpc_api.go +++ b/pkg/grpc/grpc_api.go @@ -23,6 +23,8 @@ import ( "github.com/dapr/components-contrib/state" "google.golang.org/grpc" + "mosn.io/layotto/components/oss" + "mosn.io/layotto/components/configstores" "mosn.io/layotto/components/custom" "mosn.io/layotto/components/file" @@ -55,7 +57,7 @@ type ApplicationContext struct { PubSubs map[string]pubsub.PubSub StateStores map[string]state.Store Files map[string]file.File - Oss map[string]file.Oss + Oss map[string]oss.Oss LockStores map[string]lock.LockStore Sequencers map[string]sequencer.Store SendToOutputBindingFn func(name string, req *bindings.InvokeRequest) (*bindings.InvokeResponse, error) diff --git a/pkg/mock/components/oss/oss.go b/pkg/mock/components/oss/oss.go index 112212208b..2cf6d5012a 100644 --- a/pkg/mock/components/oss/oss.go +++ b/pkg/mock/components/oss/oss.go @@ -8,6 +8,8 @@ import ( context "context" reflect "reflect" + "mosn.io/layotto/components/oss" + gomock "github.com/golang/mock/gomock" file "mosn.io/layotto/components/file" @@ -37,10 +39,10 @@ func (m *MockOss) EXPECT() *MockOssMockRecorder { } // AbortMultipartUpload mocks base method. -func (m *MockOss) AbortMultipartUpload(arg0 context.Context, arg1 *file.AbortMultipartUploadInput) (*file.AbortMultipartUploadOutput, error) { +func (m *MockOss) AbortMultipartUpload(arg0 context.Context, arg1 *oss.AbortMultipartUploadInput) (*oss.AbortMultipartUploadOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AbortMultipartUpload", arg0, arg1) - ret0, _ := ret[0].(*file.AbortMultipartUploadOutput) + ret0, _ := ret[0].(*oss.AbortMultipartUploadOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -52,10 +54,10 @@ func (mr *MockOssMockRecorder) AbortMultipartUpload(arg0, arg1 interface{}) *gom } // AppendObject mocks base method. -func (m *MockOss) AppendObject(arg0 context.Context, arg1 *file.AppendObjectInput) (*file.AppendObjectOutput, error) { +func (m *MockOss) AppendObject(arg0 context.Context, arg1 *oss.AppendObjectInput) (*oss.AppendObjectOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AppendObject", arg0, arg1) - ret0, _ := ret[0].(*file.AppendObjectOutput) + ret0, _ := ret[0].(*oss.AppendObjectOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -67,10 +69,10 @@ func (mr *MockOssMockRecorder) AppendObject(arg0, arg1 interface{}) *gomock.Call } // CompleteMultipartUpload mocks base method. -func (m *MockOss) CompleteMultipartUpload(arg0 context.Context, arg1 *file.CompleteMultipartUploadInput) (*file.CompleteMultipartUploadOutput, error) { +func (m *MockOss) CompleteMultipartUpload(arg0 context.Context, arg1 *oss.CompleteMultipartUploadInput) (*oss.CompleteMultipartUploadOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CompleteMultipartUpload", arg0, arg1) - ret0, _ := ret[0].(*file.CompleteMultipartUploadOutput) + ret0, _ := ret[0].(*oss.CompleteMultipartUploadOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -82,10 +84,10 @@ func (mr *MockOssMockRecorder) CompleteMultipartUpload(arg0, arg1 interface{}) * } // CopyObject mocks base method. -func (m *MockOss) CopyObject(arg0 context.Context, arg1 *file.CopyObjectInput) (*file.CopyObjectOutput, error) { +func (m *MockOss) CopyObject(arg0 context.Context, arg1 *oss.CopyObjectInput) (*oss.CopyObjectOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CopyObject", arg0, arg1) - ret0, _ := ret[0].(*file.CopyObjectOutput) + ret0, _ := ret[0].(*oss.CopyObjectOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -97,10 +99,10 @@ func (mr *MockOssMockRecorder) CopyObject(arg0, arg1 interface{}) *gomock.Call { } // CreateMultipartUpload mocks base method. -func (m *MockOss) CreateMultipartUpload(arg0 context.Context, arg1 *file.CreateMultipartUploadInput) (*file.CreateMultipartUploadOutput, error) { +func (m *MockOss) CreateMultipartUpload(arg0 context.Context, arg1 *oss.CreateMultipartUploadInput) (*oss.CreateMultipartUploadOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CreateMultipartUpload", arg0, arg1) - ret0, _ := ret[0].(*file.CreateMultipartUploadOutput) + ret0, _ := ret[0].(*oss.CreateMultipartUploadOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -112,10 +114,10 @@ func (mr *MockOssMockRecorder) CreateMultipartUpload(arg0, arg1 interface{}) *go } // DeleteObject mocks base method. -func (m *MockOss) DeleteObject(arg0 context.Context, arg1 *file.DeleteObjectInput) (*file.DeleteObjectOutput, error) { +func (m *MockOss) DeleteObject(arg0 context.Context, arg1 *oss.DeleteObjectInput) (*oss.DeleteObjectOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteObject", arg0, arg1) - ret0, _ := ret[0].(*file.DeleteObjectOutput) + ret0, _ := ret[0].(*oss.DeleteObjectOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -127,10 +129,10 @@ func (mr *MockOssMockRecorder) DeleteObject(arg0, arg1 interface{}) *gomock.Call } // DeleteObjectTagging mocks base method. -func (m *MockOss) DeleteObjectTagging(arg0 context.Context, arg1 *file.DeleteObjectTaggingInput) (*file.DeleteObjectTaggingOutput, error) { +func (m *MockOss) DeleteObjectTagging(arg0 context.Context, arg1 *oss.DeleteObjectTaggingInput) (*oss.DeleteObjectTaggingOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteObjectTagging", arg0, arg1) - ret0, _ := ret[0].(*file.DeleteObjectTaggingOutput) + ret0, _ := ret[0].(*oss.DeleteObjectTaggingOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -142,10 +144,10 @@ func (mr *MockOssMockRecorder) DeleteObjectTagging(arg0, arg1 interface{}) *gomo } // DeleteObjects mocks base method. -func (m *MockOss) DeleteObjects(arg0 context.Context, arg1 *file.DeleteObjectsInput) (*file.DeleteObjectsOutput, error) { +func (m *MockOss) DeleteObjects(arg0 context.Context, arg1 *oss.DeleteObjectsInput) (*oss.DeleteObjectsOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteObjects", arg0, arg1) - ret0, _ := ret[0].(*file.DeleteObjectsOutput) + ret0, _ := ret[0].(*oss.DeleteObjectsOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -157,10 +159,10 @@ func (mr *MockOssMockRecorder) DeleteObjects(arg0, arg1 interface{}) *gomock.Cal } // GetObject mocks base method. -func (m *MockOss) GetObject(arg0 context.Context, arg1 *file.GetObjectInput) (*file.GetObjectOutput, error) { +func (m *MockOss) GetObject(arg0 context.Context, arg1 *oss.GetObjectInput) (*oss.GetObjectOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetObject", arg0, arg1) - ret0, _ := ret[0].(*file.GetObjectOutput) + ret0, _ := ret[0].(*oss.GetObjectOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -172,10 +174,10 @@ func (mr *MockOssMockRecorder) GetObject(arg0, arg1 interface{}) *gomock.Call { } // GetObjectCannedAcl mocks base method. -func (m *MockOss) GetObjectCannedAcl(arg0 context.Context, arg1 *file.GetObjectCannedAclInput) (*file.GetObjectCannedAclOutput, error) { +func (m *MockOss) GetObjectCannedAcl(arg0 context.Context, arg1 *oss.GetObjectCannedAclInput) (*oss.GetObjectCannedAclOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetObjectCannedAcl", arg0, arg1) - ret0, _ := ret[0].(*file.GetObjectCannedAclOutput) + ret0, _ := ret[0].(*oss.GetObjectCannedAclOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -187,10 +189,10 @@ func (mr *MockOssMockRecorder) GetObjectCannedAcl(arg0, arg1 interface{}) *gomoc } // GetObjectTagging mocks base method. -func (m *MockOss) GetObjectTagging(arg0 context.Context, arg1 *file.GetObjectTaggingInput) (*file.GetObjectTaggingOutput, error) { +func (m *MockOss) GetObjectTagging(arg0 context.Context, arg1 *oss.GetObjectTaggingInput) (*oss.GetObjectTaggingOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetObjectTagging", arg0, arg1) - ret0, _ := ret[0].(*file.GetObjectTaggingOutput) + ret0, _ := ret[0].(*oss.GetObjectTaggingOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -202,10 +204,10 @@ func (mr *MockOssMockRecorder) GetObjectTagging(arg0, arg1 interface{}) *gomock. } // HeadObject mocks base method. -func (m *MockOss) HeadObject(arg0 context.Context, arg1 *file.HeadObjectInput) (*file.HeadObjectOutput, error) { +func (m *MockOss) HeadObject(arg0 context.Context, arg1 *oss.HeadObjectInput) (*oss.HeadObjectOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "HeadObject", arg0, arg1) - ret0, _ := ret[0].(*file.HeadObjectOutput) + ret0, _ := ret[0].(*oss.HeadObjectOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -217,7 +219,7 @@ func (mr *MockOssMockRecorder) HeadObject(arg0, arg1 interface{}) *gomock.Call { } // InitClient mocks base method. -func (m *MockOss) InitClient(arg0 context.Context, arg1 *file.InitRequest) error { +func (m *MockOss) InitClient(arg0 context.Context, arg1 *oss.InitRequest) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "InitClient", arg0, arg1) ret0, _ := ret[0].(error) @@ -245,10 +247,10 @@ func (mr *MockOssMockRecorder) InitConfig(arg0, arg1 interface{}) *gomock.Call { } // IsObjectExist mocks base method. -func (m *MockOss) IsObjectExist(arg0 context.Context, arg1 *file.IsObjectExistInput) (*file.IsObjectExistOutput, error) { +func (m *MockOss) IsObjectExist(arg0 context.Context, arg1 *oss.IsObjectExistInput) (*oss.IsObjectExistOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "IsObjectExist", arg0, arg1) - ret0, _ := ret[0].(*file.IsObjectExistOutput) + ret0, _ := ret[0].(*oss.IsObjectExistOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -260,10 +262,10 @@ func (mr *MockOssMockRecorder) IsObjectExist(arg0, arg1 interface{}) *gomock.Cal } // ListMultipartUploads mocks base method. -func (m *MockOss) ListMultipartUploads(arg0 context.Context, arg1 *file.ListMultipartUploadsInput) (*file.ListMultipartUploadsOutput, error) { +func (m *MockOss) ListMultipartUploads(arg0 context.Context, arg1 *oss.ListMultipartUploadsInput) (*oss.ListMultipartUploadsOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListMultipartUploads", arg0, arg1) - ret0, _ := ret[0].(*file.ListMultipartUploadsOutput) + ret0, _ := ret[0].(*oss.ListMultipartUploadsOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -275,10 +277,10 @@ func (mr *MockOssMockRecorder) ListMultipartUploads(arg0, arg1 interface{}) *gom } // ListObjectVersions mocks base method. -func (m *MockOss) ListObjectVersions(arg0 context.Context, arg1 *file.ListObjectVersionsInput) (*file.ListObjectVersionsOutput, error) { +func (m *MockOss) ListObjectVersions(arg0 context.Context, arg1 *oss.ListObjectVersionsInput) (*oss.ListObjectVersionsOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListObjectVersions", arg0, arg1) - ret0, _ := ret[0].(*file.ListObjectVersionsOutput) + ret0, _ := ret[0].(*oss.ListObjectVersionsOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -290,10 +292,10 @@ func (mr *MockOssMockRecorder) ListObjectVersions(arg0, arg1 interface{}) *gomoc } // ListObjects mocks base method. -func (m *MockOss) ListObjects(arg0 context.Context, arg1 *file.ListObjectsInput) (*file.ListObjectsOutput, error) { +func (m *MockOss) ListObjects(arg0 context.Context, arg1 *oss.ListObjectsInput) (*oss.ListObjectsOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListObjects", arg0, arg1) - ret0, _ := ret[0].(*file.ListObjectsOutput) + ret0, _ := ret[0].(*oss.ListObjectsOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -305,10 +307,10 @@ func (mr *MockOssMockRecorder) ListObjects(arg0, arg1 interface{}) *gomock.Call } // ListParts mocks base method. -func (m *MockOss) ListParts(arg0 context.Context, arg1 *file.ListPartsInput) (*file.ListPartsOutput, error) { +func (m *MockOss) ListParts(arg0 context.Context, arg1 *oss.ListPartsInput) (*oss.ListPartsOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListParts", arg0, arg1) - ret0, _ := ret[0].(*file.ListPartsOutput) + ret0, _ := ret[0].(*oss.ListPartsOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -320,10 +322,10 @@ func (mr *MockOssMockRecorder) ListParts(arg0, arg1 interface{}) *gomock.Call { } // PutObject mocks base method. -func (m *MockOss) PutObject(arg0 context.Context, arg1 *file.PutObjectInput) (*file.PutObjectOutput, error) { +func (m *MockOss) PutObject(arg0 context.Context, arg1 *oss.PutObjectInput) (*oss.PutObjectOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutObject", arg0, arg1) - ret0, _ := ret[0].(*file.PutObjectOutput) + ret0, _ := ret[0].(*oss.PutObjectOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -335,10 +337,10 @@ func (mr *MockOssMockRecorder) PutObject(arg0, arg1 interface{}) *gomock.Call { } // PutObjectCannedAcl mocks base method. -func (m *MockOss) PutObjectCannedAcl(arg0 context.Context, arg1 *file.PutObjectCannedAclInput) (*file.PutObjectCannedAclOutput, error) { +func (m *MockOss) PutObjectCannedAcl(arg0 context.Context, arg1 *oss.PutObjectCannedAclInput) (*oss.PutObjectCannedAclOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutObjectCannedAcl", arg0, arg1) - ret0, _ := ret[0].(*file.PutObjectCannedAclOutput) + ret0, _ := ret[0].(*oss.PutObjectCannedAclOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -350,10 +352,10 @@ func (mr *MockOssMockRecorder) PutObjectCannedAcl(arg0, arg1 interface{}) *gomoc } // PutObjectTagging mocks base method. -func (m *MockOss) PutObjectTagging(arg0 context.Context, arg1 *file.PutObjectTaggingInput) (*file.PutObjectTaggingOutput, error) { +func (m *MockOss) PutObjectTagging(arg0 context.Context, arg1 *oss.PutObjectTaggingInput) (*oss.PutObjectTaggingOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutObjectTagging", arg0, arg1) - ret0, _ := ret[0].(*file.PutObjectTaggingOutput) + ret0, _ := ret[0].(*oss.PutObjectTaggingOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -365,10 +367,10 @@ func (mr *MockOssMockRecorder) PutObjectTagging(arg0, arg1 interface{}) *gomock. } // RestoreObject mocks base method. -func (m *MockOss) RestoreObject(arg0 context.Context, arg1 *file.RestoreObjectInput) (*file.RestoreObjectOutput, error) { +func (m *MockOss) RestoreObject(arg0 context.Context, arg1 *oss.RestoreObjectInput) (*oss.RestoreObjectOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "RestoreObject", arg0, arg1) - ret0, _ := ret[0].(*file.RestoreObjectOutput) + ret0, _ := ret[0].(*oss.RestoreObjectOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -380,10 +382,10 @@ func (mr *MockOssMockRecorder) RestoreObject(arg0, arg1 interface{}) *gomock.Cal } // SignURL mocks base method. -func (m *MockOss) SignURL(arg0 context.Context, arg1 *file.SignURLInput) (*file.SignURLOutput, error) { +func (m *MockOss) SignURL(arg0 context.Context, arg1 *oss.SignURLInput) (*oss.SignURLOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SignURL", arg0, arg1) - ret0, _ := ret[0].(*file.SignURLOutput) + ret0, _ := ret[0].(*oss.SignURLOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -395,7 +397,7 @@ func (mr *MockOssMockRecorder) SignURL(arg0, arg1 interface{}) *gomock.Call { } // UpdateDownLoadBandwidthRateLimit mocks base method. -func (m *MockOss) UpdateDownLoadBandwidthRateLimit(arg0 context.Context, arg1 *file.UpdateBandwidthRateLimitInput) error { +func (m *MockOss) UpdateDownLoadBandwidthRateLimit(arg0 context.Context, arg1 *oss.UpdateBandwidthRateLimitInput) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "UpdateDownLoadBandwidthRateLimit", arg0, arg1) ret0, _ := ret[0].(error) @@ -409,7 +411,7 @@ func (mr *MockOssMockRecorder) UpdateDownLoadBandwidthRateLimit(arg0, arg1 inter } // UpdateUpLoadBandwidthRateLimit mocks base method. -func (m *MockOss) UpdateUpLoadBandwidthRateLimit(arg0 context.Context, arg1 *file.UpdateBandwidthRateLimitInput) error { +func (m *MockOss) UpdateUpLoadBandwidthRateLimit(arg0 context.Context, arg1 *oss.UpdateBandwidthRateLimitInput) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "UpdateUpLoadBandwidthRateLimit", arg0, arg1) ret0, _ := ret[0].(error) @@ -423,10 +425,10 @@ func (mr *MockOssMockRecorder) UpdateUpLoadBandwidthRateLimit(arg0, arg1 interfa } // UploadPart mocks base method. -func (m *MockOss) UploadPart(arg0 context.Context, arg1 *file.UploadPartInput) (*file.UploadPartOutput, error) { +func (m *MockOss) UploadPart(arg0 context.Context, arg1 *oss.UploadPartInput) (*oss.UploadPartOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "UploadPart", arg0, arg1) - ret0, _ := ret[0].(*file.UploadPartOutput) + ret0, _ := ret[0].(*oss.UploadPartOutput) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -438,10 +440,10 @@ func (mr *MockOssMockRecorder) UploadPart(arg0, arg1 interface{}) *gomock.Call { } // UploadPartCopy mocks base method. -func (m *MockOss) UploadPartCopy(arg0 context.Context, arg1 *file.UploadPartCopyInput) (*file.UploadPartCopyOutput, error) { +func (m *MockOss) UploadPartCopy(arg0 context.Context, arg1 *oss.UploadPartCopyInput) (*oss.UploadPartCopyOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "UploadPartCopy", arg0, arg1) - ret0, _ := ret[0].(*file.UploadPartCopyOutput) + ret0, _ := ret[0].(*oss.UploadPartCopyOutput) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/pkg/runtime/config.go b/pkg/runtime/config.go index 4baf765227..03d0c5d047 100644 --- a/pkg/runtime/config.go +++ b/pkg/runtime/config.go @@ -19,6 +19,8 @@ package runtime import ( "encoding/json" + "mosn.io/layotto/components/oss" + "mosn.io/layotto/pkg/runtime/secretstores" "mosn.io/layotto/components/custom" @@ -50,7 +52,7 @@ type MosnRuntimeConfig struct { PubSubManagement map[string]pubsub.Config `json:"pub_subs"` StateManagement map[string]state.Config `json:"state"` Files map[string]file.FileConfig `json:"file"` - Oss map[string]file.OssConfig `json:"oss"` + Oss map[string]oss.OssConfig `json:"oss"` LockManagement map[string]lock.Config `json:"lock"` SequencerManagement map[string]sequencer.Config `json:"sequencer"` Bindings map[string]bindings.Metadata `json:"bindings"` diff --git a/pkg/runtime/options.go b/pkg/runtime/options.go index 9ea647377c..bdd6c2dd8c 100644 --- a/pkg/runtime/options.go +++ b/pkg/runtime/options.go @@ -20,6 +20,8 @@ import ( "google.golang.org/grpc" "mosn.io/pkg/log" + "mosn.io/layotto/components/oss" + "mosn.io/layotto/components/configstores" "mosn.io/layotto/components/custom" "mosn.io/layotto/components/file" @@ -40,7 +42,7 @@ type services struct { configStores []*configstores.StoreFactory rpcs []*rpc.Factory files []*file.FileFactory - oss []*file.OssFactory + oss []*oss.OssFactory pubSubs []*pubsub.Factory states []*state.Factory locks []*runtime_lock.Factory @@ -130,7 +132,7 @@ func WithRpcFactory(rpcs ...*rpc.Factory) Option { } } -func WithOssFactory(oss ...*file.OssFactory) Option { +func WithOssFactory(oss ...*oss.OssFactory) Option { return func(o *runtimeOptions) { o.services.oss = append(o.services.oss, oss...) } diff --git a/pkg/runtime/runtime.go b/pkg/runtime/runtime.go index 3c989b9ed9..9ee2215b72 100644 --- a/pkg/runtime/runtime.go +++ b/pkg/runtime/runtime.go @@ -23,6 +23,8 @@ import ( "strings" "time" + "mosn.io/layotto/components/oss" + "mosn.io/layotto/pkg/runtime/ref" "github.com/dapr/components-contrib/secretstores" @@ -69,7 +71,7 @@ type MosnRuntime struct { lockRegistry runtime_lock.Registry sequencerRegistry runtime_sequencer.Registry fileRegistry file.Registry - ossRegistry file.OssRegistry + ossRegistry oss.OssRegistry bindingsRegistry mbindings.Registry secretStoresRegistry msecretstores.Registry customComponentRegistry custom.Registry @@ -83,7 +85,7 @@ type MosnRuntime struct { // state implementations store here are already initialized states map[string]state.Store files map[string]file.File - oss map[string]file.Oss + oss map[string]oss.Oss locks map[string]lock.LockStore sequencers map[string]sequencer.Store outputBindings map[string]bindings.OutputBinding @@ -115,7 +117,7 @@ func NewMosnRuntime(runtimeConfig *MosnRuntimeConfig) *MosnRuntime { stateRegistry: runtime_state.NewRegistry(info), bindingsRegistry: mbindings.NewRegistry(info), fileRegistry: file.NewRegistry(info), - ossRegistry: file.NewOssRegistry(info), + ossRegistry: oss.NewOssRegistry(info), lockRegistry: runtime_lock.NewRegistry(info), sequencerRegistry: runtime_sequencer.NewRegistry(info), secretStoresRegistry: msecretstores.NewRegistry(info), @@ -126,7 +128,7 @@ func NewMosnRuntime(runtimeConfig *MosnRuntimeConfig) *MosnRuntime { pubSubs: make(map[string]pubsub.PubSub), states: make(map[string]state.Store), files: make(map[string]file.File), - oss: make(map[string]file.Oss), + oss: make(map[string]oss.Oss), locks: make(map[string]lock.LockStore), sequencers: make(map[string]sequencer.Store), outputBindings: make(map[string]bindings.OutputBinding), @@ -409,7 +411,7 @@ func (m *MosnRuntime) initStates(factorys ...*runtime_state.Factory) error { return nil } -func (m *MosnRuntime) initOss(oss ...*file.OssFactory) error { +func (m *MosnRuntime) initOss(oss ...*oss.OssFactory) error { log.DefaultLogger.Infof("[runtime] init file service") // register all oss store services implementation From 34de1d45068f53b0c36f1624f771a17181913629 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 13 Jul 2022 19:02:21 +0800 Subject: [PATCH 082/126] fix lint error --- components/file/aliyun/file.go | 4 +--- components/file/aws/file.go | 6 ++---- components/oss/aliyun/oss.go | 10 +++++----- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/components/file/aliyun/file.go b/components/file/aliyun/file.go index 26aadeb74f..33ad3e7a41 100644 --- a/components/file/aliyun/file.go +++ b/components/file/aliyun/file.go @@ -37,9 +37,7 @@ const ( // AliyunFile is a binding for an AliCloud OSS storage bucketKey type AliyunFile struct { - client map[string]*oss.Client - method string - rawData json.RawMessage + client map[string]*oss.Client } func NewAliyunFile() file.File { diff --git a/components/file/aws/file.go b/components/file/aws/file.go index 682dd62e36..4cf0e4e4c6 100644 --- a/components/file/aws/file.go +++ b/components/file/aws/file.go @@ -42,10 +42,8 @@ const ( // AwsOss is a binding for aws oss storage. type AwsOss struct { - client map[string]*s3.Client - meta map[string]*utils.OssMetadata - method string - rawData json.RawMessage + client map[string]*s3.Client + meta map[string]*utils.OssMetadata } func NewAwsFile() file.File { diff --git a/components/oss/aliyun/oss.go b/components/oss/aliyun/oss.go index a4678e7da4..641535046e 100644 --- a/components/oss/aliyun/oss.go +++ b/components/oss/aliyun/oss.go @@ -654,20 +654,20 @@ func (a *AliyunOSS) ListParts(ctx context.Context, req *l8oss.ListPartsInput) (* return out, err } -func (s *AliyunOSS) selectClient(uid, bucket string) (*oss.Client, error) { +func (a *AliyunOSS) selectClient(uid, bucket string) (*oss.Client, error) { // 1. if user specify client uid, use specify client first if uid != "" { - if client, ok := s.client[uid]; ok { + if client, ok := a.client[uid]; ok { return client, nil } } // 2. if user not specify client uid, use bucket to select client - if client, ok := s.client[bucket]; ok { + if client, ok := a.client[bucket]; ok { return client, nil } // 3. if not specify uid and bucket, select default one - if len(s.client) == 1 { - for _, client := range s.client { + if len(a.client) == 1 { + for _, client := range a.client { return client, nil } } From 01c249b3045136265addc363bf570e5e5942dc9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 13 Jul 2022 19:39:59 +0800 Subject: [PATCH 083/126] fix ut error --- pkg/mock/components/oss/oss.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pkg/mock/components/oss/oss.go b/pkg/mock/components/oss/oss.go index 2cf6d5012a..5134597857 100644 --- a/pkg/mock/components/oss/oss.go +++ b/pkg/mock/components/oss/oss.go @@ -11,8 +11,6 @@ import ( "mosn.io/layotto/components/oss" gomock "github.com/golang/mock/gomock" - - file "mosn.io/layotto/components/file" ) // MockOss is a mock of Oss interface. @@ -233,7 +231,7 @@ func (mr *MockOssMockRecorder) InitClient(arg0, arg1 interface{}) *gomock.Call { } // InitConfig mocks base method. -func (m *MockOss) InitConfig(arg0 context.Context, arg1 *file.OssConfig) error { +func (m *MockOss) InitConfig(arg0 context.Context, arg1 *oss.OssConfig) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "InitConfig", arg0, arg1) ret0, _ := ret[0].(error) From 566d19351fe1994bf09e423ecc12de30c4d69959 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 13 Jul 2022 19:55:22 +0800 Subject: [PATCH 084/126] change UpdateDownLoadBandwidthRateLimit and UpdateUpLoadBandwidthRateLimit to UpdateDownloadBandwidthRateLimit and UpdateUploadBandwidthRateLimit --- components/oss/aliyun/oss.go | 8 ++--- components/oss/aliyun/oss_test.go | 4 +-- components/oss/aws/oss.go | 8 ++--- components/oss/aws/oss_test.go | 4 +-- components/oss/oss.go | 4 +-- docs/zh/design/oss/oss-api-design.md | Bin 14666 -> 14666 bytes pkg/grpc/extension/s3/s3.go | 12 +++---- pkg/grpc/extension/s3/s3_test.go | 12 +++---- pkg/mock/components/oss/oss.go | 24 ++++++------- pkg/mock/runtime/oss/oss.go | 48 ++++++++++++------------- spec/proto/extension/v1/oss.pb.go | 12 +++---- spec/proto/extension/v1/oss.proto | 4 +-- spec/proto/extension/v1/oss_grpc.pb.go | 48 ++++++++++++------------- 13 files changed, 94 insertions(+), 94 deletions(-) diff --git a/components/oss/aliyun/oss.go b/components/oss/aliyun/oss.go index 641535046e..7622b284af 100644 --- a/components/oss/aliyun/oss.go +++ b/components/oss/aliyun/oss.go @@ -581,8 +581,8 @@ func (a *AliyunOSS) SignURL(ctx context.Context, req *l8oss.SignURLInput) (*l8os return &l8oss.SignURLOutput{SignedUrl: resp}, err } -//UpdateDownLoadBandwidthRateLimit update all client rate -func (a *AliyunOSS) UpdateDownLoadBandwidthRateLimit(ctx context.Context, req *l8oss.UpdateBandwidthRateLimitInput) error { +//UpdateDownloadBandwidthRateLimit update all client rate +func (a *AliyunOSS) UpdateDownloadBandwidthRateLimit(ctx context.Context, req *l8oss.UpdateBandwidthRateLimitInput) error { for _, cli := range a.client { err := cli.LimitDownloadSpeed(int(req.AverageRateLimitInBitsPerSec)) return err @@ -590,8 +590,8 @@ func (a *AliyunOSS) UpdateDownLoadBandwidthRateLimit(ctx context.Context, req *l return nil } -//UpdateUpLoadBandwidthRateLimit update all client rate -func (a *AliyunOSS) UpdateUpLoadBandwidthRateLimit(ctx context.Context, req *l8oss.UpdateBandwidthRateLimitInput) error { +//UpdateUploadBandwidthRateLimit update all client rate +func (a *AliyunOSS) UpdateUploadBandwidthRateLimit(ctx context.Context, req *l8oss.UpdateBandwidthRateLimitInput) error { for _, cli := range a.client { err := cli.LimitUploadSpeed(int(req.AverageRateLimitInBitsPerSec)) return err diff --git a/components/oss/aliyun/oss_test.go b/components/oss/aliyun/oss_test.go index c43993e412..ee5125d034 100644 --- a/components/oss/aliyun/oss_test.go +++ b/components/oss/aliyun/oss_test.go @@ -189,10 +189,10 @@ func TestAliyunOss(t *testing.T) { _, err = instance.UploadPart(context.TODO(), &oss.UploadPartInput{}) assert.NotNil(t, err) - err = instance.UpdateDownLoadBandwidthRateLimit(context.TODO(), &oss.UpdateBandwidthRateLimitInput{}) + err = instance.UpdateDownloadBandwidthRateLimit(context.TODO(), &oss.UpdateBandwidthRateLimitInput{}) assert.Nil(t, err) - err = instance.UpdateUpLoadBandwidthRateLimit(context.TODO(), &oss.UpdateBandwidthRateLimitInput{}) + err = instance.UpdateUploadBandwidthRateLimit(context.TODO(), &oss.UpdateBandwidthRateLimitInput{}) assert.Nil(t, err) } diff --git a/components/oss/aws/oss.go b/components/oss/aws/oss.go index b1c9af8285..3743758e99 100644 --- a/components/oss/aws/oss.go +++ b/components/oss/aws/oss.go @@ -651,12 +651,12 @@ func (a *AwsOss) SignURL(ctx context.Context, req *oss.SignURLInput) (*oss.SignU } } -func (a *AwsOss) UpdateDownLoadBandwidthRateLimit(ctx context.Context, req *oss.UpdateBandwidthRateLimitInput) error { - return errors.New("UpdateDownLoadBandwidthRateLimit method not supported now") +func (a *AwsOss) UpdateDownloadBandwidthRateLimit(ctx context.Context, req *oss.UpdateBandwidthRateLimitInput) error { + return errors.New("UpdateDownloadBandwidthRateLimit method not supported now") } -func (a *AwsOss) UpdateUpLoadBandwidthRateLimit(ctx context.Context, req *oss.UpdateBandwidthRateLimitInput) error { - return errors.New("UpdateUpLoadBandwidthRateLimit method not supported now") +func (a *AwsOss) UpdateUploadBandwidthRateLimit(ctx context.Context, req *oss.UpdateBandwidthRateLimitInput) error { + return errors.New("UpdateUploadBandwidthRateLimit method not supported now") } func (a *AwsOss) AppendObject(ctx context.Context, req *oss.AppendObjectInput) (*oss.AppendObjectOutput, error) { return nil, errors.New("AppendObject method not supported on AWS") diff --git a/components/oss/aws/oss_test.go b/components/oss/aws/oss_test.go index bb952744ae..a4256b98dd 100644 --- a/components/oss/aws/oss_test.go +++ b/components/oss/aws/oss_test.go @@ -181,9 +181,9 @@ func TestAwsOss(t *testing.T) { _, err = instance.UploadPart(context.TODO(), &oss.UploadPartInput{}) assert.NotNil(t, err) - err = instance.UpdateDownLoadBandwidthRateLimit(context.TODO(), &oss.UpdateBandwidthRateLimitInput{}) + err = instance.UpdateDownloadBandwidthRateLimit(context.TODO(), &oss.UpdateBandwidthRateLimitInput{}) assert.NotNil(t, err) - err = instance.UpdateUpLoadBandwidthRateLimit(context.TODO(), &oss.UpdateBandwidthRateLimitInput{}) + err = instance.UpdateUploadBandwidthRateLimit(context.TODO(), &oss.UpdateBandwidthRateLimitInput{}) assert.NotNil(t, err) } diff --git a/components/oss/oss.go b/components/oss/oss.go index 3418fcf58a..d95f76e87e 100644 --- a/components/oss/oss.go +++ b/components/oss/oss.go @@ -50,8 +50,8 @@ type Oss interface { HeadObject(context.Context, *HeadObjectInput) (*HeadObjectOutput, error) IsObjectExist(context.Context, *IsObjectExistInput) (*IsObjectExistOutput, error) SignURL(context.Context, *SignURLInput) (*SignURLOutput, error) - UpdateDownLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) error - UpdateUpLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) error + UpdateDownloadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) error + UpdateUploadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) error AppendObject(context.Context, *AppendObjectInput) (*AppendObjectOutput, error) ListParts(context.Context, *ListPartsInput) (*ListPartsOutput, error) } diff --git a/docs/zh/design/oss/oss-api-design.md b/docs/zh/design/oss/oss-api-design.md index 83198747e77347e881130ed5fc35ae2f12dbdbd4..0e510e5e6e66997db009465015cba96e86b0b56f 100644 GIT binary patch delta 24 gcmX?AbgF2BmlnaMJI{*Lx diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go index a2fa99e2f5..6bf3e2c24f 100644 --- a/pkg/grpc/extension/s3/s3.go +++ b/pkg/grpc/extension/s3/s3.go @@ -658,31 +658,31 @@ func (s *S3Server) SignURL(ctx context.Context, req *s3.SignURLInput) (*s3.SignU return output, nil } -func (s *S3Server) UpdateDownLoadBandwidthRateLimit(ctx context.Context, req *s3.UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { +func (s *S3Server) UpdateDownloadBandwidthRateLimit(ctx context.Context, req *s3.UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { if s.ossInstance[req.StoreName] == nil { return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } st := &l8s3.UpdateBandwidthRateLimitInput{} err := transferData(req, st) if err != nil { - return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for UpdateDownLoadBandwidthRateLimit,err: %+v", err) + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for UpdateDownloadBandwidthRateLimit,err: %+v", err) } - if err := s.ossInstance[req.StoreName].UpdateDownLoadBandwidthRateLimit(ctx, st); err != nil { + if err := s.ossInstance[req.StoreName].UpdateDownloadBandwidthRateLimit(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) } return &emptypb.Empty{}, nil } -func (s *S3Server) UpdateUpLoadBandwidthRateLimit(ctx context.Context, req *s3.UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { +func (s *S3Server) UpdateUploadBandwidthRateLimit(ctx context.Context, req *s3.UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { if s.ossInstance[req.StoreName] == nil { return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) } st := &l8s3.UpdateBandwidthRateLimitInput{} err := transferData(req, st) if err != nil { - return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for UpdateUpLoadBandwidthRateLimit,err: %+v", err) + return nil, status.Errorf(codes.InvalidArgument, "transfer request data fail for UpdateUploadBandwidthRateLimit,err: %+v", err) } - if err := s.ossInstance[req.StoreName].UpdateUpLoadBandwidthRateLimit(ctx, st); err != nil { + if err := s.ossInstance[req.StoreName].UpdateUploadBandwidthRateLimit(ctx, st); err != nil { return nil, status.Errorf(codes.Internal, err.Error()) } return &emptypb.Empty{}, nil diff --git a/pkg/grpc/extension/s3/s3_test.go b/pkg/grpc/extension/s3/s3_test.go index cc9387e895..00bd976bff 100644 --- a/pkg/grpc/extension/s3/s3_test.go +++ b/pkg/grpc/extension/s3/s3_test.go @@ -814,15 +814,15 @@ func TestUpdateDownLoadBandwidthRateLimit(t *testing.T) { StoreName: "NoStore", AverageRateLimitInBitsPerSec: 1, } - _, err := s3Server.UpdateDownLoadBandwidthRateLimit(ctx, req) + _, err := s3Server.UpdateDownloadBandwidthRateLimit(ctx, req) assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) - mockossServer.EXPECT().UpdateDownLoadBandwidthRateLimit(ctx, + mockossServer.EXPECT().UpdateDownloadBandwidthRateLimit(ctx, &l8s3.UpdateBandwidthRateLimitInput{ AverageRateLimitInBitsPerSec: 1, }, ).Return(nil) req.StoreName = MOCKSERVER - _, err = s3Server.UpdateDownLoadBandwidthRateLimit(ctx, req) + _, err = s3Server.UpdateDownloadBandwidthRateLimit(ctx, req) assert.Nil(t, err) } @@ -841,15 +841,15 @@ func TestUpdateUpLoadBandwidthRateLimit(t *testing.T) { StoreName: "NoStore", AverageRateLimitInBitsPerSec: 1, } - _, err := s3Server.UpdateUpLoadBandwidthRateLimit(ctx, req) + _, err := s3Server.UpdateUploadBandwidthRateLimit(ctx, req) assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) - mockossServer.EXPECT().UpdateUpLoadBandwidthRateLimit(ctx, + mockossServer.EXPECT().UpdateUploadBandwidthRateLimit(ctx, &l8s3.UpdateBandwidthRateLimitInput{ AverageRateLimitInBitsPerSec: 1, }, ).Return(nil) req.StoreName = MOCKSERVER - _, err = s3Server.UpdateUpLoadBandwidthRateLimit(ctx, req) + _, err = s3Server.UpdateUploadBandwidthRateLimit(ctx, req) assert.Nil(t, err) } diff --git a/pkg/mock/components/oss/oss.go b/pkg/mock/components/oss/oss.go index 5134597857..305e6739dc 100644 --- a/pkg/mock/components/oss/oss.go +++ b/pkg/mock/components/oss/oss.go @@ -394,32 +394,32 @@ func (mr *MockOssMockRecorder) SignURL(arg0, arg1 interface{}) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SignURL", reflect.TypeOf((*MockOss)(nil).SignURL), arg0, arg1) } -// UpdateDownLoadBandwidthRateLimit mocks base method. -func (m *MockOss) UpdateDownLoadBandwidthRateLimit(arg0 context.Context, arg1 *oss.UpdateBandwidthRateLimitInput) error { +// UpdateDownloadBandwidthRateLimit mocks base method. +func (m *MockOss) UpdateDownloadBandwidthRateLimit(arg0 context.Context, arg1 *oss.UpdateBandwidthRateLimitInput) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpdateDownLoadBandwidthRateLimit", arg0, arg1) + ret := m.ctrl.Call(m, "UpdateDownloadBandwidthRateLimit", arg0, arg1) ret0, _ := ret[0].(error) return ret0 } -// UpdateDownLoadBandwidthRateLimit indicates an expected call of UpdateDownLoadBandwidthRateLimit. -func (mr *MockOssMockRecorder) UpdateDownLoadBandwidthRateLimit(arg0, arg1 interface{}) *gomock.Call { +// UpdateDownloadBandwidthRateLimit indicates an expected call of UpdateDownloadBandwidthRateLimit. +func (mr *MockOssMockRecorder) UpdateDownloadBandwidthRateLimit(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDownLoadBandwidthRateLimit", reflect.TypeOf((*MockOss)(nil).UpdateDownLoadBandwidthRateLimit), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDownloadBandwidthRateLimit", reflect.TypeOf((*MockOss)(nil).UpdateDownloadBandwidthRateLimit), arg0, arg1) } -// UpdateUpLoadBandwidthRateLimit mocks base method. -func (m *MockOss) UpdateUpLoadBandwidthRateLimit(arg0 context.Context, arg1 *oss.UpdateBandwidthRateLimitInput) error { +// UpdateUploadBandwidthRateLimit mocks base method. +func (m *MockOss) UpdateUploadBandwidthRateLimit(arg0 context.Context, arg1 *oss.UpdateBandwidthRateLimitInput) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpdateUpLoadBandwidthRateLimit", arg0, arg1) + ret := m.ctrl.Call(m, "UpdateUploadBandwidthRateLimit", arg0, arg1) ret0, _ := ret[0].(error) return ret0 } -// UpdateUpLoadBandwidthRateLimit indicates an expected call of UpdateUpLoadBandwidthRateLimit. -func (mr *MockOssMockRecorder) UpdateUpLoadBandwidthRateLimit(arg0, arg1 interface{}) *gomock.Call { +// UpdateUploadBandwidthRateLimit indicates an expected call of UpdateUploadBandwidthRateLimit. +func (mr *MockOssMockRecorder) UpdateUploadBandwidthRateLimit(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateUpLoadBandwidthRateLimit", reflect.TypeOf((*MockOss)(nil).UpdateUpLoadBandwidthRateLimit), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateUploadBandwidthRateLimit", reflect.TypeOf((*MockOss)(nil).UpdateUploadBandwidthRateLimit), arg0, arg1) } // UploadPart mocks base method. diff --git a/pkg/mock/runtime/oss/oss.go b/pkg/mock/runtime/oss/oss.go index 5cb92da3d6..0f22d4ef3f 100644 --- a/pkg/mock/runtime/oss/oss.go +++ b/pkg/mock/runtime/oss/oss.go @@ -499,44 +499,44 @@ func (mr *MockObjectStorageServiceClientMockRecorder) SignURL(ctx, in interface{ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SignURL", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).SignURL), varargs...) } -// UpdateDownLoadBandwidthRateLimit mocks base method. -func (m *MockObjectStorageServiceClient) UpdateDownLoadBandwidthRateLimit(ctx context.Context, in *v1.UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { +// UpdateDownloadBandwidthRateLimit mocks base method. +func (m *MockObjectStorageServiceClient) UpdateDownloadBandwidthRateLimit(ctx context.Context, in *v1.UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { m.ctrl.T.Helper() varargs := []interface{}{ctx, in} for _, a := range opts { varargs = append(varargs, a) } - ret := m.ctrl.Call(m, "UpdateDownLoadBandwidthRateLimit", varargs...) + ret := m.ctrl.Call(m, "UpdateDownloadBandwidthRateLimit", varargs...) ret0, _ := ret[0].(*emptypb.Empty) ret1, _ := ret[1].(error) return ret0, ret1 } -// UpdateDownLoadBandwidthRateLimit indicates an expected call of UpdateDownLoadBandwidthRateLimit. -func (mr *MockObjectStorageServiceClientMockRecorder) UpdateDownLoadBandwidthRateLimit(ctx, in interface{}, opts ...interface{}) *gomock.Call { +// UpdateDownloadBandwidthRateLimit indicates an expected call of UpdateDownloadBandwidthRateLimit. +func (mr *MockObjectStorageServiceClientMockRecorder) UpdateDownloadBandwidthRateLimit(ctx, in interface{}, opts ...interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() varargs := append([]interface{}{ctx, in}, opts...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDownLoadBandwidthRateLimit", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).UpdateDownLoadBandwidthRateLimit), varargs...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDownloadBandwidthRateLimit", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).UpdateDownloadBandwidthRateLimit), varargs...) } -// UpdateUpLoadBandwidthRateLimit mocks base method. -func (m *MockObjectStorageServiceClient) UpdateUpLoadBandwidthRateLimit(ctx context.Context, in *v1.UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { +// UpdateUploadBandwidthRateLimit mocks base method. +func (m *MockObjectStorageServiceClient) UpdateUploadBandwidthRateLimit(ctx context.Context, in *v1.UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { m.ctrl.T.Helper() varargs := []interface{}{ctx, in} for _, a := range opts { varargs = append(varargs, a) } - ret := m.ctrl.Call(m, "UpdateUpLoadBandwidthRateLimit", varargs...) + ret := m.ctrl.Call(m, "UpdateUploadBandwidthRateLimit", varargs...) ret0, _ := ret[0].(*emptypb.Empty) ret1, _ := ret[1].(error) return ret0, ret1 } -// UpdateUpLoadBandwidthRateLimit indicates an expected call of UpdateUpLoadBandwidthRateLimit. -func (mr *MockObjectStorageServiceClientMockRecorder) UpdateUpLoadBandwidthRateLimit(ctx, in interface{}, opts ...interface{}) *gomock.Call { +// UpdateUploadBandwidthRateLimit indicates an expected call of UpdateUploadBandwidthRateLimit. +func (mr *MockObjectStorageServiceClientMockRecorder) UpdateUploadBandwidthRateLimit(ctx, in interface{}, opts ...interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() varargs := append([]interface{}{ctx, in}, opts...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateUpLoadBandwidthRateLimit", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).UpdateUpLoadBandwidthRateLimit), varargs...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateUploadBandwidthRateLimit", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).UpdateUploadBandwidthRateLimit), varargs...) } // UploadPart mocks base method. @@ -1478,34 +1478,34 @@ func (mr *MockObjectStorageServiceServerMockRecorder) SignURL(arg0, arg1 interfa return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SignURL", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).SignURL), arg0, arg1) } -// UpdateDownLoadBandwidthRateLimit mocks base method. -func (m *MockObjectStorageServiceServer) UpdateDownLoadBandwidthRateLimit(arg0 context.Context, arg1 *v1.UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { +// UpdateDownloadBandwidthRateLimit mocks base method. +func (m *MockObjectStorageServiceServer) UpdateDownloadBandwidthRateLimit(arg0 context.Context, arg1 *v1.UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpdateDownLoadBandwidthRateLimit", arg0, arg1) + ret := m.ctrl.Call(m, "UpdateDownloadBandwidthRateLimit", arg0, arg1) ret0, _ := ret[0].(*emptypb.Empty) ret1, _ := ret[1].(error) return ret0, ret1 } -// UpdateDownLoadBandwidthRateLimit indicates an expected call of UpdateDownLoadBandwidthRateLimit. -func (mr *MockObjectStorageServiceServerMockRecorder) UpdateDownLoadBandwidthRateLimit(arg0, arg1 interface{}) *gomock.Call { +// UpdateDownloadBandwidthRateLimit indicates an expected call of UpdateDownloadBandwidthRateLimit. +func (mr *MockObjectStorageServiceServerMockRecorder) UpdateDownloadBandwidthRateLimit(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDownLoadBandwidthRateLimit", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).UpdateDownLoadBandwidthRateLimit), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDownloadBandwidthRateLimit", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).UpdateDownloadBandwidthRateLimit), arg0, arg1) } -// UpdateUpLoadBandwidthRateLimit mocks base method. -func (m *MockObjectStorageServiceServer) UpdateUpLoadBandwidthRateLimit(arg0 context.Context, arg1 *v1.UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { +// UpdateUploadBandwidthRateLimit mocks base method. +func (m *MockObjectStorageServiceServer) UpdateUploadBandwidthRateLimit(arg0 context.Context, arg1 *v1.UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpdateUpLoadBandwidthRateLimit", arg0, arg1) + ret := m.ctrl.Call(m, "UpdateUploadBandwidthRateLimit", arg0, arg1) ret0, _ := ret[0].(*emptypb.Empty) ret1, _ := ret[1].(error) return ret0, ret1 } -// UpdateUpLoadBandwidthRateLimit indicates an expected call of UpdateUpLoadBandwidthRateLimit. -func (mr *MockObjectStorageServiceServerMockRecorder) UpdateUpLoadBandwidthRateLimit(arg0, arg1 interface{}) *gomock.Call { +// UpdateUploadBandwidthRateLimit indicates an expected call of UpdateUploadBandwidthRateLimit. +func (mr *MockObjectStorageServiceServerMockRecorder) UpdateUploadBandwidthRateLimit(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateUpLoadBandwidthRateLimit", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).UpdateUpLoadBandwidthRateLimit), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateUploadBandwidthRateLimit", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).UpdateUploadBandwidthRateLimit), arg0, arg1) } // UploadPart mocks base method. diff --git a/spec/proto/extension/v1/oss.pb.go b/spec/proto/extension/v1/oss.pb.go index ce431908a5..ef57424d66 100644 --- a/spec/proto/extension/v1/oss.pb.go +++ b/spec/proto/extension/v1/oss.pb.go @@ -7701,7 +7701,7 @@ var file_oss_proto_rawDesc = []byte{ 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x74, - 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x4c, 0x6f, 0x61, 0x64, + 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, 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, 0x55, 0x70, 0x64, @@ -7709,7 +7709,7 @@ var file_oss_proto_rawDesc = []byte{ 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, 0x72, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x70, - 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, + 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 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, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, @@ -7889,8 +7889,8 @@ var file_oss_proto_depIdxs = []int32{ 53, // 55: spec.proto.extension.v1.ObjectStorageService.HeadObject:input_type -> spec.proto.extension.v1.HeadObjectInput 55, // 56: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:input_type -> spec.proto.extension.v1.IsObjectExistInput 57, // 57: spec.proto.extension.v1.ObjectStorageService.SignURL:input_type -> spec.proto.extension.v1.SignURLInput - 59, // 58: spec.proto.extension.v1.ObjectStorageService.UpdateDownLoadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput - 59, // 59: spec.proto.extension.v1.ObjectStorageService.UpdateUpLoadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput + 59, // 58: spec.proto.extension.v1.ObjectStorageService.UpdateDownloadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput + 59, // 59: spec.proto.extension.v1.ObjectStorageService.UpdateUploadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput 60, // 60: spec.proto.extension.v1.ObjectStorageService.AppendObject:input_type -> spec.proto.extension.v1.AppendObjectInput 62, // 61: spec.proto.extension.v1.ObjectStorageService.ListParts:input_type -> spec.proto.extension.v1.ListPartsInput 80, // 62: spec.proto.extension.v1.ObjectStorageService.InitClient:output_type -> google.protobuf.Empty @@ -7916,8 +7916,8 @@ var file_oss_proto_depIdxs = []int32{ 54, // 82: spec.proto.extension.v1.ObjectStorageService.HeadObject:output_type -> spec.proto.extension.v1.HeadObjectOutput 56, // 83: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:output_type -> spec.proto.extension.v1.IsObjectExistOutput 58, // 84: spec.proto.extension.v1.ObjectStorageService.SignURL:output_type -> spec.proto.extension.v1.SignURLOutput - 80, // 85: spec.proto.extension.v1.ObjectStorageService.UpdateDownLoadBandwidthRateLimit:output_type -> google.protobuf.Empty - 80, // 86: spec.proto.extension.v1.ObjectStorageService.UpdateUpLoadBandwidthRateLimit:output_type -> google.protobuf.Empty + 80, // 85: spec.proto.extension.v1.ObjectStorageService.UpdateDownloadBandwidthRateLimit:output_type -> google.protobuf.Empty + 80, // 86: spec.proto.extension.v1.ObjectStorageService.UpdateUploadBandwidthRateLimit:output_type -> google.protobuf.Empty 61, // 87: spec.proto.extension.v1.ObjectStorageService.AppendObject:output_type -> spec.proto.extension.v1.AppendObjectOutput 64, // 88: spec.proto.extension.v1.ObjectStorageService.ListParts:output_type -> spec.proto.extension.v1.ListPartsOutput 62, // [62:89] is the sub-list for method output_type diff --git a/spec/proto/extension/v1/oss.proto b/spec/proto/extension/v1/oss.proto index 583ab88b16..3c607bc305 100644 --- a/spec/proto/extension/v1/oss.proto +++ b/spec/proto/extension/v1/oss.proto @@ -79,10 +79,10 @@ service ObjectStorageService{ rpc SignURL(SignURLInput) returns(SignURLOutput){} //This action used to set download bandwidth limit speed. //Refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2106 - rpc UpdateDownLoadBandwidthRateLimit(UpdateBandwidthRateLimitInput) returns(google.protobuf.Empty){} + rpc UpdateDownloadBandwidthRateLimit(UpdateBandwidthRateLimitInput) returns(google.protobuf.Empty){} //This action used to set upload bandwidth limit speed. //Refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2096 - rpc UpdateUpLoadBandwidthRateLimit(UpdateBandwidthRateLimitInput) returns(google.protobuf.Empty){} + rpc UpdateUploadBandwidthRateLimit(UpdateBandwidthRateLimitInput) returns(google.protobuf.Empty){} //This action used to append object. //Refer https://help.aliyun.com/document_detail/31981.html or https://github.com/minio/minio-java/issues/980 rpc AppendObject(stream AppendObjectInput) returns(AppendObjectOutput){} diff --git a/spec/proto/extension/v1/oss_grpc.pb.go b/spec/proto/extension/v1/oss_grpc.pb.go index 3ba239057e..5ff90f9695 100644 --- a/spec/proto/extension/v1/oss_grpc.pb.go +++ b/spec/proto/extension/v1/oss_grpc.pb.go @@ -89,10 +89,10 @@ type ObjectStorageServiceClient interface { SignURL(ctx context.Context, in *SignURLInput, opts ...grpc.CallOption) (*SignURLOutput, error) //This action used to set download bandwidth limit speed. //Refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2106 - UpdateDownLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) + UpdateDownloadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) //This action used to set upload bandwidth limit speed. //Refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2096 - UpdateUpLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) + UpdateUploadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) //This action used to append object. //Refer https://help.aliyun.com/document_detail/31981.html or https://github.com/minio/minio-java/issues/980 AppendObject(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_AppendObjectClient, error) @@ -389,18 +389,18 @@ func (c *objectStorageServiceClient) SignURL(ctx context.Context, in *SignURLInp return out, nil } -func (c *objectStorageServiceClient) UpdateDownLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { +func (c *objectStorageServiceClient) UpdateDownloadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/UpdateDownLoadBandwidthRateLimit", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/UpdateDownloadBandwidthRateLimit", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *objectStorageServiceClient) UpdateUpLoadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { +func (c *objectStorageServiceClient) UpdateUploadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/UpdateUpLoadBandwidthRateLimit", in, out, opts...) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/UpdateUploadBandwidthRateLimit", in, out, opts...) if err != nil { return nil, err } @@ -523,10 +523,10 @@ type ObjectStorageServiceServer interface { SignURL(context.Context, *SignURLInput) (*SignURLOutput, error) //This action used to set download bandwidth limit speed. //Refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2106 - UpdateDownLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) + UpdateDownloadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) //This action used to set upload bandwidth limit speed. //Refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2096 - UpdateUpLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) + UpdateUploadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) //This action used to append object. //Refer https://help.aliyun.com/document_detail/31981.html or https://github.com/minio/minio-java/issues/980 AppendObject(ObjectStorageService_AppendObjectServer) error @@ -608,11 +608,11 @@ func (UnimplementedObjectStorageServiceServer) IsObjectExist(context.Context, *I func (UnimplementedObjectStorageServiceServer) SignURL(context.Context, *SignURLInput) (*SignURLOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method SignURL not implemented") } -func (UnimplementedObjectStorageServiceServer) UpdateDownLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateDownLoadBandwidthRateLimit not implemented") +func (UnimplementedObjectStorageServiceServer) UpdateDownloadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateDownloadBandwidthRateLimit not implemented") } -func (UnimplementedObjectStorageServiceServer) UpdateUpLoadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateUpLoadBandwidthRateLimit not implemented") +func (UnimplementedObjectStorageServiceServer) UpdateUploadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateUploadBandwidthRateLimit not implemented") } func (UnimplementedObjectStorageServiceServer) AppendObject(ObjectStorageService_AppendObjectServer) error { return status.Errorf(codes.Unimplemented, "method AppendObject not implemented") @@ -1065,38 +1065,38 @@ func _ObjectStorageService_SignURL_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } -func _ObjectStorageService_UpdateDownLoadBandwidthRateLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_UpdateDownloadBandwidthRateLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpdateBandwidthRateLimitInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ObjectStorageServiceServer).UpdateDownLoadBandwidthRateLimit(ctx, in) + return srv.(ObjectStorageServiceServer).UpdateDownloadBandwidthRateLimit(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/UpdateDownLoadBandwidthRateLimit", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/UpdateDownloadBandwidthRateLimit", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).UpdateDownLoadBandwidthRateLimit(ctx, req.(*UpdateBandwidthRateLimitInput)) + return srv.(ObjectStorageServiceServer).UpdateDownloadBandwidthRateLimit(ctx, req.(*UpdateBandwidthRateLimitInput)) } return interceptor(ctx, in, info, handler) } -func _ObjectStorageService_UpdateUpLoadBandwidthRateLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ObjectStorageService_UpdateUploadBandwidthRateLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpdateBandwidthRateLimitInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ObjectStorageServiceServer).UpdateUpLoadBandwidthRateLimit(ctx, in) + return srv.(ObjectStorageServiceServer).UpdateUploadBandwidthRateLimit(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/UpdateUpLoadBandwidthRateLimit", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/UpdateUploadBandwidthRateLimit", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).UpdateUpLoadBandwidthRateLimit(ctx, req.(*UpdateBandwidthRateLimitInput)) + return srv.(ObjectStorageServiceServer).UpdateUploadBandwidthRateLimit(ctx, req.(*UpdateBandwidthRateLimitInput)) } return interceptor(ctx, in, info, handler) } @@ -1233,12 +1233,12 @@ var ObjectStorageService_ServiceDesc = grpc.ServiceDesc{ Handler: _ObjectStorageService_SignURL_Handler, }, { - MethodName: "UpdateDownLoadBandwidthRateLimit", - Handler: _ObjectStorageService_UpdateDownLoadBandwidthRateLimit_Handler, + MethodName: "UpdateDownloadBandwidthRateLimit", + Handler: _ObjectStorageService_UpdateDownloadBandwidthRateLimit_Handler, }, { - MethodName: "UpdateUpLoadBandwidthRateLimit", - Handler: _ObjectStorageService_UpdateUpLoadBandwidthRateLimit_Handler, + MethodName: "UpdateUploadBandwidthRateLimit", + Handler: _ObjectStorageService_UpdateUploadBandwidthRateLimit_Handler, }, { MethodName: "ListParts", From c8d46653a71e46d1f0426c4f55b9f8dfcd9d4bab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 13 Jul 2022 20:00:12 +0800 Subject: [PATCH 085/126] fix design doc --- docs/zh/design/oss/oss-api-design.md | Bin 14666 -> 14671 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/zh/design/oss/oss-api-design.md b/docs/zh/design/oss/oss-api-design.md index 0e510e5e6e66997db009465015cba96e86b0b56f..6791f67e7d8e055244a5315aa7ffc645d5028e13 100644 GIT binary patch delta 29 lcmX?AbiQcACT2FSgoK3j{LNdLzcX!K&BnpGc@zH(O#s0n3-CT8Y@goMpIn7=b^-oVDrxp@cwbWH%H#S0(+ From 0f0dba8d6b94bcc2ae0a5dc569005409b4e2bb3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 13 Jul 2022 20:01:37 +0800 Subject: [PATCH 086/126] fix design markdown file --- docs/zh/design/oss/oss-api-design.md | Bin 14671 -> 14673 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/zh/design/oss/oss-api-design.md b/docs/zh/design/oss/oss-api-design.md index 6791f67e7d8e055244a5315aa7ffc645d5028e13..01d79e4c264816467e6579690c5d1bda4ce6307f 100644 GIT binary patch delta 17 ZcmX?Kbg^i|NA}Gh*b~_{2k`yZ0svKZ2zUSh delta 17 ZcmcaubiQcANA}I1*b~?`2lM^Y0svKy2zvkk From 6b4b5a0cd709064ed150eef982a1fd0b05743dad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Thu, 14 Jul 2022 10:41:29 +0800 Subject: [PATCH 087/126] fix protoc version and ut error --- components/oss/types.go | 1 + pkg/runtime/config_test.go | 5 +++-- spec/go.mod | 2 +- spec/proto/extension/v1/oss.pb.go | 9 ++------- spec/proto/extension/v1/oss_grpc.pb.go | 4 ++++ 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/components/oss/types.go b/components/oss/types.go index 4487e2df85..6cf6947d85 100644 --- a/components/oss/types.go +++ b/components/oss/types.go @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package oss import ( diff --git a/pkg/runtime/config_test.go b/pkg/runtime/config_test.go index faa25e482a..7c354634e3 100644 --- a/pkg/runtime/config_test.go +++ b/pkg/runtime/config_test.go @@ -11,13 +11,14 @@ // 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 runtime import ( "encoding/json" "testing" - "mosn.io/layotto/components/file" + "mosn.io/layotto/components/pkg/utils" "github.com/stretchr/testify/assert" ) @@ -43,7 +44,7 @@ func TestConfig(t *testing.T) { mscf, err := ParseRuntimeConfig([]byte(data)) assert.Nil(t, err) v := mscf.Files["aliOSS"] - m := make([]*file.OssMetadata, 0) + m := make([]*utils.OssMetadata, 0) err = json.Unmarshal(v.Metadata, &m) assert.Nil(t, err) for _, x := range m { diff --git a/spec/go.mod b/spec/go.mod index 9abdeb39fe..61ce5343f6 100644 --- a/spec/go.mod +++ b/spec/go.mod @@ -3,7 +3,7 @@ module mosn.io/layotto/spec go 1.14 require ( - github.com/golang/protobuf v1.5.0 + github.com/golang/protobuf v1.5.0 // indirect google.golang.org/grpc v1.37.0 google.golang.org/protobuf v1.26.0-rc.1 ) diff --git a/spec/proto/extension/v1/oss.pb.go b/spec/proto/extension/v1/oss.pb.go index ef57424d66..1a5e9b482e 100644 --- a/spec/proto/extension/v1/oss.pb.go +++ b/spec/proto/extension/v1/oss.pb.go @@ -4,8 +4,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.23.0 -// protoc v3.19.1 +// protoc-gen-go v1.28.0 +// protoc v3.17.3 // source: oss.proto package s3 @@ -14,7 +14,6 @@ import ( reflect "reflect" sync "sync" - proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" @@ -27,10 +26,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - type InitInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache diff --git a/spec/proto/extension/v1/oss_grpc.pb.go b/spec/proto/extension/v1/oss_grpc.pb.go index 5ff90f9695..139eecf013 100644 --- a/spec/proto/extension/v1/oss_grpc.pb.go +++ b/spec/proto/extension/v1/oss_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.17.3 +// source: oss.proto package s3 From 9fd98c2a45f207cb2831fb6d3c9d7e596d7acb7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 18 Jul 2022 10:23:16 +0800 Subject: [PATCH 088/126] try fix md file --- docs/zh/design/oss/oss-api-design.md | Bin 14673 -> 14673 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/zh/design/oss/oss-api-design.md b/docs/zh/design/oss/oss-api-design.md index 01d79e4c264816467e6579690c5d1bda4ce6307f..33536599ed3f44d616ecff0399cc182a0b2a9e0f 100644 GIT binary patch delta 20 bcmcaubg^hdH6x?Z Date: Mon, 18 Jul 2022 11:22:39 +0800 Subject: [PATCH 089/126] fix markdown wrong type --- docs/zh/design/oss/oss-api-design.md | Bin 14673 -> 14672 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/zh/design/oss/oss-api-design.md b/docs/zh/design/oss/oss-api-design.md index 33536599ed3f44d616ecff0399cc182a0b2a9e0f..2bada86b241b45081b09764f0d60f55cc84214c3 100644 GIT binary patch delta 12 UcmcaubfIX&PPNUu)TRpo04{6>Q2+n{ delta 14 Wcmcambg^i|PBliZ%{$em3jqK&(*|1r From 005e7322c83310fc206459cf244446b1fb53564d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 18 Jul 2022 11:32:19 +0800 Subject: [PATCH 090/126] fix markdowmn file --- docs/zh/design/oss/oss-api-design.md | Bin 14672 -> 14741 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/zh/design/oss/oss-api-design.md b/docs/zh/design/oss/oss-api-design.md index 2bada86b241b45081b09764f0d60f55cc84214c3..afbe8708ddf87445dc9cd82c46d88d6a6926476a 100644 GIT binary patch delta 650 zcmcamG_`nw$3*v|lero7H(N5EXJl63GMdcAT(Y^AS%#HSVe(9lH3~XhPkT2%o7Vnh z_qJz~d!Ou`^L$oIYFj%-MXDtC&%c zi%VHqS-~?ev&1(NHVw{{MY&ZF@ z$j!-DMHfyk6|0<_AjUfRlbFb4R&g*}!acRbKPf9Uxg;bpJv}ooor~*5-}a~d(h_b#-+oA5q%^baaJ!Bar;5UeCz2xk96gdGbf?FT!B& z2Bj943i>^hSL@5Nb3I+x^Q>dS|9TFtbI0ZEr>4# z)(G+?nq5He${S9XfJ;L{CM>n6I5R&FD0#+kF2p4ssfj7Dz$`bK3Gtj~F+|9<0%$VV zW<_I9rpcM66CpmF>}aMonakXM@=`PB$T*%* z7cnH$7Zf6{rOh~=54J^dsI7?g;f#XcdtPHH(}a>$k;^tmG`+11Q_bVfP~IahjQ8l89u2u(-NJsSx<>!a^z)3Vq4;-<+`*! zG3z|ZeUtHjd< zL;;ay&38PjUbO;F&{udcC@r@!nH-bj%LgQEde?oK`uq)t+kUvw<&lkd%fFUda$A+O zi5V~8J2>bZU5SRW;f@)@wDB~mx?TSY4Vdk@4F8N5(Fx1cs`pO#=2$!GR$*P>Y%|mp sSC3a>=$vRp1@9COqElRiR?@=%H13tm-BC2(r*2P2d@t=+P&HQn1I&5I(*OVf From bb7fa720766eabd1e2a7d9686479ca157335ec1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 18 Jul 2022 11:34:07 +0800 Subject: [PATCH 091/126] rename file name --- .../design/oss/{oss-api-design.md => oss-design.md} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/zh/design/oss/{oss-api-design.md => oss-design.md} (100%) diff --git a/docs/zh/design/oss/oss-api-design.md b/docs/zh/design/oss/oss-design.md similarity index 100% rename from docs/zh/design/oss/oss-api-design.md rename to docs/zh/design/oss/oss-design.md From 662a77fce968bee2b0a09d213afbc7854add0536 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 18 Jul 2022 11:35:13 +0800 Subject: [PATCH 092/126] change markdown file name --- .../design/oss/{oss-design.md => oss-api-design.md} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/zh/design/oss/{oss-design.md => oss-api-design.md} (100%) diff --git a/docs/zh/design/oss/oss-design.md b/docs/zh/design/oss/oss-api-design.md similarity index 100% rename from docs/zh/design/oss/oss-design.md rename to docs/zh/design/oss/oss-api-design.md From dd67f8bfae168983283d841910704a10c5bab15e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 18 Jul 2022 11:52:10 +0800 Subject: [PATCH 093/126] add other markdown file --- docs/zh/design/oss/lock-api-design.md | Bin 0 -> 14735 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/zh/design/oss/lock-api-design.md diff --git a/docs/zh/design/oss/lock-api-design.md b/docs/zh/design/oss/lock-api-design.md new file mode 100644 index 0000000000000000000000000000000000000000..96c542f6fd06338de5e68506a3f97774e02ae96e GIT binary patch literal 14735 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 T*R4&TY-9M{SnB_sr+@wr4M6HK literal 0 HcmV?d00001 From ccd0a4e8e9c5f37b34e7563a849977c6cc2aacd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 18 Jul 2022 11:53:18 +0800 Subject: [PATCH 094/126] refresh markdown file --- docs/zh/design/oss/lock-api-design.md | Bin 14735 -> 9613 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/zh/design/oss/lock-api-design.md b/docs/zh/design/oss/lock-api-design.md index 96c542f6fd06338de5e68506a3f97774e02ae96e..9e62d2926872f06f66956288b9a7247989008d6f 100644 GIT binary patch literal 9613 zcmcIqTXPfHwSMnk(dBu-rfdn!grrDKPB9G0P~pHFE|qhNnqnHMZS^3j6?F^aNv2A^ z%U2n&0pGDP*zsV=o-rUxvi)BY?e5kSf8l&%#i<_64n^Ahmm-^YXEvSmM(ufc z&UrLhIaqXyM;HZ1-pHQ+&eH#!(&HgL*?KD!N!_{A>*b2hs&Bs*_v&H0^O$B9o18oo(!3BTaVj;kQocc^su1?le(pA$xy_fB;R}& z>A3NyV33B5dwP(!>oBdbaq4U!5$>jSy zMkR6HCT<2)XLhJMzvvyjayLpKN-E5kA?iwD4g2w;kCRrf>0xP4HO{f1=>rZRW-Aq~ zZ{GA06Y>5#)4Z$e2|Zb#!o1P{u*xozI2v1Mztwr_lp3?d@Q}z&IGO2cdbCnFZ0I); zHmyL&(u`;zX4nBeoC=-|{HF8MU_t|ND_Gx0YVFu&m4hRg-goznFwCt|DAvuZHVbU( zb|_qX^p(`$lMfH0g1qk;mSM*IsZm|C^uQl+zVlI-4-TwA#+A|wc&5ng@X@@Zr_R$n zd0-(ea`WPCPL%t}(>ep{mqvG_BdXuiqiR^UjPAJd35~-C;k5Y94{&=gcj)C-#ng(( z%qdRhL8bJny0lg)?72&6ahMV7^Im?}8F&CQYW7Sq^ak#Vy?KuBHO!;vn}1i%)SZ@A zX7kmNNdN*Y1CL(5B!=hsdtGMk_9#B@%A<->IT)scz1 zR$pes^pqH$^wI;~+yk*Q>@4g-k{??Ro%srZetg6YGTtiAVj7_5uBLH3fGUIrhP;jE z_`>A=k?!}GRF{@n=yZaY{m$~D^W!R1@=03x&p$1z4L7ff>6WE+>$NTYHR@j!RVC))-S}fB_1keRrmLT+r+!JY zrjjB3wh>kVigrX-CC1#mZ@wV9$2c8)5uo2R1T@o#{>MzIAuXmW#^G&Pk1SDGbB@J4~(n@Lr_uaVKU z8<=cHwRrbANw{{PKL3L9NrdJ-p8yNDMp6sfOa4tgR6#xx@aahg~UM8V`(Dry@Yb|k55ICoqM z$|7C(8>n`&m$XD0kmFJfK=e>5NxMa*K7v8s;|6Adk_GhZiS(*Hx*9g)C$NilS0_HT zlx@Z+2y4-3Z(XD$aF!Ki7MHsG6MbZIJ6K8TVBE6RJEV>ivEJJaox@^I)YQnwft5%z zZq~CjH%JZQ>(Py580XV$;@6HC@w+|)MqEok42h&6O$b6uLDcxfAwUv{mM~N+p@;bJ zz-sUg8lec3&o;;Q^Z^ciQP+4Qm7HiC;zT=ZE2eAkN7~94cazzY5rbPc!**ZCI*uOq zPlGKi6PlD7L$-6zfW@ek_gG}nP)oONe}s78e8^5oCGmV#qf9SIjrc^PzC6za)IUY^ zIP?y4NNTVtxgi*%>3W#-1>XP`ksUS8NJd-pGCIERp1o=)YLI1WI7cX=1GZXvB04FZ zkL$lCpOjnH#))!^&(n3%59s^uT(bk|LaG%pQ_(P;ALf(PW9B`$IppW#Q4@!ssb_pl z(eEdK1~n+M4T$xQ4o9Pt(VM^x98wOa;_Q!>4kwXxVJ>Gn{ds`6Pk*ZbP5%iO*+v13 z;N*^JMpY{nA`fR!Y+6x6Sw74!1f(Aq#|Jp6v#zRoJQY)~BhOA*6600%`ppX$E?&Qm zW1J#cs_Nyd7yfwr=9P>8ed+p*8sht-pI^Lu^~xV^-?)1F>WwciUZX`4)K&G;l^YkY zT{(aG_Qh-0u3p2qR1A2*2D}?3_t;d15R4-fDvEOQB`>z0IJwsdy-1|1Pxg=w zR1PNJl~K1S%K3AuyYUd=*Iz+N8H$*45!r^9`x|EiltyekbY^#|Lz7~C1Bp2W=gbfC zaZBuE8^kDB|1^t)#VtSf@(-}1lX>i=hs1PVjBOGFbJHM=^=|G-r8w+w%aI=0MWwJM za%;#y+#m9l@-ug#Af_k4`sG>xsg&oP^c0dJ=h@r;pc90UWD{ws>d$w9hYThKPB&!%=bnSlf= zMJm@gAF7UwIWvdNgGk4a3?p%K28P7&YoyN$&z$XbR!Vg-?Y-e2x*F_Whw zr#I+mhvSf}Tbgt7SqR6=zjb!|kpV+-n1hj5X?Z;%<&t3frXGsU3GU$H_hm zju-mohnfVrF2w1~ z+Co~dS63~^b6`qYkG*dN#_L+__~11^{Y5PB^WP88^3z)6!m3)w?_=bBN)q{gW)h18 zxPiSK>L>?pWVauPL099=owa!2eh%VA|*i@`fVuF`PWk#z2w$=1QW|d*5 z5o78gKygL(;JEX^yE5zG8Sw@UGZcNu!%2NONh8j1#a=0(9HoX3wq{D;7GVo3qFBL5 z!WHnl@&fQv*31+D(NOD~@b;c#K0F_5;j$>L->dft7lvNdiNot88SpI%FPTxupgOP# zOm)VGfnO-7`55feAP*Xq!y{_MvFK|BxgT+v?P|K@9X>$!5@K|g`soxh5Z6O6&gcxT zxGPXc4Q;IOU9p?>W)7UGQ7BsM_A?baQknFJ-XQ=mC?>P?CvJxIZ!L5Xpt4GF8~{nX zjBFt+GY?1_j>FC8$PHvSpuTxCv+u3OyUB zR)oF?^`GX}(GYQF(U9Ew_FjzHMSBTLxWB|3c&~Tdg9mPDk$Tgzi3ABY^9twVSIjz0 zo`fXxsAds5kGEk=QV?WOJG>cl+7RkknCt&QelGG3?OSD@zaF3IB1%AUF!yZfV&4 z@u4Wbgpl2_H%=NIA6Ps$!oV3Twz5A;j)9si8oi^1?y}RgyED5Q6=7(Pcn3KzzgAPw zgj+;|eZDr`$30Txjx(8)05}MAscQz+xI(&U;S{;$oZ52ps}`ylTf)dbjHrbnnt%b) z7oKj(C)FR7Z<=~7L;;VdB@KFsh4oNHFTMHHdCB|T1n{ZgYNV&3)Go;gWfjapXFZv!o~v?JB1-k#yIEP zF%1Z`kDejyiv5EZvPr;A2yl^s7l&aRG?~z7ttABuv48FmF*=0)6pMHFIO0S#p8Fc|F5VNBu}K^c6-9e+j0AfpSK zvn&HQw~8Z5Z=f!AJ>}#4kOa1~i^eL({e2~x`yoo2Yr{A{m2G9&)u;xPe z%%H@f{Gf?js`%)7V9QCT-Nz4rnX-WNZP=HQL}W4YjLdj+618OwqX{ahc<|S*IHgre z{hLk#J9mcGm{;d0?Hw%~dz;NL11LPedG$%Iy7p8#8$bsv;qTqIh{Y@hvWV#^+&u`$ zfR73dFBYA-d_&MI)8m5n!59I)+V=>gVHk)E==1}1sa#szgxAuRd`Xqvg0|e1Z7Qgr z>@oH`V~-Kb!GSyYhP+>H&&Prz@LZBU85T8p*#**ctGPLWWmqoedO|7dcD?hD9Q5y4~e#72cN2S4K!QJfJ`z6D2B{X=m{j z(h?4UV+&{jI7{*lOp1VyDw8kVZOPJ)s#g-3d`6B0c_VdU?Eiau(XS+t5z1=SSwYIV zb-dpEdwNN6HdmeTmEUBrvI{?a}crpRP=B1T{w>F6@MTZm5b0Fu2LZgl8X%aybnV$ z7sj=sSDyUeIVX_xBZq?}AZ;t6BwxiOT#q7`gIMc=MDW42saPI|#gI|q!5RM>XJPWD znC+{v00E)JmmbAa9o~7d}HhZ^xY(C;SkDmmjQ@ z<+UeZRxY7T>pX6uv(uHs1>E5~t5lHi7Yfe#th)iQBzr&;2P8OIgOB^_Ca;)ASwuw- zOd5SN_CelCQ9g(9EN=P;jP+>zxCc3^37_vcPbn<14dK;s18Qdk_^T2a2h@gy`L4^Whgc;-n7I(;^Hsxx@%H^GS6(_xz(VSE~7I(#yLh#iZzDatLnC%7Pgu)^0Q{=JO6w2PXi zrAK=^LS_p0h~Z=GSiOLvnAKp1lKEfa$1LEn_IsJ0o}R$B25z7tDS6mL@T~spPW_Co z|LSb#nFcHW_dGf^QN#~$zN3pV8&|Bl!30gqwt{z}W_Jg$heUy_?pzDgO)J5I5@p literal 14735 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 T*R4&TY-9M{SnB_sr+@wr4M6HK From ba0b1e938204d226e6a6bc2a7f08337b82679c63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 18 Jul 2022 11:58:58 +0800 Subject: [PATCH 095/126] remove wrong type --- docs/zh/design/oss/oss-api-design.md | Bin 14741 -> 14736 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/zh/design/oss/oss-api-design.md b/docs/zh/design/oss/oss-api-design.md index afbe8708ddf87445dc9cd82c46d88d6a6926476a..1c46ba07ab3b51de3917d9a6ffcee1adb8292466 100644 GIT binary patch delta 9 QcmbPQJfV0)za=9V02Si{j{pDw delta 14 TcmbPGJhga3za`t@`5*`YHbw`q From 9f0ea1520604dc531c945aa986dc69934e4381e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 18 Jul 2022 12:01:05 +0800 Subject: [PATCH 096/126] update1 --- docs/zh/design/oss/lock-api-design.md | 270 ++------------------------ 1 file changed, 11 insertions(+), 259 deletions(-) diff --git a/docs/zh/design/oss/lock-api-design.md b/docs/zh/design/oss/lock-api-design.md index 9e62d29268..6f1109bca3 100644 --- a/docs/zh/design/oss/lock-api-design.md +++ b/docs/zh/design/oss/lock-api-design.md @@ -1,266 +1,18 @@ -# 0. 太长,不看 -添加TryLock和Unlock API. +# Layotto对象存储(OSS)并集API接口定义及设计 -续租API有争议,第一版不加入续租API +## 背景 -# 1. 调研 -| **系统** | **能否实现分布式锁** | **阻塞锁(基于watch)** | **可用性** | **写操作线性一致** | **sequencer([chubby论文里提出的feature](https://static.googleusercontent.com/media/research.google.com/zh-TW//archive/chubby-osdi06.pdf))** | **续租** | -| --- | --- | --- | --- | --- | --- | --- | -| 单机redis | yes | x | 单点失效时,锁服务不可用 | yes | yes(need poc) | yes | -| redis集群 | yes | x | yes | no. 故障转移可能导致丢锁 | yes(need poc) | yes | -| redis Redlock | yes | | | | | | -| consul | yes | | | | | | -| zookeeper | yes | yes | yes 有fo能力,[200 ms内完成选举](https://pdos.csail.mit.edu/6.824/papers/zookeeper.pdf) | yes | yes 使用zxid作为sequencer | yes | -| etcd | yes | yes | yes | yes | yes use revision | yes lease.KeepAlive | +为了让layotto支持对象存储能力,需要对oss的接口进行抽象。抽象出的接口需要满足理论上的”可移植性“以及让接口具有明确的语义。 -可以看到能力还是有一定差异 +## 接口设计 -# 2. High-level design -## 2.1. API -### 2.1.0. 设计原则 -我们面临着很多诱惑,分布式锁其实有很多feature可以做(阻塞锁,可重入锁,读写锁,sequencer等等) +整个接口的设计将遵循以下原则: -但是毕竟我们的目标是设计一套足够通用的API规范,那么在API制定上还是尽量保守些,start simple,先把简单、常用的功能抽象成API规范,等用户反馈后再考虑将更多功能抽象成API规范 +1. **语义性,即抽象出的接口具有明确的语义。** +2. **功能完整性,即抽象出的接口需要尽可能满足不同oss的能力。** +3. **最大可移植性,即抽象出的接口需要尽最大可能的满足可移植性的要求。** -### 2.1.1. TryLock/Unlock -最基础的加锁、解锁功能。TryLock非阻塞,如果没有抢到锁直接返回 +上述原则设计的时候考量的优先级从高到低。为了满足上述的要求,可能会存在以下问题: -proto: - -```protobuf -// Distributed Lock API -rpc TryLock(TryLockRequest)returns (TryLockResponse) {} - -rpc Unlock(UnlockRequest)returns (UnlockResponse) {} - -message TryLockRequest { - string store_name = 1; - // resource_id is the lock key. - string resource_id = 2; - // lock_owner indicate the identifier of lock owner. - // This field is required.You can generate a uuid as lock_owner.For example,in golang: - // - // req.LockOwner = uuid.New().String() - // - // This field is per request,not per process,so it is different for each request, - // which aims to prevent multi-thread in the same process trying the same lock concurrently. - // - // The reason why we don't make it automatically generated is: - // 1. If it is automatically generated,there must be a 'my_lock_owner_id' field in the response. - // This name is so weird that we think it is inappropriate to put it into the api spec - // 2. If we change the field 'my_lock_owner_id' in the response to 'lock_owner',which means the current lock owner of this lock, - // we find that in some lock services users can't get the current lock owner.Actually users don't need it at all. - // 3. When reentrant lock is needed,the existing lock_owner is required to identify client and check "whether this client can reenter this lock". - // So this field in the request shouldn't be removed. - string lock_owner = 3; - // expire is the time before expire.The time unit is second. - int32 expire = 4; -} - -message TryLockResponse { - - bool success = 1; -} - -message UnlockRequest { - string store_name = 1; - // resource_id is the lock key. - string resource_id = 2; - - string lock_owner = 3; -} - -message UnlockResponse { - enum Status { - SUCCESS = 0; - LOCK_UNEXIST = 1; - LOCK_BELONG_TO_OTHERS = 2; - INTERNAL_ERROR = 3; - } - - Status status = 1; -} - -``` - - -**Q: expire字段的时间单位?** - -A: 秒。 - -**Q: 能否强制让用户把秒数配大点,别配太小?** - -A: 没法在编译时或者启动时限制,算了 - -**Q: 如果多个客户端传相同的LockOwner会怎么样?** - -case 1. 两个客户端app-id不一样,传的LockOwner相同,不会发生冲突 - -case 2. 两个客户端app-id一样,传的LockOwner相同,会发生冲突。可能会出现抢到别人的锁、释放别人的锁等异常情况 - -因此用户需要保证LockOwner的唯一性,例如给每个请求分配一个UUID,golang写法: - -```go -import "github.com/google/uuid" -//... -req.LockOwner = uuid.New().String() -``` - -**Q: 为啥不加metadata** - -A: 一开始尽量保守一些,等有人反馈有需求再加,或者实现组件过程中发现确实有需要再加 - -**Q: 以后要支持sequencer、可重入锁之类的feature咋加?** - -A: 入参增加feature option,组件也要实现Support()接口 - -### 2.1.2. 续租 -#### Solution A: add an API "LockKeepAlive" - -```protobuf -rpc LockKeepAlive(stream LockKeepAliveRequest) returns (stream LockKeepAliveResponse){} - -message LockKeepAliveRequest { - // resource_id is the lock key. - string resource_id = 1; - - string client_id = 2; - // expire is the time to expire - int64 expire = 3; -} - -message LockKeepAliveResponse { - enum Status { - SUCCESS = 0; - LOCK_UNEXIST = 1; - LOCK_BELONG_TO_OTHERS = 2; - } - // resource_id is the lock key. - string resource_id = 1; - - Status status = 2; -} -``` - -续租的入参、返回结果都是stream,这里参考etcd的实现,app和sidecar只需要维护一个连接,每次用锁需要续租的时候都复用该连接传递续租请求。 - -**Q: 为啥不把续租作为一个stream参数塞到tryLock里?** - -A: 很多业务不用续租,让trylock尽量简单; - -尽量单一职责,后续加上阻塞锁,可以公用续租API; - -把带stream的部分拆开成一个接口,以便http实现简单。 - -**Q:续租逻辑太复杂,能否让用户不感知?** - -A: sdk屏蔽掉这层逻辑,开个线程/协程/nodejs定时事件,自动续租 - - -#### Solution B: 用户不感知续租逻辑,自动续租,App和sidecar维持统一心跳 -缺点/难点: - -1. 使用统一心跳的话,难以定制心跳间隔 - -解法是保证心跳间隔低,比如1秒1次 - -2. 如何保证可靠的故障检测? - -例如以下java代码,unlock可能失败: - -```java -try{ - -}finally{ - lock.unlock() -} -``` - -如果是单机锁,unlock能保证成功(除非整个jvm故障),但是unlock走网络调用的话可能失败。调用失败后,怎么保证心跳断掉? - -这就要求业务在开发时要往心跳检测里上报一些细粒度的状态。 - -我们可以定义http callback接口,由actuator轮询检测,约定callback返回的数据结构为: - -```json -{ - "status": "UP", - "details": { - "lock": [ - { - "resource_id": "res1", - "client_id": "dasfdasfasdfa", - "type": "unlock_fail" - } - ], - "xxx": [] - } -} -``` - -应用要处理状态收集、上报、上报成功后清理、限制map容量(比如上报失败次数多了,map太大OOM怎么办),总归要求app实现一些复杂逻辑,也要放sdk里 - -3. 这个实现其实和续租一样的,都是开一个单独的连接做状态管理,使用过程中有需要就通过这个公用连接上报状态。 -4. API spec依赖心跳逻辑。依赖心跳间隔、心跳返回的数据结构。相当于API spec依赖了Layotto的实现,除非我们能把心跳实现也标准化掉(包括间隔、返回的数据结构等) -5. 心跳检测失败一次,sidecar是否继续续租?如果sidecar停止续租了,下一次心跳检测又正常了,sidecar是否恢复续租?比较难界定,因为心跳检测会有个怀疑机制(比如心跳失败几次才算失败),等怀疑期满再停止续租太慢了,激进停止续租又会有反复问题 -6. app心跳停了一次、后面又恢复的场景,sidecar如果继续续租,怎么知道app的锁还在不在(app可能只是短时间网络抖动、然后恢复了,也可能是干脆重启了没锁了) - -#### Solution C:app自己重试unlock -如果unlock失败,app自己异步重试unlock - -#### 结论 -目前大家对续租方案有不同意见,一期先不实现续租功能。 - -个人倾向A方案,sdk屏蔽掉续租逻辑。虽然用grpc直接调需要处理续租逻辑,但是续租算是分布式锁常用方案,开发者的理解成本低。 - -抛出来看大家意见 - - -## 2.2. 组件 -### 2.2.1. 如何处理“组件不支持某个feature option” -模拟>运行报错>ignore - -特殊情况才ignore,比如consistency传了是eventual consistency,但是存储系统本身是强一致的,可以ignore这个option - -### 2.2.2. 如何处理“组件不支持某个API” -模拟>运行报错 - -以事务API举例 - - - -### 2.2.3. 选型 -一期选择单机redis实现 - -### 2.2.4. "运行时报错"式设计会破坏可移植性,如何让用户更简单的评估能否移植? -A. 提供文档,文档上每种组件给的保证、feature不同,让用户自己评估 - -B. 在sidecar的配置里声明API支持的feature option,如果sidecar启动发现组件不match,启动时报错 - -C. sidecar打运行时日志,自动统计app用了哪些feature,待需要移植时进行日志分析 - -D. 先不管 - -E. 做一个静态分析工具,自动分析可移植性 - -结论:选A,因为简单 - -# 3. Future work - -- 可重入 - -会有一些计数逻辑。需要考虑是所有锁默认支持可重入,还是传参里面加个feature option、标识用户需要可重入 - -- 阻塞锁 -- sequencer - -# 4. Reference -[How to do distributed locking](https://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html) - -[The Chubby lock service for loosely-coupled distributed systems](https://static.googleusercontent.com/media/research.google.com/zh-TW//archive/chubby-osdi06.pdf) - -[https://www.jianshu.com/p/6e72e3ee5623](https://www.jianshu.com/p/6e72e3ee5623) - -[http://zhangtielei.com/posts/blog-redlock-reasoning.html](http://zhangtielei.com/posts/blog-redlock-reasoning.html) - -[http://zhangtielei.com/posts/blog-redlock-reasoning-part2.html](http://zhangtielei.com/posts/blog-redlock-reasoning-part2.html) +1. 字段的冗余,入参和出参可能会存在对应特定厂商的字段。 +2. 部分接口可能只在部分oss厂商上可以支持,即“最大可能移植性”。 \ No newline at end of file From 4944df01d793836609c6b21267d5051557db4f31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 18 Jul 2022 12:01:55 +0800 Subject: [PATCH 097/126] update2 --- docs/zh/design/oss/lock-api-design.md | 50 ++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/docs/zh/design/oss/lock-api-design.md b/docs/zh/design/oss/lock-api-design.md index 6f1109bca3..9f6fb9811a 100644 --- a/docs/zh/design/oss/lock-api-design.md +++ b/docs/zh/design/oss/lock-api-design.md @@ -15,4 +15,52 @@ 上述原则设计的时候考量的优先级从高到低。为了满足上述的要求,可能会存在以下问题: 1. 字段的冗余,入参和出参可能会存在对应特定厂商的字段。 -2. 部分接口可能只在部分oss厂商上可以支持,即“最大可能移植性”。 \ No newline at end of file +2. 部分接口可能只在部分oss厂商上可以支持,即“最大可能移植性”。 + +## 配置模块设计 + +oss原始配置模块的字段抽象如下所示: + +```go +// OssMetadata wraps the configuration of oss implementation +type OssMetadata struct { + Buckets []string `json:"buckets"` // contained buckets in this oss client + Uid string `json:"uid"` // specify the uid of oss client + Endpoint string `json:"endpoint"` + AccessKeyID string `json:"accessKeyID"` + AccessKeySecret string `json:"accessKeySecret"` + Region string `json:"region"` +} +``` + +Endpoint、AccessKeyID、AccessKeySecret、Region是现有的oss都有的概念,本文主要解释buckets和uid字段的作用。 + +场景假设: + +如果用户有多个oss实例,即需要layotto支持多个endpoint和region,需要怎么做? + +如果使用传统的sdk编程,用户编程时使用方式如下: + +```go +client1, err := oss.New(metadata.Endpoint1, metadata.AccessKeyID1, metadata.AccessKeySecret1) + +client2, err := oss.New(metadata.Endpoint2, metadata.AccessKeyID2, metadata.AccessKeySecret2) + +//将object1上传到endpoint1 +client1.PutObject("object1") +//将object2上传到endpoint2 +client2.PutObject("object2") + +``` + +从上面的编程方式可以看出,使用sdk编程时,用户可以拿到client的句柄,然后通过client句柄控制将文件上传到某个目标endpoint。 +但在Layotto中,用户往往是用同一个grpc client来进行服务调用。那么每次PutObject,GetObject等对象操作就需要用户指定文件操作的目标, +即文件操作的endpoint。 + +配置文件中的buckets和uid字段就是用来指定client。如下图所示: + +![img.png](../../../img/oss/configure.png) + +client选择流程图如下所示: + +![img.png](../../../img/oss/flow.png) \ No newline at end of file From a1331520773585018a7ec6adf4cc7258b3441b72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 18 Jul 2022 12:04:13 +0800 Subject: [PATCH 098/126] update3 --- docs/zh/design/oss/lock-api-design.md | Bin 2613 -> 6639 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/zh/design/oss/lock-api-design.md b/docs/zh/design/oss/lock-api-design.md index 9f6fb9811a729f9cfe479370dcba8b512bc01162..cff33b2a6c7b08d8de07573609cb4adbe682119e 100644 GIT binary patch literal 6639 zcmc&(Yf}{28O~SxS9Hb?0ZV6se#pkEq{?VEWkpv@cRyK{v_pfl4%6dwQ-}3jJ`keQ6p7(m%!{#}w)A2k< zls9TG7sSe>=w5!iUAS=h^4slxvGKY-(|hXT*`WATj64ygX@8?%j11IDJGIh+VH`ee z*6t1kQ)R>O*Ejvm-dgF~G|LOd%E3@qRBG*RMGVZm-5#pX=4;Pr%W>W6^gWhc+nuQ` z34JxjIkq;9vgwb6z7-xhz(D>s@PN=Q-s1>w}^= zFA7s{x2FxGDQ+G)!t$UQClkZ34jL{#p#R7b<2VTr1M>t;X$abXK#W3dwSv=vo`LY! zhsEd+;pQ`2W*84{A=xjeh!)NAS6diCqv~i{q1Rr$=PKF zzdli_Kb{Q17b_D%X$?%Gcfzm0CqtqKuJ0D#3?Xvp%eyiVa$<9=+P{H77R7GypqF^1 z5Q+zQqkeZ;6na(MNMH+K)9GhfXDvw(I`Y?mT-& zlJBRr_V(W)zicOSws%0ZCg*)(xn#Ey$ojKiLr(64@{R$o8AfRR_xY}fanUE1jTIIh zOqQ#~Rg^FU1^ie??#u7Nvu?4whS&>cUj*ZQ{`wX&v$pi4-Z!8;fjj_wI!pY@Y;|l| z#-fz9?+kK)bCr0vzDv3gaOmUHf?k#D ze9_-1h_30k+w+FOO8m+$^!VG4s$26olG}2#x;DTCC@%YrB2C z%UeNlNfch=UZ*DCr_C%wu}bo zujj$vmdhqhRu{}YRRhKBuozgVt=bMFr5=X z%78vgoX_2pLBz!4z?tR#mQfFL&g?QMUvsJ(+a z81)X!)1@$w&ZUAVhfOGCQ4~7V%;z2+RDgaCe%;Sm#6kX`JO((N1ECr&i|{*&KICew_tNekLjnRv>P)+E}Tw3TT)#<6qE%BGIx z>{dHxXOcFn#E5g)Jex^*r@8Cz!NO?3*YK<;%wgIQL*tw$wU760Mm4xqRlEiLMf2v@8ae$ql=G2y28p{Dmnp=wHJ9f|SV-5uq4ONK)6^BT5@O z(IRQU!OwY71Y+Q-PL>|J<~^AmNB>zQ>EWx~Bl zZZEzOBjcbz$kYlia6zIg1SWVMy~FaWy2E498SikU~j$|6Mr=LC_XH!VFABY)>aqEqR^%ccW9qzTy2*|_Ikz(rXj zB`=C>@PUerP^A&whyj_{Ng0~-6`9`dsAtoRQ7GdnhVp`Ye(Wd(fEmLSbHiz&^~j36 zSzzsoq%k?ziQJ5-!4~v?qmN>eTVdlPVFxz#41M-YxF6-!+iJwtB9sMpScQMtT|B)Y95GmH*BvBAKiVHyY8aJs5~Auu%v5%ybf`q3 zV)f){euJ`qmX)>T@(B(RSw~tsGRX#)u4>8CxXhX4)%Ydr_Icc9tTv=>OJ_!Iv|HIL zeC1G=G$eXtO_!;!@91=w*O2N9m%le-+i*rfRE?FXiBK+>17Yq!CIxV57qGA zKwCc@s@j%)hx&hKvi}xUHI?nT^&?PKJdM9H7}qoCDde zsr%QPEiv#2_rdB4-cWone|}VRqF8B*7!fv#D$~zuk&Z-d4v!YUkU6KFY^M&T#bLV3 zzxii%YlL6X0v&!y@k{v2MR3coR Date: Mon, 18 Jul 2022 12:06:58 +0800 Subject: [PATCH 099/126] remove typo --- docs/zh/design/oss/lock-api-design.md | Bin 6639 -> 6638 bytes docs/zh/design/oss/oss-api-design.md | Bin 14736 -> 14735 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/zh/design/oss/lock-api-design.md b/docs/zh/design/oss/lock-api-design.md index cff33b2a6c7b08d8de07573609cb4adbe682119e..6ce0f6b13f403fe73568cce9c849e0083e5bd452 100644 GIT binary patch delta 12 TcmaEF{LXm8P0`J_L`7KuE6D|& delta 14 VcmaE7{N8xOO;JXM%{N6wSpYMR1)Tr@ diff --git a/docs/zh/design/oss/oss-api-design.md b/docs/zh/design/oss/oss-api-design.md index 1c46ba07ab3b51de3917d9a6ffcee1adb8292466..5f0a27c674ad66eef50a881c8cf33163aaf92bc4 100644 GIT binary patch delta 12 TcmbPG++V!mqUh#JqWhEqDYym~ delta 14 VcmeA#o>08uq9`N7=8K~HlmRgD1{VMT From 4768fdab7c76572bd0fcde2fac6556f99b57cfdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 18 Jul 2022 12:08:04 +0800 Subject: [PATCH 100/126] remove unused doc --- docs/zh/design/oss/lock-api-design.md | 173 -------------------------- 1 file changed, 173 deletions(-) delete mode 100644 docs/zh/design/oss/lock-api-design.md diff --git a/docs/zh/design/oss/lock-api-design.md b/docs/zh/design/oss/lock-api-design.md deleted file mode 100644 index 6ce0f6b13f..0000000000 --- a/docs/zh/design/oss/lock-api-design.md +++ /dev/null @@ -1,173 +0,0 @@ -# Layotto对象存储(OSS)并集API接口定义及设计 - -## 背景 - -为了让layotto支持对象存储能力,需要对oss的接口进行抽象。抽象出的接口需要满足理论上的”可移植性“以及让接口具有明确的语义。 - -## 接口设计 - -整个接口的设计将遵循以下原则: - -1. **语义性,即抽象出的接口具有明确的语义。** -2. **功能完整性,即抽象出的接口需要尽可能满足不同oss的能力。** -3. **最大可移植性,即抽象出的接口需要尽最大可能的满足可移植性的要求。** - -上述原则设计的时候考量的优先级从高到低。为了满足上述的要求,可能会存在以下问题: - -1. 字段的冗余,入参和出参可能会存在对应特定厂商的字段。 -2. 部分接口可能只在部分oss厂商上可以支持,即“最大可能移植性”。 - -## 配置模块设计 - -oss原始配置模块的字段抽象如下所示: - -```go -// OssMetadata wraps the configuration of oss implementation -type OssMetadata struct { - Buckets []string `json:"buckets"` // contained buckets in this oss client - Uid string `json:"uid"` // specify the uid of oss client - Endpoint string `json:"endpoint"` - AccessKeyID string `json:"accessKeyID"` - AccessKeySecret string `json:"accessKeySecret"` - Region string `json:"region"` -} -``` - -Endpoint、AccessKeyID、AccessKeySecret、Region是现有的oss都有的概念,本文主要解释buckets和uid字段的作用。 - -场景假设: - -如果用户有多个oss实例,即需要layotto支持多个endpoint和region,需要怎么做? - -如果使用传统的sdk编程,用户编程时使用方式如下: - -```go -client1, err := oss.New(metadata.Endpoint1, metadata.AccessKeyID1, metadata.AccessKeySecret1) - -client2, err := oss.New(metadata.Endpoint2, metadata.AccessKeyID2, metadata.AccessKeySecret2) - -//将object1上传到endpoint1 -client1.PutObject("object1") -//将object2上传到endpoint2 -client2.PutObject("object2") - -``` - -从上面的编程方式可以看出,使用sdk编程时,用户可以拿到client的句柄,然后通过client句柄控制将文件上传到某个目标endpoint。 -但在Layotto中,用户往往是用同一个grpc client来进行服务调用。那么每次PutObject,GetObject等对象操作就需要用户指定文件操作的目标, -即文件操作的endpoint。 - -配置文件中的buckets和uid字段就是用来指定client。如下图所示: - -![img.png](../../../img/oss/configure.png) - -layotto中的client选择流程图如下所示: - -![img.png](../../../img/oss/flow.png) - -## 接口设计 - -接口的定义主要分为两类: - -1. 通用接口,即类似于PutObject、GetObject等所有的oss服务都支持的接口。 -2. 非通用接口,即只有部分oss服务支持的接口。比如ListParts接口,aws就无法支持。 - -该接口的设计主要参考aliyun和aws以及Minio的接口定义。 -> https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObject.html -> https://help.aliyun.com/document_detail/31980.html -> https://docs.min.io/docs/golang-client-api-reference.html - -### InitClient - -该接口主要用于初始化操作,当前layotto组件的定义都有一个Init操作,该Init接口在Layotto启动的过程中就会执行,入参为配置文件的内容。如下所示: - -```go -type LockStore interface { - // Init lock - Init(metadata Metadata) error - // Get lock's features - Features() []Feature - // Node tries to acquire a lock - TryLock(req *TryLockRequest) (*TryLockResponse, error) - // Node tries to release a lock - Unlock(req *UnlockRequest) (*UnlockResponse, error) -} - -``` - -但在实际生产中,组件的初始化是很有可能依赖应用的启动,比如oss中的ak、sk的获取,一般不会在配置文件中进行明文的配置, -有可能是从应用测获取,也有可能是用户自定义方式获取。 因此InitClient用来触发client的初始化操作。于此同时,Oss组件的完整配置如下所示: - -```json -"oss": { - "oss_demo": { - "type": "awsOSS", - "method": "", - "metadata": [ - { - "region": "xxxxx", - "endpoint": "xxxxx", - "accessKeyID": "xxxx", - "accessKeySecret": "xxxxx" - } - ] - } -} - -``` - -method字段用来指定初始化函数,用户可以实现自定义初始化函数,即ak、sk的获取方式可以在自定义初始化函数中实现,该函数的定义如下: - -```go -type S3ClientInit func(staticConf json.RawMessage, dynConf map[string]string) (map[string]interface{}, error) -``` - -第一个参数为json中的静态配置,第二个为动态配置,可以来自于InitClient请求传递过来的数据,也可以是用户自己实现的数据源。 -用户则可以通过以下方式将自定义Init方法注册到layotto。 - -```go -factory.RegisterInitFunc("aws", AwsDefaultInitFunc) -``` - -### PutObject - -对象上传接口,用作上传文件,是oss最基本能力。 - -> [https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_PutObject.html) -> [https://help.aliyun.com/document_detail/31978.html](https://help.aliyun.com/document_detail/31978.html) - -### GetObject - -对象下载接口,用作文件下载,是oss最基本能力。 - -> [https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObject.html) -> [https://help.aliyun.com/document_detail/31980.html](https://help.aliyun.com/document_detail/31980.html) - - -### DeleteObject - -对象删除接口,用作文件删除,是oss最基本能力。对应接口的定义,请在上述的链接或者pb定义中查询。 - -### PutObjectTagging - -给对象添加标签,是oss最基本能力。对应接口的定义,请在上述的链接或者pb定义中查询。 - -### DeleteObjectTagging - -删除对象的标签,是oss最基本能力。对应接口的定义,请在上述的链接或者pb定义中查询。 - -### GetObjectTagging - -获取对象的标签,是oss最基本能力。对应接口的定义,请在上述的链接或者pb定义中查询。 - -### CopyObject - -复制已经存在的object,是oss最基本能力。对应接口的定义,请在上述的链接或者pb定义中查询。 - -### DeleteObjects - -删除多个object,是oss最基本能力。对应接口的定义,请在上述的链接或者pb定义中查询。 - -### ListObjects - -查询bucket下面的所有的objects,支持分页查询,是oss最基本能力。对应接口的定义,请在上述的链接或者pb定义中查询。 \ No newline at end of file From c99e4a6151363cc1108c059c385e7e94016cb520 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 18 Jul 2022 12:12:08 +0800 Subject: [PATCH 101/126] fix reference --- docs/zh/design/oss/oss-api-design.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/zh/design/oss/oss-api-design.md b/docs/zh/design/oss/oss-api-design.md index 5f0a27c674..a1772e65ce 100644 --- a/docs/zh/design/oss/oss-api-design.md +++ b/docs/zh/design/oss/oss-api-design.md @@ -72,10 +72,10 @@ client选择流程图如下所示: 1. 通用接口,即类似于PutObject、GetObject等所有的oss服务都支持的接口。 2. 非通用接口,即只有部分oss服务支持的接口。比如ListParts接口,aws就无法支持。 -该接口的设计主要参考aliyun和aws以及Minio的接口定义。 -> https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObject.html -> https://help.aliyun.com/document_detail/31980.html -> https://docs.min.io/docs/golang-client-api-reference.html +该接口的设计主要参考aliyun和aws以及minio的接口定义。 +> https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObject.html +> https://help.aliyun.com/document_detail/31980.html +> https://docs.min.io/docs/golang-client-api-reference.html ### InitClient @@ -133,14 +133,14 @@ factory.RegisterInitFunc("aws", AwsDefaultInitFunc) 对象上传接口,用作上传文件,是oss最基本能力。 -> [https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_PutObject.html) +> [https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_PutObject.html) > [https://help.aliyun.com/document_detail/31978.html](https://help.aliyun.com/document_detail/31978.html) ### GetObject 对象下载接口,用作文件下载,是oss最基本能力。 -> [https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObject.html) +> [https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObject.html) > [https://help.aliyun.com/document_detail/31980.html](https://help.aliyun.com/document_detail/31980.html) @@ -288,7 +288,7 @@ factory.RegisterInitFunc("aws", AwsDefaultInitFunc) 该接口在s3中没有明确的定义,用户可以通过HeadObject返回的http标准错误码是不是404来判断object是不是存在,这里单独抽象出来是为了让接口更加具有语义信息。 -> [http://biercoff.com/how-to-check-with-aws-cli-if-file-exists-in-s3/](http://biercoff.com/how-to-check-with-aws-cli-if-file-exists-in-s3/) +> [http://biercoff.com/how-to-check-with-aws-cli-if-file-exists-in-s3/](http://biercoff.com/how-to-check-with-aws-cli-if-file-exists-in-s3/) > [https://stackoverflow.com/questions/41871948/aws-s3-how-to-check-if-a-file-exists-in-a-bucket-using-bash](https://stackoverflow.com/questions/41871948/aws-s3-how-to-check-if-a-file-exists-in-a-bucket-using-bash) ### SignURL From 1310abdfc3fd2d2f008713014027ad45f6339c24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 18 Jul 2022 16:19:13 +0800 Subject: [PATCH 102/126] seperate interface type with blank --- spec/proto/extension/v1/oss.pb.go | 373 +++++++++++---------- spec/proto/extension/v1/oss.proto | 53 +-- spec/proto/extension/v1/oss_grpc.pb.go | 427 +++++++++++++------------ 3 files changed, 436 insertions(+), 417 deletions(-) diff --git a/spec/proto/extension/v1/oss.pb.go b/spec/proto/extension/v1/oss.pb.go index 1a5e9b482e..e5ba85c8a9 100644 --- a/spec/proto/extension/v1/oss.pb.go +++ b/spec/proto/extension/v1/oss.pb.go @@ -11,12 +11,11 @@ package s3 import ( - reflect "reflect" - sync "sync" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" + reflect "reflect" + sync "sync" ) const ( @@ -7556,173 +7555,173 @@ var file_oss_proto_rawDesc = []byte{ 0x65, 0x74, 0x65, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x75, 0x0a, - 0x10, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, - 0x67, 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, 0x50, 0x75, 0x74, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 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, 0x7e, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x31, 0x2e, 0x73, 0x70, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x63, 0x0a, + 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 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, 0x32, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 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, + 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x73, 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, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, + 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, + 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, + 0x0d, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 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, 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, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, - 0x69, 0x6e, 0x67, 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, 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, 0x63, 0x0a, 0x0a, 0x43, - 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x28, 0x2e, 0x73, 0x70, 0x65, 0x63, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, + 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x10, 0x50, + 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 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, 0x7e, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x43, 0x6f, - 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, - 0x12, 0x6c, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 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, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x66, - 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, + 0x2e, 0x76, 0x31, 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, 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, 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, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, + 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, + 0x67, 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, 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, 0x7b, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, + 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x1a, 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, 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, 0x7b, 0x0a, 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 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, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 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, 0x7b, 0x0a, 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, - 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 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, 0x6c, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x84, - 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, 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, 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, 0x34, 0x2e, + 0x74, 0x22, 0x00, 0x12, 0x84, 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, 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, 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, 0x65, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x61, 0x72, 0x74, 0x12, 0x28, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 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, 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, 0x65, 0x0a, 0x0a, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 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, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, + 0x01, 0x12, 0x6f, 0x0a, 0x0e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, + 0x6f, 0x70, 0x79, 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, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, - 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x0e, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2c, + 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x12, 0x8a, 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, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, - 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x8a, 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, 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, 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, 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, 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, 0x81, 0x01, 0x0a, 0x14, 0x41, - 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, - 0x6f, 0x61, 0x64, 0x12, 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, 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, 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, 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, 0x81, - 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 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, 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, 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, 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, 0x7b, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 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, - 0x63, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x45, 0x78, 0x69, 0x73, 0x74, 0x12, 0x2b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 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, 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, - 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x49, 0x73, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x07, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x12, 0x25, 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, + 0x81, 0x01, 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, + 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 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, 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, 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, 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, 0x81, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 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, 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, 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, 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, 0x60, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x50, + 0x61, 0x72, 0x74, 0x73, 0x12, 0x27, 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, 0x4c, + 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x53, - 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x74, - 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, 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, 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, 0x72, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x70, + 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, + 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x12, 0x4c, 0x69, 0x73, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x1a, 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, 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, 0x5a, 0x0a, 0x07, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, + 0x4c, 0x12, 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, 0x53, 0x69, 0x67, 0x6e, + 0x55, 0x52, 0x4c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x12, 0x74, 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, 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, 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, 0x6b, 0x0a, 0x0c, 0x41, 0x70, 0x70, 0x65, - 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x72, 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, 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, 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, 0x6b, 0x0a, 0x0c, + 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 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, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 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, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 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, 0x41, - 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x60, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, - 0x74, 0x73, 0x12, 0x27, 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, 0x4c, 0x69, 0x73, - 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x4f, + 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6c, 0x0a, 0x0d, 0x52, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 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, @@ -7865,56 +7864,56 @@ var file_oss_proto_depIdxs = []int32{ 3, // 36: spec.proto.extension.v1.ObjectStorageService.PutObject:input_type -> spec.proto.extension.v1.PutObjectInput 1, // 37: spec.proto.extension.v1.ObjectStorageService.GetObject:input_type -> spec.proto.extension.v1.GetObjectInput 5, // 38: spec.proto.extension.v1.ObjectStorageService.DeleteObject:input_type -> spec.proto.extension.v1.DeleteObjectInput - 7, // 39: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:input_type -> spec.proto.extension.v1.PutObjectTaggingInput - 9, // 40: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:input_type -> spec.proto.extension.v1.DeleteObjectTaggingInput - 11, // 41: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:input_type -> spec.proto.extension.v1.GetObjectTaggingInput - 14, // 42: spec.proto.extension.v1.ObjectStorageService.CopyObject:input_type -> spec.proto.extension.v1.CopyObjectInput - 19, // 43: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:input_type -> spec.proto.extension.v1.DeleteObjectsInput - 22, // 44: spec.proto.extension.v1.ObjectStorageService.ListObjects:input_type -> spec.proto.extension.v1.ListObjectsInput - 26, // 45: spec.proto.extension.v1.ObjectStorageService.GetObjectCannedAcl:input_type -> spec.proto.extension.v1.GetObjectCannedAclInput - 28, // 46: spec.proto.extension.v1.ObjectStorageService.PutObjectCannedAcl:input_type -> spec.proto.extension.v1.PutObjectCannedAclInput - 30, // 47: spec.proto.extension.v1.ObjectStorageService.RestoreObject:input_type -> spec.proto.extension.v1.RestoreObjectInput - 32, // 48: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:input_type -> spec.proto.extension.v1.CreateMultipartUploadInput - 34, // 49: spec.proto.extension.v1.ObjectStorageService.UploadPart:input_type -> spec.proto.extension.v1.UploadPartInput - 36, // 50: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:input_type -> spec.proto.extension.v1.UploadPartCopyInput - 41, // 51: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:input_type -> spec.proto.extension.v1.CompleteMultipartUploadInput - 43, // 52: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:input_type -> spec.proto.extension.v1.AbortMultipartUploadInput - 45, // 53: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:input_type -> spec.proto.extension.v1.ListMultipartUploadsInput - 49, // 54: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:input_type -> spec.proto.extension.v1.ListObjectVersionsInput - 53, // 55: spec.proto.extension.v1.ObjectStorageService.HeadObject:input_type -> spec.proto.extension.v1.HeadObjectInput - 55, // 56: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:input_type -> spec.proto.extension.v1.IsObjectExistInput + 14, // 39: spec.proto.extension.v1.ObjectStorageService.CopyObject:input_type -> spec.proto.extension.v1.CopyObjectInput + 19, // 40: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:input_type -> spec.proto.extension.v1.DeleteObjectsInput + 22, // 41: spec.proto.extension.v1.ObjectStorageService.ListObjects:input_type -> spec.proto.extension.v1.ListObjectsInput + 53, // 42: spec.proto.extension.v1.ObjectStorageService.HeadObject:input_type -> spec.proto.extension.v1.HeadObjectInput + 55, // 43: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:input_type -> spec.proto.extension.v1.IsObjectExistInput + 7, // 44: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:input_type -> spec.proto.extension.v1.PutObjectTaggingInput + 9, // 45: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:input_type -> spec.proto.extension.v1.DeleteObjectTaggingInput + 11, // 46: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:input_type -> spec.proto.extension.v1.GetObjectTaggingInput + 26, // 47: spec.proto.extension.v1.ObjectStorageService.GetObjectCannedAcl:input_type -> spec.proto.extension.v1.GetObjectCannedAclInput + 28, // 48: spec.proto.extension.v1.ObjectStorageService.PutObjectCannedAcl:input_type -> spec.proto.extension.v1.PutObjectCannedAclInput + 32, // 49: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:input_type -> spec.proto.extension.v1.CreateMultipartUploadInput + 34, // 50: spec.proto.extension.v1.ObjectStorageService.UploadPart:input_type -> spec.proto.extension.v1.UploadPartInput + 36, // 51: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:input_type -> spec.proto.extension.v1.UploadPartCopyInput + 41, // 52: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:input_type -> spec.proto.extension.v1.CompleteMultipartUploadInput + 43, // 53: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:input_type -> spec.proto.extension.v1.AbortMultipartUploadInput + 45, // 54: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:input_type -> spec.proto.extension.v1.ListMultipartUploadsInput + 62, // 55: spec.proto.extension.v1.ObjectStorageService.ListParts:input_type -> spec.proto.extension.v1.ListPartsInput + 49, // 56: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:input_type -> spec.proto.extension.v1.ListObjectVersionsInput 57, // 57: spec.proto.extension.v1.ObjectStorageService.SignURL:input_type -> spec.proto.extension.v1.SignURLInput 59, // 58: spec.proto.extension.v1.ObjectStorageService.UpdateDownloadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput 59, // 59: spec.proto.extension.v1.ObjectStorageService.UpdateUploadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput 60, // 60: spec.proto.extension.v1.ObjectStorageService.AppendObject:input_type -> spec.proto.extension.v1.AppendObjectInput - 62, // 61: spec.proto.extension.v1.ObjectStorageService.ListParts:input_type -> spec.proto.extension.v1.ListPartsInput + 30, // 61: spec.proto.extension.v1.ObjectStorageService.RestoreObject:input_type -> spec.proto.extension.v1.RestoreObjectInput 80, // 62: spec.proto.extension.v1.ObjectStorageService.InitClient:output_type -> google.protobuf.Empty 4, // 63: spec.proto.extension.v1.ObjectStorageService.PutObject:output_type -> spec.proto.extension.v1.PutObjectOutput 2, // 64: spec.proto.extension.v1.ObjectStorageService.GetObject:output_type -> spec.proto.extension.v1.GetObjectOutput 6, // 65: spec.proto.extension.v1.ObjectStorageService.DeleteObject:output_type -> spec.proto.extension.v1.DeleteObjectOutput - 8, // 66: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:output_type -> spec.proto.extension.v1.PutObjectTaggingOutput - 10, // 67: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:output_type -> spec.proto.extension.v1.DeleteObjectTaggingOutput - 12, // 68: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:output_type -> spec.proto.extension.v1.GetObjectTaggingOutput - 16, // 69: spec.proto.extension.v1.ObjectStorageService.CopyObject:output_type -> spec.proto.extension.v1.CopyObjectOutput - 21, // 70: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:output_type -> spec.proto.extension.v1.DeleteObjectsOutput - 23, // 71: spec.proto.extension.v1.ObjectStorageService.ListObjects:output_type -> spec.proto.extension.v1.ListObjectsOutput - 27, // 72: spec.proto.extension.v1.ObjectStorageService.GetObjectCannedAcl:output_type -> spec.proto.extension.v1.GetObjectCannedAclOutput - 29, // 73: spec.proto.extension.v1.ObjectStorageService.PutObjectCannedAcl:output_type -> spec.proto.extension.v1.PutObjectCannedAclOutput - 31, // 74: spec.proto.extension.v1.ObjectStorageService.RestoreObject:output_type -> spec.proto.extension.v1.RestoreObjectOutput - 33, // 75: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:output_type -> spec.proto.extension.v1.CreateMultipartUploadOutput - 35, // 76: spec.proto.extension.v1.ObjectStorageService.UploadPart:output_type -> spec.proto.extension.v1.UploadPartOutput - 38, // 77: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:output_type -> spec.proto.extension.v1.UploadPartCopyOutput - 42, // 78: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:output_type -> spec.proto.extension.v1.CompleteMultipartUploadOutput - 44, // 79: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:output_type -> spec.proto.extension.v1.AbortMultipartUploadOutput - 48, // 80: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:output_type -> spec.proto.extension.v1.ListMultipartUploadsOutput - 52, // 81: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:output_type -> spec.proto.extension.v1.ListObjectVersionsOutput - 54, // 82: spec.proto.extension.v1.ObjectStorageService.HeadObject:output_type -> spec.proto.extension.v1.HeadObjectOutput - 56, // 83: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:output_type -> spec.proto.extension.v1.IsObjectExistOutput + 16, // 66: spec.proto.extension.v1.ObjectStorageService.CopyObject:output_type -> spec.proto.extension.v1.CopyObjectOutput + 21, // 67: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:output_type -> spec.proto.extension.v1.DeleteObjectsOutput + 23, // 68: spec.proto.extension.v1.ObjectStorageService.ListObjects:output_type -> spec.proto.extension.v1.ListObjectsOutput + 54, // 69: spec.proto.extension.v1.ObjectStorageService.HeadObject:output_type -> spec.proto.extension.v1.HeadObjectOutput + 56, // 70: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:output_type -> spec.proto.extension.v1.IsObjectExistOutput + 8, // 71: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:output_type -> spec.proto.extension.v1.PutObjectTaggingOutput + 10, // 72: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:output_type -> spec.proto.extension.v1.DeleteObjectTaggingOutput + 12, // 73: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:output_type -> spec.proto.extension.v1.GetObjectTaggingOutput + 27, // 74: spec.proto.extension.v1.ObjectStorageService.GetObjectCannedAcl:output_type -> spec.proto.extension.v1.GetObjectCannedAclOutput + 29, // 75: spec.proto.extension.v1.ObjectStorageService.PutObjectCannedAcl:output_type -> spec.proto.extension.v1.PutObjectCannedAclOutput + 33, // 76: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:output_type -> spec.proto.extension.v1.CreateMultipartUploadOutput + 35, // 77: spec.proto.extension.v1.ObjectStorageService.UploadPart:output_type -> spec.proto.extension.v1.UploadPartOutput + 38, // 78: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:output_type -> spec.proto.extension.v1.UploadPartCopyOutput + 42, // 79: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:output_type -> spec.proto.extension.v1.CompleteMultipartUploadOutput + 44, // 80: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:output_type -> spec.proto.extension.v1.AbortMultipartUploadOutput + 48, // 81: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:output_type -> spec.proto.extension.v1.ListMultipartUploadsOutput + 64, // 82: spec.proto.extension.v1.ObjectStorageService.ListParts:output_type -> spec.proto.extension.v1.ListPartsOutput + 52, // 83: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:output_type -> spec.proto.extension.v1.ListObjectVersionsOutput 58, // 84: spec.proto.extension.v1.ObjectStorageService.SignURL:output_type -> spec.proto.extension.v1.SignURLOutput 80, // 85: spec.proto.extension.v1.ObjectStorageService.UpdateDownloadBandwidthRateLimit:output_type -> google.protobuf.Empty 80, // 86: spec.proto.extension.v1.ObjectStorageService.UpdateUploadBandwidthRateLimit:output_type -> google.protobuf.Empty 61, // 87: spec.proto.extension.v1.ObjectStorageService.AppendObject:output_type -> spec.proto.extension.v1.AppendObjectOutput - 64, // 88: spec.proto.extension.v1.ObjectStorageService.ListParts:output_type -> spec.proto.extension.v1.ListPartsOutput + 31, // 88: spec.proto.extension.v1.ObjectStorageService.RestoreObject:output_type -> spec.proto.extension.v1.RestoreObjectOutput 62, // [62:89] is the sub-list for method output_type 35, // [35:62] is the sub-list for method input_type 35, // [35:35] is the sub-list for extension type_name diff --git a/spec/proto/extension/v1/oss.proto b/spec/proto/extension/v1/oss.proto index 3c607bc305..8ffa7488e7 100644 --- a/spec/proto/extension/v1/oss.proto +++ b/spec/proto/extension/v1/oss.proto @@ -12,6 +12,8 @@ option go_package = "mosn.io/layotto/spec/proto/extension/v1;s3"; service ObjectStorageService{ //Init oss client rpc InitClient(InitInput) returns (google.protobuf.Empty){} + + //Object CRUD API //Adds an object to a bucket. //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html rpc PutObject(stream PutObjectInput) returns(PutObjectOutput){} @@ -21,15 +23,6 @@ service ObjectStorageService{ //Delete objects. //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html rpc DeleteObject(DeleteObjectInput) returns (DeleteObjectOutput){} - //Sets the supplied tag-set to an object that already exists in a bucket. - //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html - rpc PutObjectTagging(PutObjectTaggingInput) returns (PutObjectTaggingOutput){} - //Removes the entire tag set from the specified object. - //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html - rpc DeleteObjectTagging(DeleteObjectTaggingInput) returns(DeleteObjectTaggingOutput){} - //Returns the tag-set of an object. - //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObjectTagging.html - rpc GetObjectTagging(GetObjectTaggingInput) returns(GetObjectTaggingOutput){} //Creates a copy of an object that is already stored in oss server. //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CopyObject.html rpc CopyObject(CopyObjectInput) returns(CopyObjectOutput){} @@ -39,15 +32,32 @@ service ObjectStorageService{ //Returns some or all (up to 1,000) of the objects in a bucket. //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_ListObjects.html rpc ListObjects(ListObjectsInput) returns(ListObjectsOutput){} + //The HEAD action retrieves metadata from an object without returning the object itself. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html + rpc HeadObject(HeadObjectInput) returns(HeadObjectOutput){} + //This action used to check if the file exists. + rpc IsObjectExist(IsObjectExistInput) returns(IsObjectExistOutput){} + + //Object Label Operation API + //Sets the supplied tag-set to an object that already exists in a bucket. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html + rpc PutObjectTagging(PutObjectTaggingInput) returns (PutObjectTaggingOutput){} + //Removes the entire tag set from the specified object. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html + rpc DeleteObjectTagging(DeleteObjectTaggingInput) returns(DeleteObjectTaggingOutput){} + //Returns the tag-set of an object. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObjectTagging.html + rpc GetObjectTagging(GetObjectTaggingInput) returns(GetObjectTaggingOutput){} + + //Object ACL Operation API //Returns object canned acl. //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL rpc GetObjectCannedAcl(GetObjectCannedAclInput) returns(GetObjectCannedAclOutput){} //Set object canned acl. //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL rpc PutObjectCannedAcl(PutObjectCannedAclInput) returns(PutObjectCannedAclOutput){} - //Restores an archived copy of an object back. - //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_RestoreObject.html - rpc RestoreObject(RestoreObjectInput) returns(RestoreObjectOutput){} + + //Object Multipart Operation API //Initiates a multipart upload and returns an upload ID. //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CreateMultipartUpload.html rpc CreateMultipartUpload(CreateMultipartUploadInput) returns(CreateMultipartUploadOutput){} @@ -66,29 +76,32 @@ service ObjectStorageService{ //This action lists in-progress multipart uploads. //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html rpc ListMultipartUploads(ListMultipartUploadsInput) returns(ListMultipartUploadsOutput){} + //Lists the parts that have been uploaded for a specific multipart upload. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html + rpc ListParts(ListPartsInput) returns(ListPartsOutput){} + //Returns metadata about all versions of the objects in a bucket. //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html rpc ListObjectVersions(ListObjectVersionsInput) returns(ListObjectVersionsOutput){} - //The HEAD action retrieves metadata from an object without returning the object itself. - //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html - rpc HeadObject(HeadObjectInput) returns(HeadObjectOutput){} - //This action used to check if the file exists. - rpc IsObjectExist(IsObjectExistInput) returns(IsObjectExistOutput){} + //A presigned URL gives you access to the object identified in the URL, provided that the creator of the presigned URL has permissions to access that object. //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html rpc SignURL(SignURLInput) returns(SignURLOutput){} + //This action used to set download bandwidth limit speed. //Refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2106 rpc UpdateDownloadBandwidthRateLimit(UpdateBandwidthRateLimitInput) returns(google.protobuf.Empty){} //This action used to set upload bandwidth limit speed. //Refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2096 rpc UpdateUploadBandwidthRateLimit(UpdateBandwidthRateLimitInput) returns(google.protobuf.Empty){} + //This action used to append object. //Refer https://help.aliyun.com/document_detail/31981.html or https://github.com/minio/minio-java/issues/980 rpc AppendObject(stream AppendObjectInput) returns(AppendObjectOutput){} - //Lists the parts that have been uploaded for a specific multipart upload. - //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html - rpc ListParts(ListPartsInput) returns(ListPartsOutput){} + + //Restores an archived copy of an object back. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_RestoreObject.html + rpc RestoreObject(RestoreObjectInput) returns(RestoreObjectOutput){} } message InitInput { diff --git a/spec/proto/extension/v1/oss_grpc.pb.go b/spec/proto/extension/v1/oss_grpc.pb.go index 139eecf013..e320f58ce9 100644 --- a/spec/proto/extension/v1/oss_grpc.pb.go +++ b/spec/proto/extension/v1/oss_grpc.pb.go @@ -8,7 +8,6 @@ package s3 import ( context "context" - grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -26,6 +25,7 @@ const _ = grpc.SupportPackageIsVersion7 type ObjectStorageServiceClient interface { //Init oss client InitClient(ctx context.Context, in *InitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) + //Object CRUD API //Adds an object to a bucket. //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html PutObject(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_PutObjectClient, error) @@ -35,15 +35,6 @@ type ObjectStorageServiceClient interface { //Delete objects. //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html DeleteObject(ctx context.Context, in *DeleteObjectInput, opts ...grpc.CallOption) (*DeleteObjectOutput, error) - //Sets the supplied tag-set to an object that already exists in a bucket. - //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html - PutObjectTagging(ctx context.Context, in *PutObjectTaggingInput, opts ...grpc.CallOption) (*PutObjectTaggingOutput, error) - //Removes the entire tag set from the specified object. - //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html - DeleteObjectTagging(ctx context.Context, in *DeleteObjectTaggingInput, opts ...grpc.CallOption) (*DeleteObjectTaggingOutput, error) - //Returns the tag-set of an object. - //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObjectTagging.html - GetObjectTagging(ctx context.Context, in *GetObjectTaggingInput, opts ...grpc.CallOption) (*GetObjectTaggingOutput, error) //Creates a copy of an object that is already stored in oss server. //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CopyObject.html CopyObject(ctx context.Context, in *CopyObjectInput, opts ...grpc.CallOption) (*CopyObjectOutput, error) @@ -53,15 +44,29 @@ type ObjectStorageServiceClient interface { //Returns some or all (up to 1,000) of the objects in a bucket. //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_ListObjects.html ListObjects(ctx context.Context, in *ListObjectsInput, opts ...grpc.CallOption) (*ListObjectsOutput, error) + //The HEAD action retrieves metadata from an object without returning the object itself. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html + HeadObject(ctx context.Context, in *HeadObjectInput, opts ...grpc.CallOption) (*HeadObjectOutput, error) + //This action used to check if the file exists. + IsObjectExist(ctx context.Context, in *IsObjectExistInput, opts ...grpc.CallOption) (*IsObjectExistOutput, error) + //Object Label Operation API + //Sets the supplied tag-set to an object that already exists in a bucket. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html + PutObjectTagging(ctx context.Context, in *PutObjectTaggingInput, opts ...grpc.CallOption) (*PutObjectTaggingOutput, error) + //Removes the entire tag set from the specified object. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html + DeleteObjectTagging(ctx context.Context, in *DeleteObjectTaggingInput, opts ...grpc.CallOption) (*DeleteObjectTaggingOutput, error) + //Returns the tag-set of an object. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObjectTagging.html + GetObjectTagging(ctx context.Context, in *GetObjectTaggingInput, opts ...grpc.CallOption) (*GetObjectTaggingOutput, error) + //Object ACL Operation API //Returns object canned acl. //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL GetObjectCannedAcl(ctx context.Context, in *GetObjectCannedAclInput, opts ...grpc.CallOption) (*GetObjectCannedAclOutput, error) //Set object canned acl. //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL PutObjectCannedAcl(ctx context.Context, in *PutObjectCannedAclInput, opts ...grpc.CallOption) (*PutObjectCannedAclOutput, error) - //Restores an archived copy of an object back. - //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_RestoreObject.html - RestoreObject(ctx context.Context, in *RestoreObjectInput, opts ...grpc.CallOption) (*RestoreObjectOutput, error) + //Object Multipart Operation API //Initiates a multipart upload and returns an upload ID. //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CreateMultipartUpload.html CreateMultipartUpload(ctx context.Context, in *CreateMultipartUploadInput, opts ...grpc.CallOption) (*CreateMultipartUploadOutput, error) @@ -80,14 +85,12 @@ type ObjectStorageServiceClient interface { //This action lists in-progress multipart uploads. //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html ListMultipartUploads(ctx context.Context, in *ListMultipartUploadsInput, opts ...grpc.CallOption) (*ListMultipartUploadsOutput, error) + //Lists the parts that have been uploaded for a specific multipart upload. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html + ListParts(ctx context.Context, in *ListPartsInput, opts ...grpc.CallOption) (*ListPartsOutput, error) //Returns metadata about all versions of the objects in a bucket. //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html ListObjectVersions(ctx context.Context, in *ListObjectVersionsInput, opts ...grpc.CallOption) (*ListObjectVersionsOutput, error) - //The HEAD action retrieves metadata from an object without returning the object itself. - //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html - HeadObject(ctx context.Context, in *HeadObjectInput, opts ...grpc.CallOption) (*HeadObjectOutput, error) - //This action used to check if the file exists. - IsObjectExist(ctx context.Context, in *IsObjectExistInput, opts ...grpc.CallOption) (*IsObjectExistOutput, error) //A presigned URL gives you access to the object identified in the URL, provided that the creator of the presigned URL has permissions to access that object. //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html SignURL(ctx context.Context, in *SignURLInput, opts ...grpc.CallOption) (*SignURLOutput, error) @@ -100,9 +103,9 @@ type ObjectStorageServiceClient interface { //This action used to append object. //Refer https://help.aliyun.com/document_detail/31981.html or https://github.com/minio/minio-java/issues/980 AppendObject(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_AppendObjectClient, error) - //Lists the parts that have been uploaded for a specific multipart upload. - //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html - ListParts(ctx context.Context, in *ListPartsInput, opts ...grpc.CallOption) (*ListPartsOutput, error) + //Restores an archived copy of an object back. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_RestoreObject.html + RestoreObject(ctx context.Context, in *RestoreObjectInput, opts ...grpc.CallOption) (*RestoreObjectOutput, error) } type objectStorageServiceClient struct { @@ -197,81 +200,90 @@ func (c *objectStorageServiceClient) DeleteObject(ctx context.Context, in *Delet return out, nil } -func (c *objectStorageServiceClient) PutObjectTagging(ctx context.Context, in *PutObjectTaggingInput, opts ...grpc.CallOption) (*PutObjectTaggingOutput, error) { - out := new(PutObjectTaggingOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/PutObjectTagging", in, out, opts...) +func (c *objectStorageServiceClient) CopyObject(ctx context.Context, in *CopyObjectInput, opts ...grpc.CallOption) (*CopyObjectOutput, error) { + out := new(CopyObjectOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/CopyObject", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *objectStorageServiceClient) DeleteObjectTagging(ctx context.Context, in *DeleteObjectTaggingInput, opts ...grpc.CallOption) (*DeleteObjectTaggingOutput, error) { - out := new(DeleteObjectTaggingOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/DeleteObjectTagging", in, out, opts...) +func (c *objectStorageServiceClient) DeleteObjects(ctx context.Context, in *DeleteObjectsInput, opts ...grpc.CallOption) (*DeleteObjectsOutput, error) { + out := new(DeleteObjectsOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/DeleteObjects", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *objectStorageServiceClient) GetObjectTagging(ctx context.Context, in *GetObjectTaggingInput, opts ...grpc.CallOption) (*GetObjectTaggingOutput, error) { - out := new(GetObjectTaggingOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/GetObjectTagging", in, out, opts...) +func (c *objectStorageServiceClient) ListObjects(ctx context.Context, in *ListObjectsInput, opts ...grpc.CallOption) (*ListObjectsOutput, error) { + out := new(ListObjectsOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/ListObjects", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *objectStorageServiceClient) CopyObject(ctx context.Context, in *CopyObjectInput, opts ...grpc.CallOption) (*CopyObjectOutput, error) { - out := new(CopyObjectOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/CopyObject", in, out, opts...) +func (c *objectStorageServiceClient) HeadObject(ctx context.Context, in *HeadObjectInput, opts ...grpc.CallOption) (*HeadObjectOutput, error) { + out := new(HeadObjectOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/HeadObject", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *objectStorageServiceClient) DeleteObjects(ctx context.Context, in *DeleteObjectsInput, opts ...grpc.CallOption) (*DeleteObjectsOutput, error) { - out := new(DeleteObjectsOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/DeleteObjects", in, out, opts...) +func (c *objectStorageServiceClient) IsObjectExist(ctx context.Context, in *IsObjectExistInput, opts ...grpc.CallOption) (*IsObjectExistOutput, error) { + out := new(IsObjectExistOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/IsObjectExist", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *objectStorageServiceClient) ListObjects(ctx context.Context, in *ListObjectsInput, opts ...grpc.CallOption) (*ListObjectsOutput, error) { - out := new(ListObjectsOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/ListObjects", in, out, opts...) +func (c *objectStorageServiceClient) PutObjectTagging(ctx context.Context, in *PutObjectTaggingInput, opts ...grpc.CallOption) (*PutObjectTaggingOutput, error) { + out := new(PutObjectTaggingOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/PutObjectTagging", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *objectStorageServiceClient) GetObjectCannedAcl(ctx context.Context, in *GetObjectCannedAclInput, opts ...grpc.CallOption) (*GetObjectCannedAclOutput, error) { - out := new(GetObjectCannedAclOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/GetObjectCannedAcl", in, out, opts...) +func (c *objectStorageServiceClient) DeleteObjectTagging(ctx context.Context, in *DeleteObjectTaggingInput, opts ...grpc.CallOption) (*DeleteObjectTaggingOutput, error) { + out := new(DeleteObjectTaggingOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/DeleteObjectTagging", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *objectStorageServiceClient) PutObjectCannedAcl(ctx context.Context, in *PutObjectCannedAclInput, opts ...grpc.CallOption) (*PutObjectCannedAclOutput, error) { - out := new(PutObjectCannedAclOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/PutObjectCannedAcl", in, out, opts...) +func (c *objectStorageServiceClient) GetObjectTagging(ctx context.Context, in *GetObjectTaggingInput, opts ...grpc.CallOption) (*GetObjectTaggingOutput, error) { + out := new(GetObjectTaggingOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/GetObjectTagging", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *objectStorageServiceClient) RestoreObject(ctx context.Context, in *RestoreObjectInput, opts ...grpc.CallOption) (*RestoreObjectOutput, error) { - out := new(RestoreObjectOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/RestoreObject", in, out, opts...) +func (c *objectStorageServiceClient) GetObjectCannedAcl(ctx context.Context, in *GetObjectCannedAclInput, opts ...grpc.CallOption) (*GetObjectCannedAclOutput, error) { + out := new(GetObjectCannedAclOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/GetObjectCannedAcl", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *objectStorageServiceClient) PutObjectCannedAcl(ctx context.Context, in *PutObjectCannedAclInput, opts ...grpc.CallOption) (*PutObjectCannedAclOutput, error) { + out := new(PutObjectCannedAclOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/PutObjectCannedAcl", in, out, opts...) if err != nil { return nil, err } @@ -357,27 +369,18 @@ func (c *objectStorageServiceClient) ListMultipartUploads(ctx context.Context, i return out, nil } -func (c *objectStorageServiceClient) ListObjectVersions(ctx context.Context, in *ListObjectVersionsInput, opts ...grpc.CallOption) (*ListObjectVersionsOutput, error) { - out := new(ListObjectVersionsOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/ListObjectVersions", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *objectStorageServiceClient) HeadObject(ctx context.Context, in *HeadObjectInput, opts ...grpc.CallOption) (*HeadObjectOutput, error) { - out := new(HeadObjectOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/HeadObject", in, out, opts...) +func (c *objectStorageServiceClient) ListParts(ctx context.Context, in *ListPartsInput, opts ...grpc.CallOption) (*ListPartsOutput, error) { + out := new(ListPartsOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/ListParts", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *objectStorageServiceClient) IsObjectExist(ctx context.Context, in *IsObjectExistInput, opts ...grpc.CallOption) (*IsObjectExistOutput, error) { - out := new(IsObjectExistOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/IsObjectExist", in, out, opts...) +func (c *objectStorageServiceClient) ListObjectVersions(ctx context.Context, in *ListObjectVersionsInput, opts ...grpc.CallOption) (*ListObjectVersionsOutput, error) { + out := new(ListObjectVersionsOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/ListObjectVersions", in, out, opts...) if err != nil { return nil, err } @@ -445,9 +448,9 @@ func (x *objectStorageServiceAppendObjectClient) CloseAndRecv() (*AppendObjectOu return m, nil } -func (c *objectStorageServiceClient) ListParts(ctx context.Context, in *ListPartsInput, opts ...grpc.CallOption) (*ListPartsOutput, error) { - out := new(ListPartsOutput) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/ListParts", in, out, opts...) +func (c *objectStorageServiceClient) RestoreObject(ctx context.Context, in *RestoreObjectInput, opts ...grpc.CallOption) (*RestoreObjectOutput, error) { + out := new(RestoreObjectOutput) + err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/RestoreObject", in, out, opts...) if err != nil { return nil, err } @@ -460,6 +463,7 @@ func (c *objectStorageServiceClient) ListParts(ctx context.Context, in *ListPart type ObjectStorageServiceServer interface { //Init oss client InitClient(context.Context, *InitInput) (*emptypb.Empty, error) + //Object CRUD API //Adds an object to a bucket. //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html PutObject(ObjectStorageService_PutObjectServer) error @@ -469,15 +473,6 @@ type ObjectStorageServiceServer interface { //Delete objects. //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html DeleteObject(context.Context, *DeleteObjectInput) (*DeleteObjectOutput, error) - //Sets the supplied tag-set to an object that already exists in a bucket. - //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html - PutObjectTagging(context.Context, *PutObjectTaggingInput) (*PutObjectTaggingOutput, error) - //Removes the entire tag set from the specified object. - //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html - DeleteObjectTagging(context.Context, *DeleteObjectTaggingInput) (*DeleteObjectTaggingOutput, error) - //Returns the tag-set of an object. - //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObjectTagging.html - GetObjectTagging(context.Context, *GetObjectTaggingInput) (*GetObjectTaggingOutput, error) //Creates a copy of an object that is already stored in oss server. //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CopyObject.html CopyObject(context.Context, *CopyObjectInput) (*CopyObjectOutput, error) @@ -487,15 +482,29 @@ type ObjectStorageServiceServer interface { //Returns some or all (up to 1,000) of the objects in a bucket. //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_ListObjects.html ListObjects(context.Context, *ListObjectsInput) (*ListObjectsOutput, error) + //The HEAD action retrieves metadata from an object without returning the object itself. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html + HeadObject(context.Context, *HeadObjectInput) (*HeadObjectOutput, error) + //This action used to check if the file exists. + IsObjectExist(context.Context, *IsObjectExistInput) (*IsObjectExistOutput, error) + //Object Label Operation API + //Sets the supplied tag-set to an object that already exists in a bucket. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html + PutObjectTagging(context.Context, *PutObjectTaggingInput) (*PutObjectTaggingOutput, error) + //Removes the entire tag set from the specified object. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html + DeleteObjectTagging(context.Context, *DeleteObjectTaggingInput) (*DeleteObjectTaggingOutput, error) + //Returns the tag-set of an object. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObjectTagging.html + GetObjectTagging(context.Context, *GetObjectTaggingInput) (*GetObjectTaggingOutput, error) + //Object ACL Operation API //Returns object canned acl. //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL GetObjectCannedAcl(context.Context, *GetObjectCannedAclInput) (*GetObjectCannedAclOutput, error) //Set object canned acl. //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL PutObjectCannedAcl(context.Context, *PutObjectCannedAclInput) (*PutObjectCannedAclOutput, error) - //Restores an archived copy of an object back. - //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_RestoreObject.html - RestoreObject(context.Context, *RestoreObjectInput) (*RestoreObjectOutput, error) + //Object Multipart Operation API //Initiates a multipart upload and returns an upload ID. //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CreateMultipartUpload.html CreateMultipartUpload(context.Context, *CreateMultipartUploadInput) (*CreateMultipartUploadOutput, error) @@ -514,14 +523,12 @@ type ObjectStorageServiceServer interface { //This action lists in-progress multipart uploads. //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html ListMultipartUploads(context.Context, *ListMultipartUploadsInput) (*ListMultipartUploadsOutput, error) + //Lists the parts that have been uploaded for a specific multipart upload. + //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html + ListParts(context.Context, *ListPartsInput) (*ListPartsOutput, error) //Returns metadata about all versions of the objects in a bucket. //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html ListObjectVersions(context.Context, *ListObjectVersionsInput) (*ListObjectVersionsOutput, error) - //The HEAD action retrieves metadata from an object without returning the object itself. - //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html - HeadObject(context.Context, *HeadObjectInput) (*HeadObjectOutput, error) - //This action used to check if the file exists. - IsObjectExist(context.Context, *IsObjectExistInput) (*IsObjectExistOutput, error) //A presigned URL gives you access to the object identified in the URL, provided that the creator of the presigned URL has permissions to access that object. //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html SignURL(context.Context, *SignURLInput) (*SignURLOutput, error) @@ -534,9 +541,9 @@ type ObjectStorageServiceServer interface { //This action used to append object. //Refer https://help.aliyun.com/document_detail/31981.html or https://github.com/minio/minio-java/issues/980 AppendObject(ObjectStorageService_AppendObjectServer) error - //Lists the parts that have been uploaded for a specific multipart upload. - //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html - ListParts(context.Context, *ListPartsInput) (*ListPartsOutput, error) + //Restores an archived copy of an object back. + //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_RestoreObject.html + RestoreObject(context.Context, *RestoreObjectInput) (*RestoreObjectOutput, error) } // UnimplementedObjectStorageServiceServer should be embedded to have forward compatible implementations. @@ -555,15 +562,6 @@ func (UnimplementedObjectStorageServiceServer) GetObject(*GetObjectInput, Object func (UnimplementedObjectStorageServiceServer) DeleteObject(context.Context, *DeleteObjectInput) (*DeleteObjectOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteObject not implemented") } -func (UnimplementedObjectStorageServiceServer) PutObjectTagging(context.Context, *PutObjectTaggingInput) (*PutObjectTaggingOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method PutObjectTagging not implemented") -} -func (UnimplementedObjectStorageServiceServer) DeleteObjectTagging(context.Context, *DeleteObjectTaggingInput) (*DeleteObjectTaggingOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteObjectTagging not implemented") -} -func (UnimplementedObjectStorageServiceServer) GetObjectTagging(context.Context, *GetObjectTaggingInput) (*GetObjectTaggingOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetObjectTagging not implemented") -} func (UnimplementedObjectStorageServiceServer) CopyObject(context.Context, *CopyObjectInput) (*CopyObjectOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method CopyObject not implemented") } @@ -573,15 +571,27 @@ func (UnimplementedObjectStorageServiceServer) DeleteObjects(context.Context, *D func (UnimplementedObjectStorageServiceServer) ListObjects(context.Context, *ListObjectsInput) (*ListObjectsOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method ListObjects not implemented") } +func (UnimplementedObjectStorageServiceServer) HeadObject(context.Context, *HeadObjectInput) (*HeadObjectOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method HeadObject not implemented") +} +func (UnimplementedObjectStorageServiceServer) IsObjectExist(context.Context, *IsObjectExistInput) (*IsObjectExistOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method IsObjectExist not implemented") +} +func (UnimplementedObjectStorageServiceServer) PutObjectTagging(context.Context, *PutObjectTaggingInput) (*PutObjectTaggingOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method PutObjectTagging not implemented") +} +func (UnimplementedObjectStorageServiceServer) DeleteObjectTagging(context.Context, *DeleteObjectTaggingInput) (*DeleteObjectTaggingOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteObjectTagging not implemented") +} +func (UnimplementedObjectStorageServiceServer) GetObjectTagging(context.Context, *GetObjectTaggingInput) (*GetObjectTaggingOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetObjectTagging not implemented") +} func (UnimplementedObjectStorageServiceServer) GetObjectCannedAcl(context.Context, *GetObjectCannedAclInput) (*GetObjectCannedAclOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method GetObjectCannedAcl not implemented") } func (UnimplementedObjectStorageServiceServer) PutObjectCannedAcl(context.Context, *PutObjectCannedAclInput) (*PutObjectCannedAclOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method PutObjectCannedAcl not implemented") } -func (UnimplementedObjectStorageServiceServer) RestoreObject(context.Context, *RestoreObjectInput) (*RestoreObjectOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method RestoreObject not implemented") -} func (UnimplementedObjectStorageServiceServer) CreateMultipartUpload(context.Context, *CreateMultipartUploadInput) (*CreateMultipartUploadOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateMultipartUpload not implemented") } @@ -600,15 +610,12 @@ func (UnimplementedObjectStorageServiceServer) AbortMultipartUpload(context.Cont func (UnimplementedObjectStorageServiceServer) ListMultipartUploads(context.Context, *ListMultipartUploadsInput) (*ListMultipartUploadsOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method ListMultipartUploads not implemented") } +func (UnimplementedObjectStorageServiceServer) ListParts(context.Context, *ListPartsInput) (*ListPartsOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListParts not implemented") +} func (UnimplementedObjectStorageServiceServer) ListObjectVersions(context.Context, *ListObjectVersionsInput) (*ListObjectVersionsOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method ListObjectVersions not implemented") } -func (UnimplementedObjectStorageServiceServer) HeadObject(context.Context, *HeadObjectInput) (*HeadObjectOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method HeadObject not implemented") -} -func (UnimplementedObjectStorageServiceServer) IsObjectExist(context.Context, *IsObjectExistInput) (*IsObjectExistOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method IsObjectExist not implemented") -} func (UnimplementedObjectStorageServiceServer) SignURL(context.Context, *SignURLInput) (*SignURLOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method SignURL not implemented") } @@ -621,8 +628,8 @@ func (UnimplementedObjectStorageServiceServer) UpdateUploadBandwidthRateLimit(co func (UnimplementedObjectStorageServiceServer) AppendObject(ObjectStorageService_AppendObjectServer) error { return status.Errorf(codes.Unimplemented, "method AppendObject not implemented") } -func (UnimplementedObjectStorageServiceServer) ListParts(context.Context, *ListPartsInput) (*ListPartsOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListParts not implemented") +func (UnimplementedObjectStorageServiceServer) RestoreObject(context.Context, *RestoreObjectInput) (*RestoreObjectOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method RestoreObject not implemented") } // UnsafeObjectStorageServiceServer may be embedded to opt out of forward compatibility for this service. @@ -719,164 +726,182 @@ func _ObjectStorageService_DeleteObject_Handler(srv interface{}, ctx context.Con return interceptor(ctx, in, info, handler) } -func _ObjectStorageService_PutObjectTagging_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PutObjectTaggingInput) +func _ObjectStorageService_CopyObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CopyObjectInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ObjectStorageServiceServer).PutObjectTagging(ctx, in) + return srv.(ObjectStorageServiceServer).CopyObject(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/PutObjectTagging", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/CopyObject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).PutObjectTagging(ctx, req.(*PutObjectTaggingInput)) + return srv.(ObjectStorageServiceServer).CopyObject(ctx, req.(*CopyObjectInput)) } return interceptor(ctx, in, info, handler) } -func _ObjectStorageService_DeleteObjectTagging_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteObjectTaggingInput) +func _ObjectStorageService_DeleteObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteObjectsInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ObjectStorageServiceServer).DeleteObjectTagging(ctx, in) + return srv.(ObjectStorageServiceServer).DeleteObjects(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/DeleteObjectTagging", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/DeleteObjects", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).DeleteObjectTagging(ctx, req.(*DeleteObjectTaggingInput)) + return srv.(ObjectStorageServiceServer).DeleteObjects(ctx, req.(*DeleteObjectsInput)) } return interceptor(ctx, in, info, handler) } -func _ObjectStorageService_GetObjectTagging_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetObjectTaggingInput) +func _ObjectStorageService_ListObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListObjectsInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ObjectStorageServiceServer).GetObjectTagging(ctx, in) + return srv.(ObjectStorageServiceServer).ListObjects(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/GetObjectTagging", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/ListObjects", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).GetObjectTagging(ctx, req.(*GetObjectTaggingInput)) + return srv.(ObjectStorageServiceServer).ListObjects(ctx, req.(*ListObjectsInput)) } return interceptor(ctx, in, info, handler) } -func _ObjectStorageService_CopyObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CopyObjectInput) +func _ObjectStorageService_HeadObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(HeadObjectInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ObjectStorageServiceServer).CopyObject(ctx, in) + return srv.(ObjectStorageServiceServer).HeadObject(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/CopyObject", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/HeadObject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).CopyObject(ctx, req.(*CopyObjectInput)) + return srv.(ObjectStorageServiceServer).HeadObject(ctx, req.(*HeadObjectInput)) } return interceptor(ctx, in, info, handler) } -func _ObjectStorageService_DeleteObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteObjectsInput) +func _ObjectStorageService_IsObjectExist_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(IsObjectExistInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ObjectStorageServiceServer).DeleteObjects(ctx, in) + return srv.(ObjectStorageServiceServer).IsObjectExist(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/DeleteObjects", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/IsObjectExist", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).DeleteObjects(ctx, req.(*DeleteObjectsInput)) + return srv.(ObjectStorageServiceServer).IsObjectExist(ctx, req.(*IsObjectExistInput)) } return interceptor(ctx, in, info, handler) } -func _ObjectStorageService_ListObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListObjectsInput) +func _ObjectStorageService_PutObjectTagging_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PutObjectTaggingInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ObjectStorageServiceServer).ListObjects(ctx, in) + return srv.(ObjectStorageServiceServer).PutObjectTagging(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/ListObjects", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/PutObjectTagging", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).ListObjects(ctx, req.(*ListObjectsInput)) + return srv.(ObjectStorageServiceServer).PutObjectTagging(ctx, req.(*PutObjectTaggingInput)) } return interceptor(ctx, in, info, handler) } -func _ObjectStorageService_GetObjectCannedAcl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetObjectCannedAclInput) +func _ObjectStorageService_DeleteObjectTagging_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteObjectTaggingInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ObjectStorageServiceServer).GetObjectCannedAcl(ctx, in) + return srv.(ObjectStorageServiceServer).DeleteObjectTagging(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/GetObjectCannedAcl", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/DeleteObjectTagging", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).GetObjectCannedAcl(ctx, req.(*GetObjectCannedAclInput)) + return srv.(ObjectStorageServiceServer).DeleteObjectTagging(ctx, req.(*DeleteObjectTaggingInput)) } return interceptor(ctx, in, info, handler) } -func _ObjectStorageService_PutObjectCannedAcl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PutObjectCannedAclInput) +func _ObjectStorageService_GetObjectTagging_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetObjectTaggingInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ObjectStorageServiceServer).PutObjectCannedAcl(ctx, in) + return srv.(ObjectStorageServiceServer).GetObjectTagging(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/PutObjectCannedAcl", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/GetObjectTagging", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).PutObjectCannedAcl(ctx, req.(*PutObjectCannedAclInput)) + return srv.(ObjectStorageServiceServer).GetObjectTagging(ctx, req.(*GetObjectTaggingInput)) } return interceptor(ctx, in, info, handler) } -func _ObjectStorageService_RestoreObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RestoreObjectInput) +func _ObjectStorageService_GetObjectCannedAcl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetObjectCannedAclInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ObjectStorageServiceServer).RestoreObject(ctx, in) + return srv.(ObjectStorageServiceServer).GetObjectCannedAcl(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/RestoreObject", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/GetObjectCannedAcl", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).RestoreObject(ctx, req.(*RestoreObjectInput)) + return srv.(ObjectStorageServiceServer).GetObjectCannedAcl(ctx, req.(*GetObjectCannedAclInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _ObjectStorageService_PutObjectCannedAcl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PutObjectCannedAclInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectStorageServiceServer).PutObjectCannedAcl(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/PutObjectCannedAcl", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectStorageServiceServer).PutObjectCannedAcl(ctx, req.(*PutObjectCannedAclInput)) } return interceptor(ctx, in, info, handler) } @@ -997,56 +1022,38 @@ func _ObjectStorageService_ListMultipartUploads_Handler(srv interface{}, ctx con return interceptor(ctx, in, info, handler) } -func _ObjectStorageService_ListObjectVersions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListObjectVersionsInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).ListObjectVersions(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/ListObjectVersions", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).ListObjectVersions(ctx, req.(*ListObjectVersionsInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _ObjectStorageService_HeadObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(HeadObjectInput) +func _ObjectStorageService_ListParts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListPartsInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ObjectStorageServiceServer).HeadObject(ctx, in) + return srv.(ObjectStorageServiceServer).ListParts(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/HeadObject", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/ListParts", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).HeadObject(ctx, req.(*HeadObjectInput)) + return srv.(ObjectStorageServiceServer).ListParts(ctx, req.(*ListPartsInput)) } return interceptor(ctx, in, info, handler) } -func _ObjectStorageService_IsObjectExist_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(IsObjectExistInput) +func _ObjectStorageService_ListObjectVersions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListObjectVersionsInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ObjectStorageServiceServer).IsObjectExist(ctx, in) + return srv.(ObjectStorageServiceServer).ListObjectVersions(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/IsObjectExist", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/ListObjectVersions", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).IsObjectExist(ctx, req.(*IsObjectExistInput)) + return srv.(ObjectStorageServiceServer).ListObjectVersions(ctx, req.(*ListObjectVersionsInput)) } return interceptor(ctx, in, info, handler) } @@ -1131,20 +1138,20 @@ func (x *objectStorageServiceAppendObjectServer) Recv() (*AppendObjectInput, err return m, nil } -func _ObjectStorageService_ListParts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListPartsInput) +func _ObjectStorageService_RestoreObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RestoreObjectInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ObjectStorageServiceServer).ListParts(ctx, in) + return srv.(ObjectStorageServiceServer).RestoreObject(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/ListParts", + FullMethod: "/spec.proto.extension.v1.ObjectStorageService/RestoreObject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).ListParts(ctx, req.(*ListPartsInput)) + return srv.(ObjectStorageServiceServer).RestoreObject(ctx, req.(*RestoreObjectInput)) } return interceptor(ctx, in, info, handler) } @@ -1164,18 +1171,6 @@ var ObjectStorageService_ServiceDesc = grpc.ServiceDesc{ MethodName: "DeleteObject", Handler: _ObjectStorageService_DeleteObject_Handler, }, - { - MethodName: "PutObjectTagging", - Handler: _ObjectStorageService_PutObjectTagging_Handler, - }, - { - MethodName: "DeleteObjectTagging", - Handler: _ObjectStorageService_DeleteObjectTagging_Handler, - }, - { - MethodName: "GetObjectTagging", - Handler: _ObjectStorageService_GetObjectTagging_Handler, - }, { MethodName: "CopyObject", Handler: _ObjectStorageService_CopyObject_Handler, @@ -1188,6 +1183,26 @@ var ObjectStorageService_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListObjects", Handler: _ObjectStorageService_ListObjects_Handler, }, + { + MethodName: "HeadObject", + Handler: _ObjectStorageService_HeadObject_Handler, + }, + { + MethodName: "IsObjectExist", + Handler: _ObjectStorageService_IsObjectExist_Handler, + }, + { + MethodName: "PutObjectTagging", + Handler: _ObjectStorageService_PutObjectTagging_Handler, + }, + { + MethodName: "DeleteObjectTagging", + Handler: _ObjectStorageService_DeleteObjectTagging_Handler, + }, + { + MethodName: "GetObjectTagging", + Handler: _ObjectStorageService_GetObjectTagging_Handler, + }, { MethodName: "GetObjectCannedAcl", Handler: _ObjectStorageService_GetObjectCannedAcl_Handler, @@ -1196,10 +1211,6 @@ var ObjectStorageService_ServiceDesc = grpc.ServiceDesc{ MethodName: "PutObjectCannedAcl", Handler: _ObjectStorageService_PutObjectCannedAcl_Handler, }, - { - MethodName: "RestoreObject", - Handler: _ObjectStorageService_RestoreObject_Handler, - }, { MethodName: "CreateMultipartUpload", Handler: _ObjectStorageService_CreateMultipartUpload_Handler, @@ -1221,16 +1232,12 @@ var ObjectStorageService_ServiceDesc = grpc.ServiceDesc{ Handler: _ObjectStorageService_ListMultipartUploads_Handler, }, { - MethodName: "ListObjectVersions", - Handler: _ObjectStorageService_ListObjectVersions_Handler, - }, - { - MethodName: "HeadObject", - Handler: _ObjectStorageService_HeadObject_Handler, + MethodName: "ListParts", + Handler: _ObjectStorageService_ListParts_Handler, }, { - MethodName: "IsObjectExist", - Handler: _ObjectStorageService_IsObjectExist_Handler, + MethodName: "ListObjectVersions", + Handler: _ObjectStorageService_ListObjectVersions_Handler, }, { MethodName: "SignURL", @@ -1245,8 +1252,8 @@ var ObjectStorageService_ServiceDesc = grpc.ServiceDesc{ Handler: _ObjectStorageService_UpdateUploadBandwidthRateLimit_Handler, }, { - MethodName: "ListParts", - Handler: _ObjectStorageService_ListParts_Handler, + MethodName: "RestoreObject", + Handler: _ObjectStorageService_RestoreObject_Handler, }, }, Streams: []grpc.StreamDesc{ From 40c7b1ee60d3cc186ba4ab409561285855e55623 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 18 Jul 2022 16:20:09 +0800 Subject: [PATCH 103/126] fix lint error --- spec/proto/extension/v1/oss.pb.go | 5 +++-- spec/proto/extension/v1/oss_grpc.pb.go | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/spec/proto/extension/v1/oss.pb.go b/spec/proto/extension/v1/oss.pb.go index e5ba85c8a9..6af511e4a2 100644 --- a/spec/proto/extension/v1/oss.pb.go +++ b/spec/proto/extension/v1/oss.pb.go @@ -11,11 +11,12 @@ package s3 import ( + reflect "reflect" + sync "sync" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" - reflect "reflect" - sync "sync" ) const ( diff --git a/spec/proto/extension/v1/oss_grpc.pb.go b/spec/proto/extension/v1/oss_grpc.pb.go index e320f58ce9..80cdc6598c 100644 --- a/spec/proto/extension/v1/oss_grpc.pb.go +++ b/spec/proto/extension/v1/oss_grpc.pb.go @@ -8,6 +8,7 @@ package s3 import ( context "context" + grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" From be2e8b784da39dab6c81aa6993d5d1cbcdb60b87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 20 Jul 2022 18:13:39 +0800 Subject: [PATCH 104/126] remove initclient --- components/file/aliyun/file.go | 48 +-- components/file/aliyun/file_test.go | 36 +- components/file/aws/file.go | 49 +-- components/file/aws/file_test.go | 45 --- components/oss/aliyun/oss.go | 139 +++----- components/oss/aliyun/oss_test.go | 80 +---- components/oss/aws/oss.go | 135 +++----- components/oss/aws/oss_test.go | 68 +--- components/oss/factory/factory.go | 42 --- components/oss/oss.go | 3 +- components/oss/types.go | 1 - components/pkg/utils/oss.go | 12 +- demo/file/s3/client.go | 12 - docs/zh/design/oss/oss-api-design.md | 85 +---- pkg/grpc/extension/s3/s3.go | 11 - pkg/grpc/extension/s3/s3_test.go | 32 -- pkg/mock/components/oss/oss.go | 30 +- pkg/runtime/runtime.go | 8 +- spec/proto/extension/v1/oss.pb.go | 452 ++++++++++++------------- spec/proto/extension/v1/oss.proto | 3 - spec/proto/extension/v1/oss_grpc.pb.go | 38 --- 21 files changed, 364 insertions(+), 965 deletions(-) delete mode 100644 components/oss/factory/factory.go diff --git a/components/file/aliyun/file.go b/components/file/aliyun/file.go index 33ad3e7a41..c31151844f 100644 --- a/components/file/aliyun/file.go +++ b/components/file/aliyun/file.go @@ -19,7 +19,6 @@ package aliyun import ( "context" "encoding/json" - "errors" "fmt" "io" "strconv" @@ -37,11 +36,11 @@ const ( // AliyunFile is a binding for an AliCloud OSS storage bucketKey type AliyunFile struct { - client map[string]*oss.Client + client *oss.Client } func NewAliyunFile() file.File { - oss := &AliyunFile{client: make(map[string]*oss.Client)} + oss := &AliyunFile{} return oss } @@ -57,18 +56,11 @@ func (s *AliyunFile) Init(ctx context.Context, metadata *file.FileConfig) error if !s.checkMetadata(v) { return file.ErrInvalid } - client, err := s.getClient(v) + client, err := oss.New(v.Endpoint, v.AccessKeyID, v.AccessKeySecret) if err != nil { return err } - s.client[v.Uid] = client - //use bucket as key, client as value - for _, bucketName := range v.Buckets { - if _, ok := s.client[bucketName]; ok { - return errors.New("incorrect configuration, bucketName must be unique") - } - s.client[bucketName] = client - } + s.client = client } return nil } @@ -197,14 +189,6 @@ func (s *AliyunFile) checkMetadata(m *utils.OssMetadata) bool { return true } -func (s *AliyunFile) getClient(metadata *utils.OssMetadata) (*oss.Client, error) { - client, err := oss.New(metadata.Endpoint, metadata.AccessKeyID, metadata.AccessKeySecret) - if err != nil { - return nil, err - } - return client, nil -} - func (s *AliyunFile) getBucket(fileName string, metaData map[string]string) (*oss.Bucket, error) { var ossClient *oss.Client var err error @@ -213,8 +197,7 @@ func (s *AliyunFile) getBucket(fileName string, metaData map[string]string) (*os if err != nil { return nil, err } - //for file interface, not support specify uid now - ossClient, err = s.selectClient("", bucketName) + ossClient, err = s.getClient() if err != nil { return nil, err } @@ -225,22 +208,9 @@ func (s *AliyunFile) getBucket(fileName string, metaData map[string]string) (*os return bucket, nil } -func (s *AliyunFile) selectClient(uid, bucket string) (*oss.Client, error) { - // 1. if user specify client uid, use specify client first - if uid != "" { - if client, ok := s.client[uid]; ok { - return client, nil - } - } - // 2. if user not specify client uid, use bucket to select client - if client, ok := s.client[bucket]; ok { - return client, nil - } - // 3. if not specify uid and bucket, select default one - if len(s.client) == 1 { - for _, client := range s.client { - return client, nil - } +func (s *AliyunFile) getClient() (*oss.Client, error) { + if s.client == nil { + return nil, utils.ErrNotInitClient } - return nil, utils.ErrNotSpecifyEndpoint + return s.client, nil } diff --git a/components/file/aliyun/file_test.go b/components/file/aliyun/file_test.go index 6384877513..c29e565735 100644 --- a/components/file/aliyun/file_test.go +++ b/components/file/aliyun/file_test.go @@ -23,8 +23,6 @@ import ( "mosn.io/layotto/components/pkg/utils" - "github.com/aliyun/aliyun-oss-go-sdk/oss" - "github.com/stretchr/testify/assert" "mosn.io/layotto/components/file" @@ -51,25 +49,6 @@ func TestInit(t *testing.T) { assert.Nil(t, err) } -func TestSelectClient(t *testing.T) { - ossObject := &AliyunFile{client: make(map[string]*oss.Client)} - client, err := ossObject.selectClient("", "") - assert.Equal(t, err.Error(), "should specific endpoint in metadata") - assert.Nil(t, client) - - client1 := &oss.Client{} - ossObject.client["127.0.0.1"] = client1 - client, err = ossObject.selectClient("", "") - assert.Equal(t, client, client1) - assert.Nil(t, err) - - client2 := &oss.Client{} - ossObject.client["0.0.0.0"] = client2 - client, err = ossObject.selectClient("", "") - assert.Equal(t, err.Error(), "should specific endpoint in metadata") - assert.Nil(t, client) -} - func TestGetBucket(t *testing.T) { fc := file.FileConfig{} oss := NewAliyunFile() @@ -95,23 +74,12 @@ func TestGetBucket(t *testing.T) { func TestGetClient(t *testing.T) { fc := file.FileConfig{} - oss := NewAliyunFile() + oss := &AliyunFile{} fc.Metadata = []byte(data) err := oss.Init(context.TODO(), &fc) assert.Nil(t, err) - ac := oss.(*AliyunFile) - mt := &utils.OssMetadata{ - Endpoint: "endpoint", - AccessKeyID: "ak", - AccessKeySecret: "ak", - } - - //TODO test empty endpoint/ak/sk , now will get panic - - client, err := ac.getClient(mt) - assert.Nil(t, err) - assert.NotNil(t, client) + assert.NotNil(t, oss.client) } func TestCheckMetadata(t *testing.T) { diff --git a/components/file/aws/file.go b/components/file/aws/file.go index 4cf0e4e4c6..e058eb3dcc 100644 --- a/components/file/aws/file.go +++ b/components/file/aws/file.go @@ -42,15 +42,11 @@ const ( // AwsOss is a binding for aws oss storage. type AwsOss struct { - client map[string]*s3.Client - meta map[string]*utils.OssMetadata + client *s3.Client } func NewAwsFile() file.File { - return &AwsOss{ - client: make(map[string]*s3.Client), - meta: make(map[string]*utils.OssMetadata), - } + return &AwsOss{} } // Init instance by config. @@ -68,14 +64,7 @@ func (a *AwsOss) Init(ctx context.Context, config *file.FileConfig) error { if err != nil { continue } - a.client[data.Uid] = client - //use bucket as key, client as value - for _, bucketName := range data.Buckets { - if _, ok := a.client[bucketName]; ok { - return errors.New("incorrect configuration, bucketName must be unique") - } - a.client[bucketName] = client - } + a.client = client } return nil } @@ -132,7 +121,7 @@ func (a *AwsOss) Put(ctx context.Context, st *file.PutFileStu) error { if err != nil { return fmt.Errorf("awsoss put file[%s] fail,err: %s", st.FileName, err.Error()) } - client, err := a.selectClient("", bucket) + client, err := a.selectClient() if err != nil { return err } @@ -149,25 +138,11 @@ func (a *AwsOss) Put(ctx context.Context, st *file.PutFileStu) error { return nil } -// selectClient choose aws client from exist client-map, key is endpoint, value is client instance. -func (a *AwsOss) selectClient(uid, bucket string) (*s3.Client, error) { - // 1. if user specify client uid, use specify client first - if uid != "" { - if client, ok := a.client[uid]; ok { - return client, nil - } - } - // 2. if user not specify client uid, use bucket to select client - if client, ok := a.client[bucket]; ok { - return client, nil - } - // 3.if not specify uid and bucket, select default one - if len(a.client) == 1 { - for _, client := range a.client { - return client, nil - } +func (a *AwsOss) selectClient() (*s3.Client, error) { + if a.client == nil { + return nil, utils.ErrNotInitClient } - return nil, utils.ErrNotSpecifyEndpoint + return a.client, nil } // Get object from aws oss. @@ -184,7 +159,7 @@ func (a *AwsOss) Get(ctx context.Context, st *file.GetFileStu) (io.ReadCloser, e Bucket: &bucket, Key: &key, } - client, err := a.selectClient("", bucket) + client, err := a.selectClient() if err != nil { return nil, err } @@ -208,7 +183,7 @@ func (a *AwsOss) List(ctx context.Context, st *file.ListRequest) (*file.ListResp Marker: &st.Marker, Prefix: &prefix, } - client, err := a.selectClient("", bucket) + client, err := a.selectClient() if err != nil { return nil, fmt.Errorf("list bucket[%s] fail, err: %s", st.DirectoryName, err.Error()) } @@ -245,7 +220,7 @@ func (a *AwsOss) Del(ctx context.Context, st *file.DelRequest) error { Bucket: &bucket, Key: &key, } - client, err := a.selectClient("", bucket) + client, err := a.selectClient() if err != nil { return err } @@ -268,7 +243,7 @@ func (a *AwsOss) Stat(ctx context.Context, st *file.FileMetaRequest) (*file.File Bucket: &bucket, Key: &key, } - client, err := a.selectClient("", bucket) + client, err := a.selectClient() if err != nil { return nil, err } diff --git a/components/file/aws/file_test.go b/components/file/aws/file_test.go index f05714de0f..97a0c6a8bc 100644 --- a/components/file/aws/file_test.go +++ b/components/file/aws/file_test.go @@ -44,17 +44,6 @@ const cfg = `[ } ]` -const cfgwithuid = `[ - { - "uid": "1", - "buckets":["bucket3"], - "endpoint": "protocol://service-code.region-code.amazonaws.com", - "accessKeyID": "accessKey", - "accessKeySecret": "secret", - "region": "us-west-2" - } - ]` - func TestAwsOss_Init(t *testing.T) { oss := NewAwsFile() err := oss.Init(context.TODO(), &file.FileConfig{}) @@ -63,40 +52,6 @@ func TestAwsOss_Init(t *testing.T) { assert.Equal(t, nil, err) } -func TestAwsOss_SelectClient(t *testing.T) { - oss := &AwsOss{ - client: make(map[string]*s3.Client), - meta: make(map[string]*utils.OssMetadata), - } - err := oss.Init(context.TODO(), &file.FileConfig{Metadata: []byte(cfg)}) - assert.Equal(t, nil, err) - - // not specify endpoint, select default client - _, err = oss.selectClient("", "bucket1") - assert.Nil(t, err) - - // specify endpoint equal config - client, _ := oss.selectClient("", "bucket1") - assert.NotNil(t, client) - - // specicy not exist endpoint, select default one - client, err = oss.selectClient("", "bucket1") - assert.Nil(t, err) - assert.NotNil(t, client) - // new client with endpoint - oss.client["bucket2"] = &s3.Client{} - client, _ = oss.selectClient("", "bucket2") - assert.NotNil(t, client) - - err = oss.Init(context.TODO(), &file.FileConfig{Metadata: []byte(cfgwithuid)}) - assert.Equal(t, nil, err) - - // specify uid - client, _ = oss.selectClient("1", "bucket1") - assert.Equal(t, client, oss.client["1"]) - assert.NotNil(t, client) -} - func TestAwsOss_IsAwsMetaValid(t *testing.T) { mt := &utils.OssMetadata{} a := AwsOss{} diff --git a/components/oss/aliyun/oss.go b/components/oss/aliyun/oss.go index 7622b284af..b5dd7f9ae5 100644 --- a/components/oss/aliyun/oss.go +++ b/components/oss/aliyun/oss.go @@ -21,8 +21,6 @@ import ( "encoding/json" "net/http" - "mosn.io/layotto/components/oss/factory" - "mosn.io/layotto/components/pkg/utils" l8oss "mosn.io/layotto/components/oss" @@ -30,73 +28,35 @@ import ( "github.com/aliyun/aliyun-oss-go-sdk/oss" ) -const ( - DefaultClientInitFunc = "aliyun" -) - // AliyunOSS is a binding for an aliyun OSS storage bucketKey type AliyunOSS struct { - client map[string]*oss.Client - method string + client *oss.Client rawData json.RawMessage } func NewAliyunOss() l8oss.Oss { - return &AliyunOSS{ - client: make(map[string]*oss.Client), - } + return &AliyunOSS{} } -func init() { - factory.RegisterInitFunc(DefaultClientInitFunc, AliyunDefaultInitFunc) -} - -func AliyunDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string) (map[string]interface{}, error) { +func (a *AliyunOSS) Init(ctx context.Context, config *l8oss.OssConfig) error { + a.rawData = config.Metadata m := make([]*utils.OssMetadata, 0) - clients := make(map[string]interface{}) - err := json.Unmarshal(staticConf, &m) + err := json.Unmarshal(config.Metadata, &m) if err != nil { - return nil, l8oss.ErrInvalid + return l8oss.ErrInvalid } for _, v := range m { client, err := oss.New(v.Endpoint, v.AccessKeyID, v.AccessKeySecret) if err != nil { - return nil, err + return err } - clients[v.Uid] = client - for _, bucketName := range v.Buckets { - if _, ok := clients[bucketName]; ok { - continue - } - clients[bucketName] = client - } - } - return clients, nil -} - -func (a *AliyunOSS) InitConfig(ctx context.Context, config *l8oss.OssConfig) error { - a.method = config.Method - a.rawData = config.Metadata - return nil -} - -func (a *AliyunOSS) InitClient(ctx context.Context, req *l8oss.InitRequest) error { - if a.method == "" { - a.method = DefaultClientInitFunc - } - initFunc := factory.GetInitFunc(a.method) - clients, err := initFunc(a.rawData, req.Metadata) - if err != nil { - return err - } - for k, v := range clients { - a.client[k] = v.(*oss.Client) + a.client = client } return nil } func (a *AliyunOSS) GetObject(ctx context.Context, req *l8oss.GetObjectInput) (*l8oss.GetObjectOutput, error) { - client, err := a.selectClient(req.Uid, req.Bucket) + client, err := a.getClient() if err != nil { return nil, err } @@ -122,7 +82,7 @@ func (a *AliyunOSS) GetObject(ctx context.Context, req *l8oss.GetObjectInput) (* } func (a *AliyunOSS) PutObject(ctx context.Context, req *l8oss.PutObjectInput) (*l8oss.PutObjectOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -157,7 +117,7 @@ func (a *AliyunOSS) PutObject(ctx context.Context, req *l8oss.PutObjectInput) (* } func (a *AliyunOSS) DeleteObject(ctx context.Context, req *l8oss.DeleteObjectInput) (*l8oss.DeleteObjectOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -169,7 +129,7 @@ func (a *AliyunOSS) DeleteObject(ctx context.Context, req *l8oss.DeleteObjectInp return &l8oss.DeleteObjectOutput{}, err } func (a *AliyunOSS) DeleteObjects(ctx context.Context, req *l8oss.DeleteObjectsInput) (*l8oss.DeleteObjectsOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -195,7 +155,7 @@ func (a *AliyunOSS) DeleteObjects(ctx context.Context, req *l8oss.DeleteObjectsI } func (a *AliyunOSS) PutObjectTagging(ctx context.Context, req *l8oss.PutObjectTaggingInput) (*l8oss.PutObjectTaggingOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -213,7 +173,7 @@ func (a *AliyunOSS) PutObjectTagging(ctx context.Context, req *l8oss.PutObjectTa } func (a *AliyunOSS) DeleteObjectTagging(ctx context.Context, req *l8oss.DeleteObjectTaggingInput) (*l8oss.DeleteObjectTaggingOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -226,7 +186,7 @@ func (a *AliyunOSS) DeleteObjectTagging(ctx context.Context, req *l8oss.DeleteOb } func (a *AliyunOSS) GetObjectTagging(ctx context.Context, req *l8oss.GetObjectTaggingInput) (*l8oss.GetObjectTaggingOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -246,7 +206,7 @@ func (a *AliyunOSS) GetObjectTagging(ctx context.Context, req *l8oss.GetObjectTa } func (a *AliyunOSS) GetObjectCannedAcl(ctx context.Context, req *l8oss.GetObjectCannedAclInput) (*l8oss.GetObjectCannedAclOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -262,7 +222,7 @@ func (a *AliyunOSS) GetObjectCannedAcl(ctx context.Context, req *l8oss.GetObject return output, err } func (a *AliyunOSS) PutObjectCannedAcl(ctx context.Context, req *l8oss.PutObjectCannedAclInput) (*l8oss.PutObjectCannedAclOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -275,7 +235,7 @@ func (a *AliyunOSS) PutObjectCannedAcl(ctx context.Context, req *l8oss.PutObject return output, err } func (a *AliyunOSS) ListObjects(ctx context.Context, req *l8oss.ListObjectsInput) (*l8oss.ListObjectsOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -310,7 +270,7 @@ func (a *AliyunOSS) ListObjects(ctx context.Context, req *l8oss.ListObjectsInput return out, nil } func (a *AliyunOSS) CopyObject(ctx context.Context, req *l8oss.CopyObjectInput) (*l8oss.CopyObjectOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -334,7 +294,7 @@ func (a *AliyunOSS) CopyObject(ctx context.Context, req *l8oss.CopyObjectInput) } func (a *AliyunOSS) CreateMultipartUpload(ctx context.Context, req *l8oss.CreateMultipartUploadInput) (*l8oss.CreateMultipartUploadOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -347,7 +307,7 @@ func (a *AliyunOSS) CreateMultipartUpload(ctx context.Context, req *l8oss.Create return output, err } func (a *AliyunOSS) UploadPart(ctx context.Context, req *l8oss.UploadPartInput) (*l8oss.UploadPartOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -364,7 +324,7 @@ func (a *AliyunOSS) UploadPart(ctx context.Context, req *l8oss.UploadPartInput) return output, err } func (a *AliyunOSS) UploadPartCopy(ctx context.Context, req *l8oss.UploadPartCopyInput) (*l8oss.UploadPartCopyOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -385,7 +345,7 @@ func (a *AliyunOSS) UploadPartCopy(ctx context.Context, req *l8oss.UploadPartCop return output, err } func (a *AliyunOSS) CompleteMultipartUpload(ctx context.Context, req *l8oss.CompleteMultipartUploadInput) (*l8oss.CompleteMultipartUploadOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -409,7 +369,7 @@ func (a *AliyunOSS) CompleteMultipartUpload(ctx context.Context, req *l8oss.Comp return output, err } func (a *AliyunOSS) AbortMultipartUpload(ctx context.Context, req *l8oss.AbortMultipartUploadInput) (*l8oss.AbortMultipartUploadOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -425,7 +385,7 @@ func (a *AliyunOSS) AbortMultipartUpload(ctx context.Context, req *l8oss.AbortMu return output, err } func (a *AliyunOSS) ListMultipartUploads(ctx context.Context, req *l8oss.ListMultipartUploadsInput) (*l8oss.ListMultipartUploadsOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -454,7 +414,7 @@ func (a *AliyunOSS) ListMultipartUploads(ctx context.Context, req *l8oss.ListMul } func (a *AliyunOSS) RestoreObject(ctx context.Context, req *l8oss.RestoreObjectInput) (*l8oss.RestoreObjectOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -468,7 +428,7 @@ func (a *AliyunOSS) RestoreObject(ctx context.Context, req *l8oss.RestoreObjectI } func (a *AliyunOSS) ListObjectVersions(ctx context.Context, req *l8oss.ListObjectVersionsInput) (*l8oss.ListObjectVersionsOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -524,7 +484,7 @@ func (a *AliyunOSS) ListObjectVersions(ctx context.Context, req *l8oss.ListObjec } func (a *AliyunOSS) HeadObject(ctx context.Context, req *l8oss.HeadObjectInput) (*l8oss.HeadObjectOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -556,7 +516,7 @@ func (a *AliyunOSS) HeadObject(ctx context.Context, req *l8oss.HeadObjectInput) } func (a *AliyunOSS) IsObjectExist(ctx context.Context, req *l8oss.IsObjectExistInput) (*l8oss.IsObjectExistOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -569,7 +529,7 @@ func (a *AliyunOSS) IsObjectExist(ctx context.Context, req *l8oss.IsObjectExistI } func (a *AliyunOSS) SignURL(ctx context.Context, req *l8oss.SignURLInput) (*l8oss.SignURLOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -583,24 +543,26 @@ func (a *AliyunOSS) SignURL(ctx context.Context, req *l8oss.SignURLInput) (*l8os //UpdateDownloadBandwidthRateLimit update all client rate func (a *AliyunOSS) UpdateDownloadBandwidthRateLimit(ctx context.Context, req *l8oss.UpdateBandwidthRateLimitInput) error { - for _, cli := range a.client { - err := cli.LimitDownloadSpeed(int(req.AverageRateLimitInBitsPerSec)) + cli, err := a.getClient() + if err != nil { return err } - return nil + err = cli.LimitDownloadSpeed(int(req.AverageRateLimitInBitsPerSec)) + return err } //UpdateUploadBandwidthRateLimit update all client rate func (a *AliyunOSS) UpdateUploadBandwidthRateLimit(ctx context.Context, req *l8oss.UpdateBandwidthRateLimitInput) error { - for _, cli := range a.client { - err := cli.LimitUploadSpeed(int(req.AverageRateLimitInBitsPerSec)) + cli, err := a.getClient() + if err != nil { return err } - return nil + err = cli.LimitUploadSpeed(int(req.AverageRateLimitInBitsPerSec)) + return err } func (a *AliyunOSS) AppendObject(ctx context.Context, req *l8oss.AppendObjectInput) (*l8oss.AppendObjectOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -623,7 +585,7 @@ func (a *AliyunOSS) AppendObject(ctx context.Context, req *l8oss.AppendObjectInp } func (a *AliyunOSS) ListParts(ctx context.Context, req *l8oss.ListPartsInput) (*l8oss.ListPartsOutput, error) { - cli, err := a.selectClient(req.Uid, req.Bucket) + cli, err := a.getClient() if err != nil { return nil, err } @@ -654,22 +616,9 @@ func (a *AliyunOSS) ListParts(ctx context.Context, req *l8oss.ListPartsInput) (* return out, err } -func (a *AliyunOSS) selectClient(uid, bucket string) (*oss.Client, error) { - // 1. if user specify client uid, use specify client first - if uid != "" { - if client, ok := a.client[uid]; ok { - return client, nil - } - } - // 2. if user not specify client uid, use bucket to select client - if client, ok := a.client[bucket]; ok { - return client, nil - } - // 3. if not specify uid and bucket, select default one - if len(a.client) == 1 { - for _, client := range a.client { - return client, nil - } +func (a *AliyunOSS) getClient() (*oss.Client, error) { + if a.client == nil { + return nil, utils.ErrNotInitClient } - return nil, utils.ErrNotSpecifyEndpoint + return a.client, nil } diff --git a/components/oss/aliyun/oss_test.go b/components/oss/aliyun/oss_test.go index ee5125d034..9de0f1c6a0 100644 --- a/components/oss/aliyun/oss_test.go +++ b/components/oss/aliyun/oss_test.go @@ -20,7 +20,7 @@ import ( "context" "testing" - "mosn.io/layotto/components/oss/factory" + "mosn.io/layotto/components/pkg/utils" "mosn.io/layotto/components/oss" @@ -39,86 +39,24 @@ const ( "accessKeySecret": "secret" } ]` - confWithUid = `[ - { - "uid": "123", - "endpoint": "endpoint_address", - "accessKeyID": "accessKey", - "accessKeySecret": "secret" - } - ]` - confWithUidAndBucket = `[ - { - "uid": "123", - "buckets": ["bucket1","bucket2"], - "endpoint": "endpoint_address", - "accessKeyID": "accessKey", - "accessKeySecret": "secret" - } - ]` ) func TestInitAliyunOss(t *testing.T) { - NewAliyunOss() - f := factory.GetInitFunc(DefaultClientInitFunc) - clients, err := f([]byte("hello"), map[string]string{}) - assert.Equal(t, err, l8oss.ErrInvalid) - assert.Nil(t, clients) - clients, err = f([]byte(confWithoutUidAndBucket), map[string]string{}) - assert.NotEqual(t, l8oss.ErrInvalid, err) - assert.NotNil(t, clients) - client, ok := clients[""] - assert.Equal(t, true, ok) - assert.NotNil(t, client) - - clients, err = f([]byte(confWithUid), map[string]string{}) - assert.NotEqual(t, l8oss.ErrInvalid, err) - assert.NotNil(t, clients) - client, ok = clients[""] - assert.Equal(t, false, ok) + a := &AliyunOSS{} + client, err := a.getClient() + assert.Equal(t, err, utils.ErrNotInitClient) assert.Nil(t, client) - client, ok = clients["123"] - assert.Equal(t, true, ok) - assert.NotNil(t, client) - - clients, err = f([]byte(confWithUidAndBucket), map[string]string{}) + err = a.Init(context.TODO(), &l8oss.OssConfig{Metadata: []byte("hello")}) + assert.Equal(t, err, l8oss.ErrInvalid) + err = a.Init(context.TODO(), &l8oss.OssConfig{Metadata: []byte(confWithoutUidAndBucket)}) assert.NotEqual(t, l8oss.ErrInvalid, err) - assert.NotNil(t, clients) - client, ok = clients[""] - assert.Equal(t, false, ok) - assert.Nil(t, client) - - client, ok = clients["123"] - assert.Equal(t, true, ok) - assert.NotNil(t, client) - - client, ok = clients["bucket1"] - assert.Equal(t, true, ok) - assert.NotNil(t, client) - - client, ok = clients["bucket2"] - assert.Equal(t, true, ok) - assert.NotNil(t, client) + assert.NotNil(t, a.client) } func TestAliyunOss(t *testing.T) { instance := NewAliyunOss() - err := instance.InitConfig(context.TODO(), &l8oss.OssConfig{Method: "", Metadata: []byte(confWithUidAndBucket)}) - assert.Nil(t, err) - err = instance.InitClient(context.TODO(), &oss.InitRequest{}) - assert.Nil(t, err) - - aliyun := instance.(*AliyunOSS) - clientUid, _ := aliyun.selectClient("123", "") - assert.Equal(t, clientUid, aliyun.client["123"]) - - clientBucket1, _ := aliyun.selectClient("123", "bucket1") - assert.Equal(t, clientBucket1, aliyun.client["bucket1"]) - - clientBucket2, _ := aliyun.selectClient("123", "bucket2") - assert.Equal(t, clientBucket2, aliyun.client["bucket2"]) - + instance.Init(context.TODO(), &l8oss.OssConfig{Metadata: []byte(confWithoutUidAndBucket)}) appendObjectResp, err := instance.AppendObject(context.TODO(), &oss.AppendObjectInput{}) assert.NotNil(t, err) assert.Nil(t, appendObjectResp) diff --git a/components/oss/aws/oss.go b/components/oss/aws/oss.go index 3743758e99..909fd88638 100644 --- a/components/oss/aws/oss.go +++ b/components/oss/aws/oss.go @@ -25,16 +25,15 @@ import ( "strings" "time" - "mosn.io/layotto/components/pkg/utils" + "github.com/aws/aws-sdk-go-v2/aws" + aws_config "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/credentials" - "mosn.io/layotto/components/oss/factory" + "mosn.io/layotto/components/pkg/utils" "mosn.io/layotto/components/oss" - "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" @@ -42,28 +41,22 @@ import ( "mosn.io/pkg/log" ) -const ( - DefaultClientInitFunc = "aws" -) - -func init() { - factory.RegisterInitFunc(DefaultClientInitFunc, AwsDefaultInitFunc) -} - // AwsOss is a binding for aws oss storage. type AwsOss struct { - client map[string]*s3.Client - meta map[string]*utils.OssMetadata - method string + client *s3.Client rawData json.RawMessage } -func AwsDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string) (map[string]interface{}, error) { +func NewAwsOss() oss.Oss { + return &AwsOss{} +} + +func (a *AwsOss) Init(ctx context.Context, config *oss.OssConfig) error { + a.rawData = config.Metadata m := make([]*utils.OssMetadata, 0) - err := json.Unmarshal(staticConf, &m) - clients := make(map[string]interface{}) + err := json.Unmarshal(config.Metadata, &m) if err != nil { - return nil, oss.ErrInvalid + return oss.ErrInvalid } for _, data := range m { optFunc := []func(options *aws_config.LoadOptions) error{ @@ -75,53 +68,19 @@ func AwsDefaultInitFunc(staticConf json.RawMessage, DynConf map[string]string) ( }, }), } - cfg, err := aws_config.LoadDefaultConfig(context.TODO(), optFunc...) if err != nil { - return nil, err + return err } client := s3.NewFromConfig(cfg) - clients[data.Uid] = client - for _, bucketName := range data.Buckets { - if _, ok := clients[bucketName]; ok { - continue - } - clients[bucketName] = client - } - } - return clients, nil -} - -func NewAwsOss() oss.Oss { - return &AwsOss{ - client: make(map[string]*s3.Client), - meta: make(map[string]*utils.OssMetadata), - } -} -func (a *AwsOss) InitConfig(ctx context.Context, config *oss.OssConfig) error { - a.method = config.Method - a.rawData = config.Metadata - return nil -} - -func (a *AwsOss) InitClient(ctx context.Context, req *oss.InitRequest) error { - if a.method == "" { - a.method = DefaultClientInitFunc - } - initFunc := factory.GetInitFunc(a.method) - clients, err := initFunc(a.rawData, req.Metadata) - if err != nil { - return err - } - for k, v := range clients { - a.client[k] = v.(*s3.Client) + a.client = client } return nil } func (a *AwsOss) GetObject(ctx context.Context, req *oss.GetObjectInput) (*oss.GetObjectOutput, error) { input := &s3.GetObjectInput{} - client, err := a.selectClient(req.Uid, req.Bucket) + client, err := a.getClient() if err != nil { return nil, err } @@ -143,7 +102,7 @@ func (a *AwsOss) GetObject(ctx context.Context, req *oss.GetObjectInput) (*oss.G } func (a *AwsOss) PutObject(ctx context.Context, req *oss.PutObjectInput) (*oss.PutObjectOutput, error) { - client, err := a.selectClient(req.Uid, req.Bucket) + client, err := a.getClient() if err != nil { return nil, err } @@ -171,7 +130,7 @@ func (a *AwsOss) DeleteObject(ctx context.Context, req *oss.DeleteObjectInput) ( Bucket: &req.Bucket, Key: &req.Key, } - client, err := a.selectClient(req.Uid, req.Bucket) + client, err := a.getClient() if err != nil { return nil, err } @@ -183,7 +142,7 @@ func (a *AwsOss) DeleteObject(ctx context.Context, req *oss.DeleteObjectInput) ( } func (a *AwsOss) PutObjectTagging(ctx context.Context, req *oss.PutObjectTaggingInput) (*oss.PutObjectTaggingOutput, error) { - client, err := a.selectClient(req.Uid, req.Bucket) + client, err := a.getClient() if err != nil { return nil, err } @@ -200,7 +159,7 @@ func (a *AwsOss) PutObjectTagging(ctx context.Context, req *oss.PutObjectTagging return &oss.PutObjectTaggingOutput{}, err } func (a *AwsOss) DeleteObjectTagging(ctx context.Context, req *oss.DeleteObjectTaggingInput) (*oss.DeleteObjectTaggingOutput, error) { - client, err := a.selectClient(req.Uid, req.Bucket) + client, err := a.getClient() if err != nil { return nil, err } @@ -217,7 +176,7 @@ func (a *AwsOss) DeleteObjectTagging(ctx context.Context, req *oss.DeleteObjectT } func (a *AwsOss) GetObjectTagging(ctx context.Context, req *oss.GetObjectTaggingInput) (*oss.GetObjectTaggingOutput, error) { - client, err := a.selectClient(req.Uid, req.Bucket) + client, err := a.getClient() if err != nil { return nil, err } @@ -239,7 +198,7 @@ func (a *AwsOss) GetObjectTagging(ctx context.Context, req *oss.GetObjectTagging } func (a *AwsOss) CopyObject(ctx context.Context, req *oss.CopyObjectInput) (*oss.CopyObjectOutput, error) { - client, err := a.selectClient(req.Uid, req.Bucket) + client, err := a.getClient() if err != nil { return nil, err } @@ -266,7 +225,7 @@ func (a *AwsOss) CopyObject(ctx context.Context, req *oss.CopyObjectInput) (*oss return &oss.CopyObjectOutput{CopyObjectResult: &oss.CopyObjectResult{ETag: *resp.CopyObjectResult.ETag, LastModified: resp.CopyObjectResult.LastModified.Unix()}}, err } func (a *AwsOss) DeleteObjects(ctx context.Context, req *oss.DeleteObjectsInput) (*oss.DeleteObjectsOutput, error) { - client, err := a.selectClient(req.Uid, req.Bucket) + client, err := a.getClient() if err != nil { return nil, err } @@ -293,7 +252,7 @@ func (a *AwsOss) DeleteObjects(ctx context.Context, req *oss.DeleteObjectsInput) return output, err } func (a *AwsOss) ListObjects(ctx context.Context, req *oss.ListObjectsInput) (*oss.ListObjectsOutput, error) { - client, err := a.selectClient(req.Uid, req.Bucket) + client, err := a.getClient() if err != nil { return nil, err } @@ -343,7 +302,7 @@ func (a *AwsOss) GetObjectCannedAcl(ctx context.Context, req *oss.GetObjectCanne return nil, errors.New("GetObjectCannedAcl method not supported on AWS") } func (a *AwsOss) PutObjectCannedAcl(ctx context.Context, req *oss.PutObjectCannedAclInput) (*oss.PutObjectCannedAclOutput, error) { - client, err := a.selectClient(req.Uid, req.Bucket) + client, err := a.getClient() if err != nil { return nil, err } @@ -359,7 +318,7 @@ func (a *AwsOss) PutObjectCannedAcl(ctx context.Context, req *oss.PutObjectCanne return &oss.PutObjectCannedAclOutput{RequestCharged: string(resp.RequestCharged)}, err } func (a *AwsOss) RestoreObject(ctx context.Context, req *oss.RestoreObjectInput) (*oss.RestoreObjectOutput, error) { - client, err := a.selectClient(req.Uid, req.Bucket) + client, err := a.getClient() if err != nil { return nil, err } @@ -374,7 +333,7 @@ func (a *AwsOss) RestoreObject(ctx context.Context, req *oss.RestoreObjectInput) return &oss.RestoreObjectOutput{RequestCharged: string(resp.RequestCharged), RestoreOutputPath: *resp.RestoreOutputPath}, err } func (a *AwsOss) CreateMultipartUpload(ctx context.Context, req *oss.CreateMultipartUploadInput) (*oss.CreateMultipartUploadOutput, error) { - client, err := a.selectClient(req.Uid, req.Bucket) + client, err := a.getClient() if err != nil { return nil, err } @@ -409,7 +368,7 @@ func (a *AwsOss) CreateMultipartUpload(ctx context.Context, req *oss.CreateMulti return output, err } func (a *AwsOss) UploadPart(ctx context.Context, req *oss.UploadPartInput) (*oss.UploadPartOutput, error) { - client, err := a.selectClient(req.Uid, req.Bucket) + client, err := a.getClient() if err != nil { return nil, err } @@ -437,7 +396,7 @@ func (a *AwsOss) UploadPart(ctx context.Context, req *oss.UploadPartInput) (*oss return output, err } func (a *AwsOss) UploadPartCopy(ctx context.Context, req *oss.UploadPartCopyInput) (*oss.UploadPartCopyOutput, error) { - client, err := a.selectClient(req.Uid, req.Bucket) + client, err := a.getClient() if err != nil { return nil, err } @@ -462,7 +421,7 @@ func (a *AwsOss) UploadPartCopy(ctx context.Context, req *oss.UploadPartCopyInpu return output, err } func (a *AwsOss) CompleteMultipartUpload(ctx context.Context, req *oss.CompleteMultipartUploadInput) (*oss.CompleteMultipartUploadOutput, error) { - client, err := a.selectClient(req.Uid, req.Bucket) + client, err := a.getClient() if err != nil { return nil, err } @@ -488,7 +447,7 @@ func (a *AwsOss) CompleteMultipartUpload(ctx context.Context, req *oss.CompleteM return output, err } func (a *AwsOss) AbortMultipartUpload(ctx context.Context, req *oss.AbortMultipartUploadInput) (*oss.AbortMultipartUploadOutput, error) { - client, err := a.selectClient(req.Uid, req.Bucket) + client, err := a.getClient() if err != nil { return nil, err } @@ -507,7 +466,7 @@ func (a *AwsOss) AbortMultipartUpload(ctx context.Context, req *oss.AbortMultipa return output, err } func (a *AwsOss) ListMultipartUploads(ctx context.Context, req *oss.ListMultipartUploadsInput) (*oss.ListMultipartUploadsOutput, error) { - client, err := a.selectClient(req.Uid, req.Bucket) + client, err := a.getClient() if err != nil { return nil, err } @@ -544,7 +503,7 @@ func (a *AwsOss) ListMultipartUploads(ctx context.Context, req *oss.ListMultipar return output, err } func (a *AwsOss) ListObjectVersions(ctx context.Context, req *oss.ListObjectVersionsInput) (*oss.ListObjectVersionsOutput, error) { - client, err := a.selectClient(req.Uid, req.Bucket) + client, err := a.getClient() if err != nil { return nil, err } @@ -592,7 +551,7 @@ func (a *AwsOss) ListObjectVersions(ctx context.Context, req *oss.ListObjectVers } func (a *AwsOss) HeadObject(ctx context.Context, req *oss.HeadObjectInput) (*oss.HeadObjectOutput, error) { - client, err := a.selectClient(req.Uid, req.Bucket) + client, err := a.getClient() if err != nil { return nil, err } @@ -609,7 +568,7 @@ func (a *AwsOss) HeadObject(ctx context.Context, req *oss.HeadObjectInput) (*oss } func (a *AwsOss) IsObjectExist(ctx context.Context, req *oss.IsObjectExistInput) (*oss.IsObjectExistOutput, error) { - client, err := a.selectClient(req.Uid, req.Bucket) + client, err := a.getClient() if err != nil { return nil, err } @@ -626,7 +585,7 @@ func (a *AwsOss) IsObjectExist(ctx context.Context, req *oss.IsObjectExistInput) } func (a *AwsOss) SignURL(ctx context.Context, req *oss.SignURLInput) (*oss.SignURLOutput, error) { - client, err := a.selectClient(req.Uid, req.Bucket) + client, err := a.getClient() if err != nil { return nil, err } @@ -666,23 +625,9 @@ func (a *AwsOss) ListParts(ctx context.Context, req *oss.ListPartsInput) (*oss.L return nil, errors.New("ListParts method not supported on AWS") } -// selectClient choose aws client from exist client-map, key is endpoint, value is client instance. -func (a *AwsOss) selectClient(uid, bucket string) (*s3.Client, error) { - // 1. if user specify client uid, use specify client first - if uid != "" { - if client, ok := a.client[uid]; ok { - return client, nil - } - } - // 2. if user not specify client uid, use bucket to select client - if client, ok := a.client[bucket]; ok { - return client, nil - } - // 3.if not specify uid and bucket, select default one - if len(a.client) == 1 { - for _, client := range a.client { - return client, nil - } +func (a *AwsOss) getClient() (*s3.Client, error) { + if a.client == nil { + return nil, utils.ErrNotInitClient } - return nil, utils.ErrNotSpecifyEndpoint + return a.client, nil } diff --git a/components/oss/aws/oss_test.go b/components/oss/aws/oss_test.go index a4256b98dd..7aace10a94 100644 --- a/components/oss/aws/oss_test.go +++ b/components/oss/aws/oss_test.go @@ -21,8 +21,6 @@ import ( "errors" "testing" - "mosn.io/layotto/components/oss/factory" - "mosn.io/layotto/components/oss" "mosn.io/pkg/buffer" @@ -38,73 +36,19 @@ const ( "accessKeySecret": "secret" } ]` - confWithUid = `[ - { - "uid": "123", - "endpoint": "endpoint_address", - "accessKeyID": "accessKey", - "accessKeySecret": "secret" - } - ]` - confWithUidAndBucket = `[ - { - "uid": "123", - "buckets": ["bucket1","bucket2"], - "endpoint": "endpoint_address", - "accessKeyID": "accessKey", - "accessKeySecret": "secret" - } - ]` ) func TestAwsDefaultInitFunc(t *testing.T) { - NewAwsOss() - f := factory.GetInitFunc(DefaultClientInitFunc) - clients, err := f([]byte("hello"), map[string]string{}) + a := &AwsOss{} + err := a.Init(context.TODO(), &oss.OssConfig{Metadata: []byte("hello")}) assert.Equal(t, err, oss.ErrInvalid) - assert.Nil(t, clients) - clients, err = f([]byte(confWithoutUidAndBucket), map[string]string{}) - assert.NotEqual(t, oss.ErrInvalid, err) - assert.NotNil(t, clients) - client, ok := clients[""] - assert.Equal(t, true, ok) - assert.NotNil(t, client) - - clients, err = f([]byte(confWithUid), map[string]string{}) - assert.NotEqual(t, oss.ErrInvalid, err) - assert.NotNil(t, clients) - client, ok = clients[""] - assert.Equal(t, false, ok) - assert.Nil(t, client) - client, ok = clients["123"] - assert.Equal(t, true, ok) - assert.NotNil(t, client) - - clients, err = f([]byte(confWithUidAndBucket), map[string]string{}) - assert.NotEqual(t, oss.ErrInvalid, err) - assert.NotNil(t, clients) - client, ok = clients[""] - assert.Equal(t, false, ok) - assert.Nil(t, client) - - client, ok = clients["123"] - assert.Equal(t, true, ok) - assert.NotNil(t, client) - - client, ok = clients["bucket1"] - assert.Equal(t, true, ok) - assert.NotNil(t, client) - - client, ok = clients["bucket2"] - assert.Equal(t, true, ok) - assert.NotNil(t, client) + assert.Nil(t, a.client) + } func TestAwsOss(t *testing.T) { - instance := NewAwsOss() - err := instance.InitConfig(context.TODO(), &oss.OssConfig{Method: "", Metadata: []byte(confWithoutUidAndBucket)}) - assert.Nil(t, err) - err = instance.InitClient(context.TODO(), &oss.InitRequest{}) + instance := &AwsOss{} + err := instance.Init(context.TODO(), &oss.OssConfig{Metadata: []byte(confWithoutUidAndBucket)}) assert.Nil(t, err) appendObjectResp, err := instance.AppendObject(context.TODO(), &oss.AppendObjectInput{}) diff --git a/components/oss/factory/factory.go b/components/oss/factory/factory.go deleted file mode 100644 index 2aa533a1c7..0000000000 --- a/components/oss/factory/factory.go +++ /dev/null @@ -1,42 +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 factory - -import ( - "encoding/json" - "sync" -) - -var initFuncRegistry map[string]S3ClientInit -var mux sync.RWMutex - -type S3ClientInit func(staticConf json.RawMessage, dynConf map[string]string) (map[string]interface{}, error) - -func init() { - initFuncRegistry = make(map[string]S3ClientInit) -} -func RegisterInitFunc(name string, f S3ClientInit) { - mux.Lock() - initFuncRegistry[name] = f - mux.Unlock() -} - -func GetInitFunc(name string) S3ClientInit { - mux.RLock() - defer mux.RUnlock() - return initFuncRegistry[name] -} diff --git a/components/oss/oss.go b/components/oss/oss.go index d95f76e87e..e069956b64 100644 --- a/components/oss/oss.go +++ b/components/oss/oss.go @@ -26,8 +26,7 @@ const ( ) type Oss interface { - InitConfig(context.Context, *OssConfig) error - InitClient(context.Context, *InitRequest) error + Init(context.Context, *OssConfig) error GetObject(context.Context, *GetObjectInput) (*GetObjectOutput, error) PutObject(context.Context, *PutObjectInput) (*PutObjectOutput, error) DeleteObject(context.Context, *DeleteObjectInput) (*DeleteObjectOutput, error) diff --git a/components/oss/types.go b/components/oss/types.go index 6cf6947d85..08f985cae2 100644 --- a/components/oss/types.go +++ b/components/oss/types.go @@ -27,7 +27,6 @@ var ( // OssConfig wraps configuration for a oss implementation type OssConfig struct { - Method string `json:"method"` Metadata json.RawMessage `json:"metadata"` Type string `json:"type"` } diff --git a/components/pkg/utils/oss.go b/components/pkg/utils/oss.go index 6a8263a6da..aa6959ba34 100644 --- a/components/pkg/utils/oss.go +++ b/components/pkg/utils/oss.go @@ -18,15 +18,13 @@ import ( ) var ( - ErrNotSpecifyEndpoint = errors.New("should specific endpoint in metadata") + ErrNotInitClient = errors.New("oss client not init") ) // OssMetadata wraps the configuration of oss implementation type OssMetadata struct { - Buckets []string `json:"buckets"` // contained buckets in this oss client - Uid string `json:"uid"` // specify the uid of oss client - Endpoint string `json:"endpoint"` - AccessKeyID string `json:"accessKeyID"` - AccessKeySecret string `json:"accessKeySecret"` - Region string `json:"region"` + Endpoint string `json:"endpoint"` + AccessKeyID string `json:"accessKeyID"` + AccessKeySecret string `json:"accessKeySecret"` + Region string `json:"region"` } diff --git a/demo/file/s3/client.go b/demo/file/s3/client.go index 1bde707f1d..0c3f66a179 100644 --- a/demo/file/s3/client.go +++ b/demo/file/s3/client.go @@ -482,18 +482,6 @@ func TestHeadObject(bucket, fileName string) { } func main() { - conn, err := grpc.Dial("127.0.0.1:34904", grpc.WithInsecure()) - if err != nil { - fmt.Printf("conn build failed,err:%+v", err) - return - } - c := s3.NewObjectStorageServiceClient(conn) - req := &s3.InitInput{StoreName: storeName} - _, err = c.InitClient(context.Background(), req) - if err != nil { - fmt.Printf("Init client fail,err:%+v", err) - return - } if os.Args[1] == "put" { TestPutObject(os.Args[2], os.Args[3], os.Args[4]) diff --git a/docs/zh/design/oss/oss-api-design.md b/docs/zh/design/oss/oss-api-design.md index a1772e65ce..13f2cbf12f 100644 --- a/docs/zh/design/oss/oss-api-design.md +++ b/docs/zh/design/oss/oss-api-design.md @@ -24,8 +24,6 @@ oss原始配置模块的字段抽象如下所示: ```go // OssMetadata wraps the configuration of oss implementation type OssMetadata struct { - Buckets []string `json:"buckets"` // contained buckets in this oss client - Uid string `json:"uid"` // specify the uid of oss client Endpoint string `json:"endpoint"` AccessKeyID string `json:"accessKeyID"` AccessKeySecret string `json:"accessKeySecret"` @@ -33,37 +31,8 @@ type OssMetadata struct { } ``` -Endpoint、AccessKeyID、AccessKeySecret、Region是现有的oss都有的概念,本文主要解释buckets和uid字段的作用。 +Endpoint、AccessKeyID、AccessKeySecret、Region是现有的oss都有的概念,本文不做过多解释。 -场景假设: - -如果用户有多个oss实例,即需要layotto支持多个endpoint和region,需要怎么做? - -如果使用传统的sdk编程,用户编程时使用方式如下: - -```go -client1, err := oss.New(metadata.Endpoint1, metadata.AccessKeyID1, metadata.AccessKeySecret1) - -client2, err := oss.New(metadata.Endpoint2, metadata.AccessKeyID2, metadata.AccessKeySecret2) - -//将object1上传到endpoint1 -client1.PutObject("object1") -//将object2上传到endpoint2 -client2.PutObject("object2") - -``` - -从上面的编程方式可以看出,使用sdk编程时,用户可以拿到client的句柄,然后通过client句柄控制将文件上传到某个目标endpoint。 -但在Layotto中,用户往往是用同一个grpc client来进行服务调用。那么每次PutObject,GetObject等对象操作就需要用户指定文件操作的目标, -即文件操作的endpoint。 - -配置文件中的buckets和uid字段就是用来指定client。如下图所示: - -![img.png](../../../img/oss/configure.png) - -client选择流程图如下所示: - -![img.png](../../../img/oss/flow.png) ## 接口设计 @@ -77,58 +46,6 @@ client选择流程图如下所示: > https://help.aliyun.com/document_detail/31980.html > https://docs.min.io/docs/golang-client-api-reference.html -### InitClient - -该接口主要用于初始化操作,当前layotto组件的定义都有一个Init操作,该Init接口在Layotto启动的过程中就会执行,入参为配置文件的内容。如下所示: - -```go -type LockStore interface { - // Init lock - Init(metadata Metadata) error - // Get lock's features - Features() []Feature - // Node tries to acquire a lock - TryLock(req *TryLockRequest) (*TryLockResponse, error) - // Node tries to release a lock - Unlock(req *UnlockRequest) (*UnlockResponse, error) -} - -``` - -但在实际生产中,组件的初始化是很有可能依赖应用的启动,比如oss中的ak、sk的获取,一般不会在配置文件中进行明文的配置, -有可能是从应用测获取,也有可能是用户自定义方式获取。 因此InitClient用来触发client的初始化操作。于此同时,Oss组件的完整配置如下所示: - -```json -"oss": { - "oss_demo": { - "type": "awsOSS", - "method": "", - "metadata": [ - { - "region": "xxxxx", - "endpoint": "xxxxx", - "accessKeyID": "xxxx", - "accessKeySecret": "xxxxx" - } - ] - } -} - -``` - -method字段用来指定初始化函数,用户可以实现自定义初始化函数,即ak、sk的获取方式可以在自定义初始化函数中实现,该函数的定义如下: - -```go -type S3ClientInit func(staticConf json.RawMessage, dynConf map[string]string) (map[string]interface{}, error) -``` - -第一个参数为json中的静态配置,第二个为动态配置,可以来自于InitClient请求传递过来的数据,也可以是用户自己实现的数据源。 -用户则可以通过以下方式将自定义Init方法注册到layotto。 - -```go -factory.RegisterInitFunc("aws", AwsDefaultInitFunc) -``` - ### PutObject 对象上传接口,用作上传文件,是oss最基本能力。 diff --git a/pkg/grpc/extension/s3/s3.go b/pkg/grpc/extension/s3/s3.go index 6bf3e2c24f..5af67d788b 100644 --- a/pkg/grpc/extension/s3/s3.go +++ b/pkg/grpc/extension/s3/s3.go @@ -68,17 +68,6 @@ func (s *S3Server) Register(rawGrpcServer *rawGRPC.Server) error { return nil } -func (s *S3Server) InitClient(ctx context.Context, req *s3.InitInput) (*emptypb.Empty, error) { - if s.ossInstance[req.StoreName] == nil { - return nil, status.Errorf(codes.InvalidArgument, NotSupportStoreName, req.StoreName) - } - err := s.ossInstance[req.StoreName].InitClient(ctx, &l8s3.InitRequest{Metadata: req.Metadata}) - if err != nil { - log.DefaultLogger.Errorf("InitClient fail, err: %+v", err) - } - return &emptypb.Empty{}, err -} - func transferData(source interface{}, target interface{}) error { data, err := json.Marshal(source) if err != nil { diff --git a/pkg/grpc/extension/s3/s3_test.go b/pkg/grpc/extension/s3/s3_test.go index 00bd976bff..c7e27eb853 100644 --- a/pkg/grpc/extension/s3/s3_test.go +++ b/pkg/grpc/extension/s3/s3_test.go @@ -17,7 +17,6 @@ package s3 import ( "context" - "errors" "io" "testing" @@ -25,7 +24,6 @@ import ( mockoss "mosn.io/layotto/pkg/mock/components/oss" - lgrpc "google.golang.org/grpc" "mosn.io/pkg/buffer" mocks3 "mosn.io/layotto/pkg/mock/runtime/oss" @@ -55,36 +53,6 @@ func (m *MockDataStream) Close() error { return nil } -//TestInitClient -func TestInitClient(t *testing.T) { - // prepare oss server - ac := &grpc.ApplicationContext{AppId: "test", Oss: map[string]l8s3.Oss{}} - ctrl := gomock.NewController(t) - mockossServer := mockoss.NewMockOss(ctrl) - ac.Oss[MOCKSERVER] = mockossServer - NewS3Server(ac) - s3Server := &S3Server{appId: ac.AppId, ossInstance: ac.Oss} - err := s3Server.Init(nil) - assert.Nil(t, err) - server := lgrpc.NewServer() - err = s3Server.Register(server) - assert.Nil(t, err) - - // Test InitClient function - initReq := &s3.InitInput{StoreName: "NoStore", Metadata: map[string]string{"k": "v"}} - ctx := context.TODO() - _, err = s3Server.InitClient(ctx, initReq) - assert.Equal(t, status.Errorf(codes.InvalidArgument, NotSupportStoreName, "NoStore"), err) - mockossServer.EXPECT().InitClient(ctx, &l8s3.InitRequest{Metadata: initReq.Metadata}).Return(nil) - initReq.StoreName = MOCKSERVER - _, err = s3Server.InitClient(ctx, initReq) - assert.Nil(t, err) - mockossServer.EXPECT().InitClient(ctx, &l8s3.InitRequest{Metadata: initReq.Metadata}).Return(errors.New("init fail")) - _, err = s3Server.InitClient(ctx, initReq) - assert.Equal(t, err.Error(), "init fail") - -} - // TestGetObject func TestGetObject(t *testing.T) { // prepare oss server diff --git a/pkg/mock/components/oss/oss.go b/pkg/mock/components/oss/oss.go index 305e6739dc..eb325bb886 100644 --- a/pkg/mock/components/oss/oss.go +++ b/pkg/mock/components/oss/oss.go @@ -8,9 +8,9 @@ import ( context "context" reflect "reflect" - "mosn.io/layotto/components/oss" - gomock "github.com/golang/mock/gomock" + + oss "mosn.io/layotto/components/oss" ) // MockOss is a mock of Oss interface. @@ -216,32 +216,18 @@ func (mr *MockOssMockRecorder) HeadObject(arg0, arg1 interface{}) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HeadObject", reflect.TypeOf((*MockOss)(nil).HeadObject), arg0, arg1) } -// InitClient mocks base method. -func (m *MockOss) InitClient(arg0 context.Context, arg1 *oss.InitRequest) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "InitClient", arg0, arg1) - ret0, _ := ret[0].(error) - return ret0 -} - -// InitClient indicates an expected call of InitClient. -func (mr *MockOssMockRecorder) InitClient(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InitClient", reflect.TypeOf((*MockOss)(nil).InitClient), arg0, arg1) -} - -// InitConfig mocks base method. -func (m *MockOss) InitConfig(arg0 context.Context, arg1 *oss.OssConfig) error { +// Init mocks base method. +func (m *MockOss) Init(arg0 context.Context, arg1 *oss.OssConfig) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "InitConfig", arg0, arg1) + ret := m.ctrl.Call(m, "Init", arg0, arg1) ret0, _ := ret[0].(error) return ret0 } -// InitConfig indicates an expected call of InitConfig. -func (mr *MockOssMockRecorder) InitConfig(arg0, arg1 interface{}) *gomock.Call { +// Init indicates an expected call of Init. +func (mr *MockOssMockRecorder) Init(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InitConfig", reflect.TypeOf((*MockOss)(nil).InitConfig), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockOss)(nil).Init), arg0, arg1) } // IsObjectExist mocks base method. diff --git a/pkg/runtime/runtime.go b/pkg/runtime/runtime.go index 9ee2215b72..0b7ab81248 100644 --- a/pkg/runtime/runtime.go +++ b/pkg/runtime/runtime.go @@ -419,11 +419,11 @@ func (m *MosnRuntime) initOss(oss ...*oss.OssFactory) error { for name, config := range m.runtimeConfig.Oss { c, err := m.ossRegistry.Create(config.Type) if err != nil { - m.errInt(err, "create oss component %s failed", config.Type) + m.errInt(err, "create oss component %s failed", name) return err } - if err := c.InitConfig(context.TODO(), &config); err != nil { - m.errInt(err, "init oss component %s failed", config.Type) + if err := c.Init(context.TODO(), &config); err != nil { + m.errInt(err, "init oss component %s failed", name) return err } m.oss[name] = c @@ -440,7 +440,7 @@ func (m *MosnRuntime) initFiles(files ...*file.FileFactory) error { for name, config := range m.runtimeConfig.Files { c, err := m.fileRegistry.Create(config.Type) if err != nil { - m.errInt(err, "create files component %s failed", config.Type) + m.errInt(err, "create files component %s failed", name) return err } if err := c.Init(context.TODO(), &config); err != nil { diff --git a/spec/proto/extension/v1/oss.pb.go b/spec/proto/extension/v1/oss.pb.go index 6af511e4a2..166b88ffc5 100644 --- a/spec/proto/extension/v1/oss.pb.go +++ b/spec/proto/extension/v1/oss.pb.go @@ -7531,202 +7531,198 @@ var file_oss_proto_rawDesc = []byte{ 0x12, 0x33, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 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, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, - 0x70, 0x61, 0x72, 0x74, 0x73, 0x32, 0xff, 0x17, 0x0a, 0x14, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4a, - 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 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, 0x49, 0x6e, 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, 0x62, 0x0a, 0x09, 0x50, 0x75, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x1a, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x62, - 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x2e, 0x73, 0x70, + 0x70, 0x61, 0x72, 0x74, 0x73, 0x32, 0xb3, 0x17, 0x0a, 0x14, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x62, + 0x0a, 0x09, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x47, - 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x69, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x12, 0x2a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, + 0x28, 0x01, 0x12, 0x62, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, + 0x27, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x69, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2b, + 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, + 0x00, 0x12, 0x63, 0x0a, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 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, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 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, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x12, 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, 0x4c, 0x69, + 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x63, 0x0a, - 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 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, - 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 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, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x1a, 0x2c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x0a, + 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x48, + 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, + 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, + 0x73, 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, 0x49, 0x73, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, + 0x75, 0x0a, 0x10, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, + 0x69, 0x6e, 0x67, 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, 0x50, 0x75, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 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, 0x7e, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 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, 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, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, - 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, - 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x73, 0x70, 0x65, + 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x28, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, + 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 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, 0x7b, 0x0a, + 0x12, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, + 0x41, 0x63, 0x6c, 0x12, 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, 0x47, 0x65, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, + 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, 0x7b, 0x0a, 0x12, 0x50, 0x75, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, + 0x12, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x1a, 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, 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, 0x84, 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, 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, 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, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, - 0x0d, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, - 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x10, 0x50, - 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 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, 0x7e, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, 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, 0x32, 0x2e, 0x73, + 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, 0x65, + 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 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, 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, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, - 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2e, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, + 0x74, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, - 0x67, 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, 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, 0x7b, 0x0a, 0x12, 0x47, 0x65, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, - 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x1a, 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, 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, 0x7b, 0x0a, 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 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, 0x84, 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, 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, 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, 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, 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, 0x65, 0x0a, 0x0a, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 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, 0x55, 0x70, 0x6c, - 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, - 0x01, 0x12, 0x6f, 0x0a, 0x0e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, - 0x6f, 0x70, 0x79, 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, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0x00, 0x12, 0x8a, 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, 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, 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, 0x36, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, + 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x0e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, + 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, - 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, - 0x81, 0x01, 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, - 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 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, 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, 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, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, + 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x8a, 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, 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, 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, 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, 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, 0x81, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, - 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x32, 0x2e, 0x73, + 0x74, 0x22, 0x00, 0x12, 0x81, 0x01, 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 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, 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, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 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, 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, 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, 0x81, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, + 0x12, 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, 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, 0x60, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x61, 0x72, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x4c, - 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, - 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x12, 0x4c, 0x69, 0x73, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x1a, 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, 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, 0x5a, 0x0a, 0x07, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, - 0x4c, 0x12, 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, 0x53, 0x69, 0x67, 0x6e, - 0x55, 0x52, 0x4c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, + 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, 0x60, 0x0a, 0x09, 0x4c, + 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x12, 0x27, 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, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0x00, 0x12, 0x74, 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, 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, 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, 0x72, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, + 0x50, 0x61, 0x72, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7b, 0x0a, + 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 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, 0x4c, 0x69, + 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, + 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, 0x5a, 0x0a, 0x07, 0x53, 0x69, + 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x12, 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, + 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x74, 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, 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, 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, 0x6b, 0x0a, 0x0c, - 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2a, 0x2e, 0x73, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x72, 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, 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, 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, 0x6b, 0x0a, 0x0c, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 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, 0x41, 0x70, 0x70, 0x65, 0x6e, + 0x64, 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, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 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, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6c, 0x0a, 0x0d, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6c, 0x0a, + 0x0d, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, + 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, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -7861,62 +7857,60 @@ var file_oss_proto_depIdxs = []int32{ 78, // 32: spec.proto.extension.v1.HeadObjectOutput.result_metadata:type_name -> spec.proto.extension.v1.HeadObjectOutput.ResultMetadataEntry 79, // 33: spec.proto.extension.v1.AppendObjectInput.tags:type_name -> spec.proto.extension.v1.AppendObjectInput.TagsEntry 63, // 34: spec.proto.extension.v1.ListPartsOutput.parts:type_name -> spec.proto.extension.v1.Part - 0, // 35: spec.proto.extension.v1.ObjectStorageService.InitClient:input_type -> spec.proto.extension.v1.InitInput - 3, // 36: spec.proto.extension.v1.ObjectStorageService.PutObject:input_type -> spec.proto.extension.v1.PutObjectInput - 1, // 37: spec.proto.extension.v1.ObjectStorageService.GetObject:input_type -> spec.proto.extension.v1.GetObjectInput - 5, // 38: spec.proto.extension.v1.ObjectStorageService.DeleteObject:input_type -> spec.proto.extension.v1.DeleteObjectInput - 14, // 39: spec.proto.extension.v1.ObjectStorageService.CopyObject:input_type -> spec.proto.extension.v1.CopyObjectInput - 19, // 40: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:input_type -> spec.proto.extension.v1.DeleteObjectsInput - 22, // 41: spec.proto.extension.v1.ObjectStorageService.ListObjects:input_type -> spec.proto.extension.v1.ListObjectsInput - 53, // 42: spec.proto.extension.v1.ObjectStorageService.HeadObject:input_type -> spec.proto.extension.v1.HeadObjectInput - 55, // 43: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:input_type -> spec.proto.extension.v1.IsObjectExistInput - 7, // 44: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:input_type -> spec.proto.extension.v1.PutObjectTaggingInput - 9, // 45: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:input_type -> spec.proto.extension.v1.DeleteObjectTaggingInput - 11, // 46: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:input_type -> spec.proto.extension.v1.GetObjectTaggingInput - 26, // 47: spec.proto.extension.v1.ObjectStorageService.GetObjectCannedAcl:input_type -> spec.proto.extension.v1.GetObjectCannedAclInput - 28, // 48: spec.proto.extension.v1.ObjectStorageService.PutObjectCannedAcl:input_type -> spec.proto.extension.v1.PutObjectCannedAclInput - 32, // 49: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:input_type -> spec.proto.extension.v1.CreateMultipartUploadInput - 34, // 50: spec.proto.extension.v1.ObjectStorageService.UploadPart:input_type -> spec.proto.extension.v1.UploadPartInput - 36, // 51: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:input_type -> spec.proto.extension.v1.UploadPartCopyInput - 41, // 52: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:input_type -> spec.proto.extension.v1.CompleteMultipartUploadInput - 43, // 53: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:input_type -> spec.proto.extension.v1.AbortMultipartUploadInput - 45, // 54: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:input_type -> spec.proto.extension.v1.ListMultipartUploadsInput - 62, // 55: spec.proto.extension.v1.ObjectStorageService.ListParts:input_type -> spec.proto.extension.v1.ListPartsInput - 49, // 56: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:input_type -> spec.proto.extension.v1.ListObjectVersionsInput - 57, // 57: spec.proto.extension.v1.ObjectStorageService.SignURL:input_type -> spec.proto.extension.v1.SignURLInput - 59, // 58: spec.proto.extension.v1.ObjectStorageService.UpdateDownloadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput - 59, // 59: spec.proto.extension.v1.ObjectStorageService.UpdateUploadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput - 60, // 60: spec.proto.extension.v1.ObjectStorageService.AppendObject:input_type -> spec.proto.extension.v1.AppendObjectInput - 30, // 61: spec.proto.extension.v1.ObjectStorageService.RestoreObject:input_type -> spec.proto.extension.v1.RestoreObjectInput - 80, // 62: spec.proto.extension.v1.ObjectStorageService.InitClient:output_type -> google.protobuf.Empty - 4, // 63: spec.proto.extension.v1.ObjectStorageService.PutObject:output_type -> spec.proto.extension.v1.PutObjectOutput - 2, // 64: spec.proto.extension.v1.ObjectStorageService.GetObject:output_type -> spec.proto.extension.v1.GetObjectOutput - 6, // 65: spec.proto.extension.v1.ObjectStorageService.DeleteObject:output_type -> spec.proto.extension.v1.DeleteObjectOutput - 16, // 66: spec.proto.extension.v1.ObjectStorageService.CopyObject:output_type -> spec.proto.extension.v1.CopyObjectOutput - 21, // 67: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:output_type -> spec.proto.extension.v1.DeleteObjectsOutput - 23, // 68: spec.proto.extension.v1.ObjectStorageService.ListObjects:output_type -> spec.proto.extension.v1.ListObjectsOutput - 54, // 69: spec.proto.extension.v1.ObjectStorageService.HeadObject:output_type -> spec.proto.extension.v1.HeadObjectOutput - 56, // 70: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:output_type -> spec.proto.extension.v1.IsObjectExistOutput - 8, // 71: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:output_type -> spec.proto.extension.v1.PutObjectTaggingOutput - 10, // 72: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:output_type -> spec.proto.extension.v1.DeleteObjectTaggingOutput - 12, // 73: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:output_type -> spec.proto.extension.v1.GetObjectTaggingOutput - 27, // 74: spec.proto.extension.v1.ObjectStorageService.GetObjectCannedAcl:output_type -> spec.proto.extension.v1.GetObjectCannedAclOutput - 29, // 75: spec.proto.extension.v1.ObjectStorageService.PutObjectCannedAcl:output_type -> spec.proto.extension.v1.PutObjectCannedAclOutput - 33, // 76: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:output_type -> spec.proto.extension.v1.CreateMultipartUploadOutput - 35, // 77: spec.proto.extension.v1.ObjectStorageService.UploadPart:output_type -> spec.proto.extension.v1.UploadPartOutput - 38, // 78: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:output_type -> spec.proto.extension.v1.UploadPartCopyOutput - 42, // 79: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:output_type -> spec.proto.extension.v1.CompleteMultipartUploadOutput - 44, // 80: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:output_type -> spec.proto.extension.v1.AbortMultipartUploadOutput - 48, // 81: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:output_type -> spec.proto.extension.v1.ListMultipartUploadsOutput - 64, // 82: spec.proto.extension.v1.ObjectStorageService.ListParts:output_type -> spec.proto.extension.v1.ListPartsOutput - 52, // 83: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:output_type -> spec.proto.extension.v1.ListObjectVersionsOutput - 58, // 84: spec.proto.extension.v1.ObjectStorageService.SignURL:output_type -> spec.proto.extension.v1.SignURLOutput - 80, // 85: spec.proto.extension.v1.ObjectStorageService.UpdateDownloadBandwidthRateLimit:output_type -> google.protobuf.Empty - 80, // 86: spec.proto.extension.v1.ObjectStorageService.UpdateUploadBandwidthRateLimit:output_type -> google.protobuf.Empty - 61, // 87: spec.proto.extension.v1.ObjectStorageService.AppendObject:output_type -> spec.proto.extension.v1.AppendObjectOutput - 31, // 88: spec.proto.extension.v1.ObjectStorageService.RestoreObject:output_type -> spec.proto.extension.v1.RestoreObjectOutput - 62, // [62:89] is the sub-list for method output_type - 35, // [35:62] is the sub-list for method input_type + 3, // 35: spec.proto.extension.v1.ObjectStorageService.PutObject:input_type -> spec.proto.extension.v1.PutObjectInput + 1, // 36: spec.proto.extension.v1.ObjectStorageService.GetObject:input_type -> spec.proto.extension.v1.GetObjectInput + 5, // 37: spec.proto.extension.v1.ObjectStorageService.DeleteObject:input_type -> spec.proto.extension.v1.DeleteObjectInput + 14, // 38: spec.proto.extension.v1.ObjectStorageService.CopyObject:input_type -> spec.proto.extension.v1.CopyObjectInput + 19, // 39: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:input_type -> spec.proto.extension.v1.DeleteObjectsInput + 22, // 40: spec.proto.extension.v1.ObjectStorageService.ListObjects:input_type -> spec.proto.extension.v1.ListObjectsInput + 53, // 41: spec.proto.extension.v1.ObjectStorageService.HeadObject:input_type -> spec.proto.extension.v1.HeadObjectInput + 55, // 42: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:input_type -> spec.proto.extension.v1.IsObjectExistInput + 7, // 43: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:input_type -> spec.proto.extension.v1.PutObjectTaggingInput + 9, // 44: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:input_type -> spec.proto.extension.v1.DeleteObjectTaggingInput + 11, // 45: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:input_type -> spec.proto.extension.v1.GetObjectTaggingInput + 26, // 46: spec.proto.extension.v1.ObjectStorageService.GetObjectCannedAcl:input_type -> spec.proto.extension.v1.GetObjectCannedAclInput + 28, // 47: spec.proto.extension.v1.ObjectStorageService.PutObjectCannedAcl:input_type -> spec.proto.extension.v1.PutObjectCannedAclInput + 32, // 48: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:input_type -> spec.proto.extension.v1.CreateMultipartUploadInput + 34, // 49: spec.proto.extension.v1.ObjectStorageService.UploadPart:input_type -> spec.proto.extension.v1.UploadPartInput + 36, // 50: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:input_type -> spec.proto.extension.v1.UploadPartCopyInput + 41, // 51: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:input_type -> spec.proto.extension.v1.CompleteMultipartUploadInput + 43, // 52: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:input_type -> spec.proto.extension.v1.AbortMultipartUploadInput + 45, // 53: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:input_type -> spec.proto.extension.v1.ListMultipartUploadsInput + 62, // 54: spec.proto.extension.v1.ObjectStorageService.ListParts:input_type -> spec.proto.extension.v1.ListPartsInput + 49, // 55: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:input_type -> spec.proto.extension.v1.ListObjectVersionsInput + 57, // 56: spec.proto.extension.v1.ObjectStorageService.SignURL:input_type -> spec.proto.extension.v1.SignURLInput + 59, // 57: spec.proto.extension.v1.ObjectStorageService.UpdateDownloadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput + 59, // 58: spec.proto.extension.v1.ObjectStorageService.UpdateUploadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput + 60, // 59: spec.proto.extension.v1.ObjectStorageService.AppendObject:input_type -> spec.proto.extension.v1.AppendObjectInput + 30, // 60: spec.proto.extension.v1.ObjectStorageService.RestoreObject:input_type -> spec.proto.extension.v1.RestoreObjectInput + 4, // 61: spec.proto.extension.v1.ObjectStorageService.PutObject:output_type -> spec.proto.extension.v1.PutObjectOutput + 2, // 62: spec.proto.extension.v1.ObjectStorageService.GetObject:output_type -> spec.proto.extension.v1.GetObjectOutput + 6, // 63: spec.proto.extension.v1.ObjectStorageService.DeleteObject:output_type -> spec.proto.extension.v1.DeleteObjectOutput + 16, // 64: spec.proto.extension.v1.ObjectStorageService.CopyObject:output_type -> spec.proto.extension.v1.CopyObjectOutput + 21, // 65: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:output_type -> spec.proto.extension.v1.DeleteObjectsOutput + 23, // 66: spec.proto.extension.v1.ObjectStorageService.ListObjects:output_type -> spec.proto.extension.v1.ListObjectsOutput + 54, // 67: spec.proto.extension.v1.ObjectStorageService.HeadObject:output_type -> spec.proto.extension.v1.HeadObjectOutput + 56, // 68: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:output_type -> spec.proto.extension.v1.IsObjectExistOutput + 8, // 69: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:output_type -> spec.proto.extension.v1.PutObjectTaggingOutput + 10, // 70: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:output_type -> spec.proto.extension.v1.DeleteObjectTaggingOutput + 12, // 71: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:output_type -> spec.proto.extension.v1.GetObjectTaggingOutput + 27, // 72: spec.proto.extension.v1.ObjectStorageService.GetObjectCannedAcl:output_type -> spec.proto.extension.v1.GetObjectCannedAclOutput + 29, // 73: spec.proto.extension.v1.ObjectStorageService.PutObjectCannedAcl:output_type -> spec.proto.extension.v1.PutObjectCannedAclOutput + 33, // 74: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:output_type -> spec.proto.extension.v1.CreateMultipartUploadOutput + 35, // 75: spec.proto.extension.v1.ObjectStorageService.UploadPart:output_type -> spec.proto.extension.v1.UploadPartOutput + 38, // 76: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:output_type -> spec.proto.extension.v1.UploadPartCopyOutput + 42, // 77: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:output_type -> spec.proto.extension.v1.CompleteMultipartUploadOutput + 44, // 78: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:output_type -> spec.proto.extension.v1.AbortMultipartUploadOutput + 48, // 79: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:output_type -> spec.proto.extension.v1.ListMultipartUploadsOutput + 64, // 80: spec.proto.extension.v1.ObjectStorageService.ListParts:output_type -> spec.proto.extension.v1.ListPartsOutput + 52, // 81: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:output_type -> spec.proto.extension.v1.ListObjectVersionsOutput + 58, // 82: spec.proto.extension.v1.ObjectStorageService.SignURL:output_type -> spec.proto.extension.v1.SignURLOutput + 80, // 83: spec.proto.extension.v1.ObjectStorageService.UpdateDownloadBandwidthRateLimit:output_type -> google.protobuf.Empty + 80, // 84: spec.proto.extension.v1.ObjectStorageService.UpdateUploadBandwidthRateLimit:output_type -> google.protobuf.Empty + 61, // 85: spec.proto.extension.v1.ObjectStorageService.AppendObject:output_type -> spec.proto.extension.v1.AppendObjectOutput + 31, // 86: spec.proto.extension.v1.ObjectStorageService.RestoreObject:output_type -> spec.proto.extension.v1.RestoreObjectOutput + 61, // [61:87] is the sub-list for method output_type + 35, // [35:61] is the sub-list for method input_type 35, // [35:35] is the sub-list for extension type_name 35, // [35:35] is the sub-list for extension extendee 0, // [0:35] is the sub-list for field type_name diff --git a/spec/proto/extension/v1/oss.proto b/spec/proto/extension/v1/oss.proto index 8ffa7488e7..c3d9cafdd7 100644 --- a/spec/proto/extension/v1/oss.proto +++ b/spec/proto/extension/v1/oss.proto @@ -10,9 +10,6 @@ import "google/protobuf/empty.proto"; option go_package = "mosn.io/layotto/spec/proto/extension/v1;s3"; service ObjectStorageService{ - //Init oss client - rpc InitClient(InitInput) returns (google.protobuf.Empty){} - //Object CRUD API //Adds an object to a bucket. //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html diff --git a/spec/proto/extension/v1/oss_grpc.pb.go b/spec/proto/extension/v1/oss_grpc.pb.go index 80cdc6598c..231edf398b 100644 --- a/spec/proto/extension/v1/oss_grpc.pb.go +++ b/spec/proto/extension/v1/oss_grpc.pb.go @@ -24,8 +24,6 @@ const _ = grpc.SupportPackageIsVersion7 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type ObjectStorageServiceClient interface { - //Init oss client - InitClient(ctx context.Context, in *InitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) //Object CRUD API //Adds an object to a bucket. //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html @@ -117,15 +115,6 @@ func NewObjectStorageServiceClient(cc grpc.ClientConnInterface) ObjectStorageSer return &objectStorageServiceClient{cc} } -func (c *objectStorageServiceClient) InitClient(ctx context.Context, in *InitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/spec.proto.extension.v1.ObjectStorageService/InitClient", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *objectStorageServiceClient) PutObject(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_PutObjectClient, error) { stream, err := c.cc.NewStream(ctx, &ObjectStorageService_ServiceDesc.Streams[0], "/spec.proto.extension.v1.ObjectStorageService/PutObject", opts...) if err != nil { @@ -462,8 +451,6 @@ func (c *objectStorageServiceClient) RestoreObject(ctx context.Context, in *Rest // All implementations should embed UnimplementedObjectStorageServiceServer // for forward compatibility type ObjectStorageServiceServer interface { - //Init oss client - InitClient(context.Context, *InitInput) (*emptypb.Empty, error) //Object CRUD API //Adds an object to a bucket. //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html @@ -551,9 +538,6 @@ type ObjectStorageServiceServer interface { type UnimplementedObjectStorageServiceServer struct { } -func (UnimplementedObjectStorageServiceServer) InitClient(context.Context, *InitInput) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method InitClient not implemented") -} func (UnimplementedObjectStorageServiceServer) PutObject(ObjectStorageService_PutObjectServer) error { return status.Errorf(codes.Unimplemented, "method PutObject not implemented") } @@ -644,24 +628,6 @@ func RegisterObjectStorageServiceServer(s grpc.ServiceRegistrar, srv ObjectStora s.RegisterService(&ObjectStorageService_ServiceDesc, srv) } -func _ObjectStorageService_InitClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(InitInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ObjectStorageServiceServer).InitClient(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/spec.proto.extension.v1.ObjectStorageService/InitClient", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ObjectStorageServiceServer).InitClient(ctx, req.(*InitInput)) - } - return interceptor(ctx, in, info, handler) -} - func _ObjectStorageService_PutObject_Handler(srv interface{}, stream grpc.ServerStream) error { return srv.(ObjectStorageServiceServer).PutObject(&objectStorageServicePutObjectServer{stream}) } @@ -1164,10 +1130,6 @@ var ObjectStorageService_ServiceDesc = grpc.ServiceDesc{ ServiceName: "spec.proto.extension.v1.ObjectStorageService", HandlerType: (*ObjectStorageServiceServer)(nil), Methods: []grpc.MethodDesc{ - { - MethodName: "InitClient", - Handler: _ObjectStorageService_InitClient_Handler, - }, { MethodName: "DeleteObject", Handler: _ObjectStorageService_DeleteObject_Handler, From 848d217475d36f20133763682199519d666407a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 20 Jul 2022 18:15:17 +0800 Subject: [PATCH 105/126] rename oss configure name --- configs/{oss.json => config_oss.json} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename configs/{oss.json => config_oss.json} (100%) diff --git a/configs/oss.json b/configs/config_oss.json similarity index 100% rename from configs/oss.json rename to configs/config_oss.json From 0927deff0beb53756f1919ead3eb760b63b3634c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Wed, 20 Jul 2022 18:17:36 +0800 Subject: [PATCH 106/126] fix comments --- spec/proto/extension/v1/oss.proto | 4 ++-- spec/proto/extension/v1/oss_grpc.pb.go | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/spec/proto/extension/v1/oss.proto b/spec/proto/extension/v1/oss.proto index c3d9cafdd7..3c3c55335b 100644 --- a/spec/proto/extension/v1/oss.proto +++ b/spec/proto/extension/v1/oss.proto @@ -35,7 +35,7 @@ service ObjectStorageService{ //This action used to check if the file exists. rpc IsObjectExist(IsObjectExistInput) returns(IsObjectExistOutput){} - //Object Label Operation API + //Object Tagging API //Sets the supplied tag-set to an object that already exists in a bucket. //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html rpc PutObjectTagging(PutObjectTaggingInput) returns (PutObjectTaggingOutput){} @@ -92,7 +92,7 @@ service ObjectStorageService{ //Refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2096 rpc UpdateUploadBandwidthRateLimit(UpdateBandwidthRateLimitInput) returns(google.protobuf.Empty){} - //This action used to append object. + //This action is used to append object. //Refer https://help.aliyun.com/document_detail/31981.html or https://github.com/minio/minio-java/issues/980 rpc AppendObject(stream AppendObjectInput) returns(AppendObjectOutput){} diff --git a/spec/proto/extension/v1/oss_grpc.pb.go b/spec/proto/extension/v1/oss_grpc.pb.go index 231edf398b..e85c362a6d 100644 --- a/spec/proto/extension/v1/oss_grpc.pb.go +++ b/spec/proto/extension/v1/oss_grpc.pb.go @@ -48,7 +48,7 @@ type ObjectStorageServiceClient interface { HeadObject(ctx context.Context, in *HeadObjectInput, opts ...grpc.CallOption) (*HeadObjectOutput, error) //This action used to check if the file exists. IsObjectExist(ctx context.Context, in *IsObjectExistInput, opts ...grpc.CallOption) (*IsObjectExistOutput, error) - //Object Label Operation API + //Object Tagging API //Sets the supplied tag-set to an object that already exists in a bucket. //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html PutObjectTagging(ctx context.Context, in *PutObjectTaggingInput, opts ...grpc.CallOption) (*PutObjectTaggingOutput, error) @@ -99,7 +99,7 @@ type ObjectStorageServiceClient interface { //This action used to set upload bandwidth limit speed. //Refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2096 UpdateUploadBandwidthRateLimit(ctx context.Context, in *UpdateBandwidthRateLimitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) - //This action used to append object. + //This action is used to append object. //Refer https://help.aliyun.com/document_detail/31981.html or https://github.com/minio/minio-java/issues/980 AppendObject(ctx context.Context, opts ...grpc.CallOption) (ObjectStorageService_AppendObjectClient, error) //Restores an archived copy of an object back. @@ -475,7 +475,7 @@ type ObjectStorageServiceServer interface { HeadObject(context.Context, *HeadObjectInput) (*HeadObjectOutput, error) //This action used to check if the file exists. IsObjectExist(context.Context, *IsObjectExistInput) (*IsObjectExistOutput, error) - //Object Label Operation API + //Object Tagging API //Sets the supplied tag-set to an object that already exists in a bucket. //Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html PutObjectTagging(context.Context, *PutObjectTaggingInput) (*PutObjectTaggingOutput, error) @@ -526,7 +526,7 @@ type ObjectStorageServiceServer interface { //This action used to set upload bandwidth limit speed. //Refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2096 UpdateUploadBandwidthRateLimit(context.Context, *UpdateBandwidthRateLimitInput) (*emptypb.Empty, error) - //This action used to append object. + //This action is used to append object. //Refer https://help.aliyun.com/document_detail/31981.html or https://github.com/minio/minio-java/issues/980 AppendObject(ObjectStorageService_AppendObjectServer) error //Restores an archived copy of an object back. From ee0cd8a6eea88e2ff68021de8ac7f93e24a2a1fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Thu, 21 Jul 2022 12:09:17 +0800 Subject: [PATCH 107/126] fix comments --- cmd/layotto/main.go | 4 ++-- cmd/layotto_multiple_api/main.go | 4 ++-- cmd/layotto_without_xds/main.go | 4 ++-- configs/config_oss.json | 2 +- docs/zh/design/oss/oss-api-design.md | 8 ++++---- docs/zh/start/oss/oss.md | 4 ++-- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/cmd/layotto/main.go b/cmd/layotto/main.go index 2327f8c4ef..0b55f25c24 100644 --- a/cmd/layotto/main.go +++ b/cmd/layotto/main.go @@ -285,8 +285,8 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp file.NewFileFactory("qiniuOSS", qiniu.NewQiniuOSS), ), runtime.WithOssFactory( - oss.NewOssFactory("awsOSS", aws2.NewAwsOss), - oss.NewOssFactory("aliyunOSS", aliyun2.NewAliyunOss), + oss.NewOssFactory("aws.oss", aws2.NewAwsOss), + oss.NewOssFactory("aliyun.oss", aliyun2.NewAliyunOss), ), // PubSub runtime.WithPubSubFactory( diff --git a/cmd/layotto_multiple_api/main.go b/cmd/layotto_multiple_api/main.go index 2ea5249800..c2fbc2343b 100644 --- a/cmd/layotto_multiple_api/main.go +++ b/cmd/layotto_multiple_api/main.go @@ -297,8 +297,8 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp //OSS runtime.WithOssFactory( - oss.NewOssFactory("awsOSS", aws2.NewAwsOss), - oss.NewOssFactory("aliyunOSS", aliyun2.NewAliyunOss), + oss.NewOssFactory("aws.oss", aws2.NewAwsOss), + oss.NewOssFactory("aliyun.oss", aliyun2.NewAliyunOss), ), // PubSub diff --git a/cmd/layotto_without_xds/main.go b/cmd/layotto_without_xds/main.go index c4dcf16547..417796f3b1 100644 --- a/cmd/layotto_without_xds/main.go +++ b/cmd/layotto_without_xds/main.go @@ -401,8 +401,8 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp //OSS runtime.WithOssFactory( - oss.NewOssFactory("awsOSS", aws2.NewAwsOss), - oss.NewOssFactory("aliyunOSS", aliyun2.NewAliyunOss), + oss.NewOssFactory("aws.oss", aws2.NewAwsOss), + oss.NewOssFactory("aliyun.oss", aliyun2.NewAliyunOss), ), // Sequencer diff --git a/configs/config_oss.json b/configs/config_oss.json index 7ab2509627..2d8401920b 100644 --- a/configs/config_oss.json +++ b/configs/config_oss.json @@ -18,7 +18,7 @@ "grpc_config": { "oss": { "oss_demo": { - "type": "awsOSS", + "type": "aws.oss", "metadata": [ { "region": "your-oss-resource-region", diff --git a/docs/zh/design/oss/oss-api-design.md b/docs/zh/design/oss/oss-api-design.md index 13f2cbf12f..73cf863e33 100644 --- a/docs/zh/design/oss/oss-api-design.md +++ b/docs/zh/design/oss/oss-api-design.md @@ -152,10 +152,10 @@ Endpoint、AccessKeyID、AccessKeySecret、Region是现有的oss都有的概念 -> [https://help.aliyun.com/document_detail/100676.html](https://help.aliyun.com/document_detail/100676.html) 阿里云object acl类型 -> [https://cloud.tencent.com/document/product/436/30752#.E9.A2.84.E8.AE.BE.E7.9A.84-acl](https://cloud.tencent.com/document/product/436/30752#.E9.A2.84.E8.AE.BE.E7.9A.84-acl) 腾讯云acl类型 -> [https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL) -> [https://github.com/minio/minio/issues/8195](https://github.com/minio/minio/issues/8195) 对于minio是否应该支持acl的讨论 +> [https://help.aliyun.com/document_detail/100676.html](https://help.aliyun.com/document_detail/100676.html) 阿里云object acl类型 +> [https://cloud.tencent.com/document/product/436/30752#.E9.A2.84.E8.AE.BE.E7.9A.84-acl](https://cloud.tencent.com/document/product/436/30752#.E9.A2.84.E8.AE.BE.E7.9A.84-acl) 腾讯云acl类型 +> [https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL) +> [https://github.com/minio/minio/issues/8195](https://github.com/minio/minio/issues/8195) 对于minio是否应该支持acl的讨论 ### PutObjectCannedAcl diff --git a/docs/zh/start/oss/oss.md b/docs/zh/start/oss/oss.md index 171b9c48b9..131e621676 100644 --- a/docs/zh/start/oss/oss.md +++ b/docs/zh/start/oss/oss.md @@ -13,7 +13,7 @@ layotto提供了aws的配置文件`configs/oss.json`,配置文件内容如下 "grpc_config": { "oss": { "oss_demo": { - "type": "awsOSS", + "type": "aws.oss", "metadata": [ { "region": "your-oss-resource-region", @@ -27,7 +27,7 @@ layotto提供了aws的配置文件`configs/oss.json`,配置文件内容如下 } ``` -配置主要包含四个字段,需要替换成自己的OSS账号的配置。type当前支持aliyunOSS和awsOSS两种类型,分别对应阿里云的OSS服务和亚马逊云的OSS服务。用户可以根据自己的实际场景 +配置主要包含四个字段,需要替换成自己的OSS账号的配置。type当前支持aliyun.oss和aws.oss两种类型,分别对应阿里云的OSS服务和亚马逊云的OSS服务。用户可以根据自己的实际场景 进行配置。 配置好后,切换目录: From e30627757c4c9bad2cecd049437f959eb75c04d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Thu, 21 Jul 2022 12:22:10 +0800 Subject: [PATCH 108/126] add comments for acl operation --- docs/img/oss/configure.png | Bin 367744 -> 0 bytes docs/img/oss/flow.png | Bin 764097 -> 0 bytes spec/proto/extension/v1/oss.proto | 4 ++++ spec/proto/extension/v1/oss_grpc.pb.go | 8 ++++++++ 4 files changed, 12 insertions(+) delete mode 100644 docs/img/oss/configure.png delete mode 100644 docs/img/oss/flow.png diff --git a/docs/img/oss/configure.png b/docs/img/oss/configure.png deleted file mode 100644 index 7b9afe649ea6512b12dcfa5400250e451b0f411e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 367744 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�Vn2{-@p)X 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%0AjN!TC=D3yd2nBcmD!4O1ZsLW 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

    `(Q0eyUL>rf7A-DSglCMh1}Gzq|VY$oZD1 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 z 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 z%0D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

    $C>+=#Wt!VDl(*0S?7u7snqdwR-s5J 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 diff --git a/docs/img/oss/flow.png b/docs/img/oss/flow.png deleted file mode 100644 index 3ac7a58b6cd2572388270797b21ab05c960e60ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 764097 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%0Aq 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

    D4b{g$N<9A&H5PthNIV?mg1h?m6SI?)GtQ+j+ z9&9q0$J^HgTfui&)z7NeW6c+zquRz1d_dFHiVc`sljf{D?{mr#>=LpUEd7gkllg$d z=*s8%NW3yTIouU7kwrr!A8ylHnu-U373@4>lhKiMkoTJRK>SCs8gmm*iOqDU&_?2; zPuFN-n%+p>a}mzDTI6t}fo6b)=mSraq{!!16E>b0e>^a4>@>vFpE+`WhARMO zUvAB={l6e2oGtr@N22&6`0Lh@JzC`Z^~;y z^q2%Lzqg>(OAm=d9tyUquZ@AQBCwHK-CU%O{xVtA!oM_$C-k}pAL}`ryI<`8DZ`z3FK7eh z!#WMA>BTPJ80F+foGF}R$cz*~Tpprj7-!u5>Q#kJUEj*B>=^e*J^(4tR~Lt5nL*8UG@!~A-sS>dcsSU{0%yg}}6+sBYZBO@z{�-2waVLCtN=J#E7a2v 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 -rhp>-)apJYXSf3Pza4y_z(nPz-)&c?}g> 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

  • F-EC~Yi#B(XL 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
    yjXZ2+r3Sd%bP^qX}OG;5|w2js3rIuQCQg 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

    BZfX)4 zWz#jdg)ti-#l>OI$qTD{*th~CbW}$pm+oG18(WYjSWwO2d?GfsX>e!h~ z2IBNmtJ){<7RK?LsN!{V+Nbf=xEJFC-ict9}&nanm$^-8?j5>v(ZD`2Y`8}{;Ok%;S9!^(spn}mj zy%D;Yj|10fYN6@^GA1i7rj=fvfmC{|7)ZQbKf^AkrgG@V~)ws$Zde?5N!V4)p~M& zsTz-#t=dg}i+&+~LakyI>vAjUgU7lS01UpzDM46wXBF|p?%M@kb-+U8ly=vk*K$5B znml~v@ksgmw*>uyL+M<#vzT7Lzrnu;6M~#Jt*7Tbfp9qM&czr9XcBZ!CV7p5cHFv;#^vx;cs*6-dp zR&+{?>FRoSRPQs;)d;XF^CLcP1F2m=Z1T)}AIgSF>2(K@(t*Zd92a~n#}ga(V7kRL zIvv58_oVCLyse_0r%3ZFi%HEw_oll5@FTJAA)kXtf7%^N2Ili94gHVi$LHX9YQ$d{ z0Ss8oac;pq6Qg1ZZPTBe^nZMMsO@$Egz&sagZic&5OPQ(MXSNhw-iNu{2s>%ujX2I&=ZY*` z0BdZd0*ZE>2KPZj@0?;yYRS6*_oCLEERJ#1NS@&IQ*;31?heL4=g`RVKl-nvuP=SOfYOi{haisgG@dt4;Mghhs0Vnhplv%1ILB_ zbq$N&@RMy>8OVGF9>`tFfc=gOGPQD>=(^nZ52~G5&1Gj+!Yg+VN)YXxU3e1lc%JvQ zD1aWkrgTH`J|I#lU=Hpu@UAFp?;oH(pRlyiDz~iCQT~NX12)cVb3kaIc^1b=FIw)x zaGbw;pX{Y+nL0NY1O@^zE=c`Q@2SW$k5=_qaz}%y6oiBh`xjdCOqTD}9GKfWy-)Jl z2?S7l?eUJOQQ4unZSKeOxlpMYqU&mHx9=6>XhflCHnFbyC2*>c7$sAq?g#+0Rm3Pz zn)&Q@Z#WzH?~8{_CjDJ@S)A>C#z21nFsgh6N^o3X7!cP$)j=jT zvH;o!wM}osR+!i|@WW;Y=0MO zn_~8Wp|{EBm(si4((VHbz9R6*gAU#sYH+iLh{)=Grw2$Qf=H&ATouOmOCn12K+S%s z?qz-{b;gw|@2@;jQ!z~34NvDV4|SVb_(NlIki$9n@jjo9WUdIG$?E?4&yv7;%fLXX z-$m!^zo`}Lbc3joZQT#dVL_XtfiZ$=o+f`je~ZN_2I{R<9t-)8gn!$G6X~!ECCck9 zDl60^aepE$kt>0ug_ZqNA3`}X9x8>5e)&ajT72)qzY?qL5fD#9vWSvWdMID#=H9n> zr|{s*Oq18E;Exx1e{#J({7a}TCcz|le{x&{AH?0&$g+NjYj;+ z+5YC~vh2V4*LX!fjGq=n+wX*+*7&dv&zUg0bk4n==7KcdfnZ{1Uw(Jyo^X|c1oj+a+y)*P9B^Yt5kck;q{H{0 zbsU3r?bGiw%l-^hveW4arM!L8Y39lW(N}xL5II9P14*9ru1f~0u;U%LKjLP z`Q9J2u4w;xyPHTE=f=gNyf~VibP?dqb%&$)NCY0});%lmU21%eyhdGY{$w0emFXie zso3uP--XW+U$V=F2F#M852ax4iix=M0onF#iCw@;hT)BZm493HBoNfyT49`l@@wCo zy`_LxHRBR;tUNcKd$j-ax%{hqD%DW<=sGAvzkr_CrUab#Vc~R$iIQ+VSR21LB~VD= ztTZ8gCitK9LUG{Z*w6lDi6q_M#`nuwu(!B>Xn~Ip-wZyee~z@CLQ%hsw*Ad`BOqic zvMd0z6CON&L4IJQfa*Dq2VQXjCR+`vqz|LYM9RW_p)qzI%=_wQZXfo>NKfFkW#IWR z9lC+02|6d~|E_BYcY!lQb6MoQGjafCITtxWPHTp;O;6VQfjP`co||DEPyYqjbL>G^ zfv?$u#k*`sY~+*_`E$n^=z-YfPzYQoG5d}4a{R|V%*_C9OdLW z!hk^k>mMR;jxj5{Ih1oNE<8~Z|Bzg|_(84=mMo_D^RrNARrg#+f$3>X{Yi8!$c~6m z)`?WQJnpBT5nlPd!X^J3(YSgVjx-T4br0(H6ZuCEhOcxOJR|f!7*&9;@O<}q5u*f@ z`VSiYQ+Nn!jXo>f+Z|5ww;+d6Mk%Jz`w%V;73D~4TaB^RB(}aCW$o$wuyXDTkNkCg@y~-Z%N6CKM&rh1 zX873@AW6&ubKI@?)`Qknsy^$uJmQX^T76PvrEun*dBcTR@?9!A|nI|tlk^GONbp-!m=R8yX_ZLZN@pT1o5Ax)Y7hH>1yg&Q zy3M!e-#+wbS+~=V3a@cy`0r(R^yr(2c~%Vl(XabS`GLUXH&fw0`=Z+G(^0p;jFC6e zGhg-q*37;ACyKLY&xsGRBp|)r>0$8S?04RkZbaNWn{hxvsDI~OyzUXu#vsg*)*9ih zz>U@XeUSdutG+K{cVhX#QlZ0+qj}r-EHg59&d_Ot%dV>JEphd^zY1BV!qo3BwEG0R zniocP*sr2j_{L9@%=P0Y$xMpDwoJQJMNH$KaN{Qo+PExs3HW~^eyRpx5SE^L-w16u zM-?0ud+#vc1UW1REJ5E;5wa<8@SdClwk&8h_h5X+p=Yu5YF ziTNvCVV8IQ9zVSDSU5KFr)4}Z+S%^<91pbIhZQ{JA|a<0K81v}>69^T(wu8q4ia-u zTaF%}H2-LO%U110A5DBsxQ{IJ>6k8eFs(H1erDuk@}AtYG$I4!vpB!9UAgmv1)0(- zv}%%PI)}E~2ZCJty}Xj*0t;~2K}gx!;x^nyb2%`w89rNjAGRkxtmr1vU3t5d;wRI? zob0{bdEUm)lBZ-3f5BgaL>;$oZw^Ql?Th8aK66zK$sv8L&>dduhA#7c2B#0EEXQiKgqT!F^zRt zl|E{P#s z%h;WzY*EzCgw}T#eSWuZHdwa%_ucNOsJZOjaw&YLb@wA#jdF#Q(&V|#C4SjBq_;7LNfb20 zvGALhBC6ZEL#Jfx?bZv_W^*OUd|cBNL&D~Vbz+RwME+ZExwI*-IwyZWn4-|OobKMP zV=hFWx;1Bg#qxm2!#2pSJZ2{<j5?%IGV*`O+X@!HnLGd{u0@e2XH3Vf=1y(vikSKzF%~%p6Jdzs z`#GW<@EC)kMcM@qUc|*xEsV;*?JQfdk%kcQAkC@@Q)%3lsQZ(g&b@Wd%?*E!coofM zI^B1uc`^|*O00Vz-EKmReyPk2)c#C+pL}E}uTBFxih81depoy4y{=Q<18JT(1)3rBeW9>2~ z6Mn2Ap4Lz8QEdwLZ*H8uRJqHP$K_1ju(H@7QJ`ociwi24+M-!a@Gvkx@I^oqcsbb0? z#(J#pF3!wO5GGO;fEAxK%ay$dmO=KQ{PXxXsw}Q7lMajCT$w9Z;68;y6yu#}(RLb~ zt9MQeD_G{%bsiW&C#$3u6dnqi72+zXq3sUcETfd=Q2i?$xh*uUKF45Xtv2asvIffUzo9#ZIti4@D}OFq zW@=@CEC2Z9C@T1P)JC66fJWs#(saU%W}9VQY3_SVTAo|?6U~6YBO`Nk)TVW%d`-#h zAA5mDGDz`dBTH$C$}x`yKl+ffSCvE%8Y;{Yc~io?yOqYo z{w#j)VA?|%5Sk*0Ua^b{56B_^TGz9HHdg7Ul!601G_vISRmncrBgyyOqa zDE?>Skkr8sB*x+?;qBAQD~wo-eleu2RN=<=436-3Mmo;&p%ve6)--OuuVAikFLM?1 zv=7sq#4H|$aom=rRge`FmIIeBCZUdnam|JBQO>32QWI2CkQC-ivX zxf5EK?F+9%wCwZWiRlE><%?-QV&Q8g*G|k&4U3r#%vaIwYkP}v1%86RSDrWPzJoY} z)&?AIidP)YzDpMJz%@7f*)utTDaBzP#+lBH3O&9T*Im>r2#`c9^?v@z1v!@5u$pUT zqK1qhk(zm_Ve+bO3ke)r{27~s*5ivQycz+LTZ#Py_Oi$1!Z&f@+}#BBG+DR4t8Q$h z;2>TQXGVc?S`&173*O4pEwUp7tEu-vOPJ~1T0z48eKqhGDpyDOq?mJjoiaVRHR-?H zJQn6SrA)n6L_sn02sk0Q&gv`rmeaurGoe-=?%F5clyv6GP0+dgt?zei5xDLvbUJ!DDnQiZj28I~Xu>{;e2RlkgA z@Zpoh1Ke-5>Gkjca7<&A&it*Uki z|GtWFMDU;_iy&e@NTrz2YX~51f#0+tgS%o-Fud(CYpaS8!nC5DP){;{t_rQ;>M&n~ zN1Z_1zzq(1>D>`T2a>@k*$-4b?^Y4uW;AX_K9Y~d5Oe@lO(iC( zoUzf|j0-Z}PTWp_n{McX9*x8k|GOnEo{eGbDX;s&1Vy#F+F-gcJojCT2aqWpGcPsX znt3$9`%K2|WW|}>HVh|yKo5`)`kg_~XxO&EsC6#_LIJ`c!2ngfTPCg6#g96U-5hy5 z5Lu61Mkp3P1R0opcgpi77_tA&_|9kQOVK0U2u#V0-LU+_Gv;wpv>xu2_caJ-xp|;u z-)4gV13|sxWSvb=o zb)i95sQKr}t>>gr>wBl4c9Lo;@4WcMv@lP8&-wXRtk0X1S0NR!@v`goB9o|dsE#Fa z_K{{c!C^K3W%n?8?7{G4nECnZ1r5)uLH9#H-J9?E1Mk&I3KVFkc~c%0#i;hFVgWdu zFA(vMmYC)&|0#$tHcs~3ein>qcl*M+vD8n%O-SMNUJvU(-EQtYG}uERWFV}!mKi_2S*eD?ikrM6lB#nw57WnhyQL!R`9PeOl5+o_YdQ|*UvTlNyBM#VWZ zO71sQOc+?)@QGJ~UookcGi~G9p72<>=EI!WVS}pYFBUMQb}O(ahpPiv1>Vnn{hW%U z{NI^4Uygx=^C>FtGD8j9OpMY~=9L0!`^i(&SWMT3-z3r=}6J zxT6Ki;`hckb4hIP7xvqX8FXnFDg?ZvvSutOs}y*#YKUcS@7W=FZbo?+n-A7VqE-**l>V3^2B6t#7w|U5+X6zOej90;aCL` zjDI*bu&RGJHj#twjh*^bmjIv%kZj^Be^!tr#ZosjL8v5{X5L|c(wd9%`HSU%X!&u3 zRldE>MKOpxrXihEgSDopukg}yoXtD_^;0r*Ct+i~lBsUfz)Y)MUD`c&7zyS9yfO@} z5qNAm{An6XE(m(Of}QThA5z;$fIo@PPJLXB4$P0jvRN8NPtSS7W10^Pc+0whf`RVZljqF85bb6eZ{A5V%`1~hbTU*a(3i{yZhT{7 zUM08ZpoNRPybRf_oT;rU_L2LhwFea%BLHg(xc=o69%Mpg?j-d&E8@A#3k^wp_o`@W0SS~`pv>H<64BXdrDfm7wU|lf_SG8BXD)&F zLZ{V_F^dfeiCq`ZzaaM-X!F`9W>3mA%Y$~K9cb&v#C%roM568=owvXVHiS$4pfT0=qA(xx)?s%n zj|}C-z0n*CelLcV%6qOYEbG$)iIVS`a>b5Mb+qHqTA5d_PbH%d?K5&4*>Q}f-Xg3v zT&x>;Bcv;l-viL-DFBxl_f2X|9ZZPUdOm_23Fp2$Y{slT32ZRqp)AMi4 zf&ak+WPv>)Fa0jt!{>MHr5BPq0k{P;`PQ@V1M9>|Ae7GuggWmXaZAFeoZbtd7cN!* zPMv5nz!hVCev4X!I)63~;>3gAP2JnC4=i?}yv@>MX5ok`3$BTZ^R^|TgVs?|uzzHt zxCoYI&MW)(*<&K@NB*w%#qEJiq~e7C4w11Z%1V;82pI>9Qjl{`^tIDxpFk(N6A|oZ z)}=t4Eg)2crh^sXw*hm-%)K@Ayy~GB+AQO|YC!V>SxNM}nL(S{Z8fRI0Cx^s)Z7ob zZC)FthwY^C1KlloGmEuZ%F(wj*MKXjyj(BHdJXjdK3eg^P{BoXD}Sc z!B#7Ph-qs&s$E$nyP9wAhp&T6))@jt;6B=(Uxo1$y)7 zKKfqD)%DyduO#)@cMxu4Kg*X^Q(Okee0!naUCHKv7@$?FF;$>cGF zQDFtB(-uFVFHuTkwua=t0e>?!dTOHeU4~%Ota5z>;_8V(A>rS#FfN*1tp4}M&7k~W z?A5oF7c*1I2lqu%%3U!+Yv>v`aVY+0^gXffW{d}ZvFYo?yqxm(7QgPA>zT<19>+-Y zTG+j59dZ#9QCj<4?ocQzxg1<~8EX2Oc0<>b*W!7f98q}IRO)?#MA?>Hv873&3+ESr zZ?G==AWGF7l$EGG))=%|)Ilg_6$WUR7~s9U%erCEaaWybKJyuQR&;-Oz&X98kMIiR z#Yd6)ADEMQgse||Wn!gf*U)>Hpm($2X$GD&G3K2*Isnr`;eQ_%n?85J=zH0za_$vC zObKYTb-d|Al^z^}H5MO9AqU8p&%ak}O9ZPNrVJcXro>nWm452^@tpr_?gs%{hC{mg z8vlCd>utdiv*+=55R|y)bF*a>tlu<~Y~Rb}Idiid9C~4#VegXu%Zm`lFj>`*2b#)e zq>v+b3Dp@^8ozCqU$5zJ0D3^l*&_so!$eg&j|;Ebp|E>#a)hUEW~lYcU`}enn6CA$ zazL&DZq5~K=IVcNYuL5K?f=DeftJtBZ+Ru*6#~6JQWUl_6aYGn8d?e!QsXpqVt2RT z`~({T?$lZ_3Vi%@E6v|CF9BuP+AuWcu;?(p@qJzNy~{&xU})uP@1^q6um@1PaG@g|NN#m{)x(nOI?BH z@QdrVUopG@jCn(ryx7#afw=2i69fuH9 zz|xl8QYK8MO{EYrE9L&wm{)Y*l95Pb!4b9M^}?A;qtZKlTK>0oSm$0D+L5}`@*rY~ zq^OENvZ0;o0Gg#CkrSWv-`Om0!mU~WB_D?9Oh6( zXy8eeqhYuC8AiJiWF-U1nUKiX{OS&MzXT5t52neltGA(stZ{K9+(O(Ss%dFzkm787n1wQU2%cs0^{FD&q z0bI%_4TYt{9=R7YixocbUD%cT1<*zZ` z%~JO6umP9c|BaX;{Oe!D6tg7XP4;7%jU?WbtvB$o*`|%&-T`b%{W zrk-U#2&djpc{R!Ms%U>JJe>Rff1_;24Qw%VAMxZO(J~)-O z+24E-WNdrDdA<+&2y$I!iQ@!KvYP>cE%-H&}8Wz#QfW zBNRP&wY?{Zzse^>NB;_YJCY;NxHq#e0mK!i&OG6esAKtx$!7JcIKa**TJK2yUW6X# z)Svvn0#Bs3!0qNmfvxjmu9@SKDk%x%^mV+(VrR}lpO!ZYa8)!waQczW95yp4cQ)vw z0ifeC*ecEjKkZjPBJ|RNG6#4J4>MHXqOpV<5!mL&cQ@e4ph>^*_%(w&e%Ib98mS%V zMGB}VP?~Jdas<~u=n@R=KY$ZF*^@Z+`RfjWY2A06DSTf1s7|mudLFOQ1}Gv~&D#H< zN)%{&Xhn2e^kR=&!-UCR(H6Ic-JPO90kGASrx_&r?kupoPcSpE4QAm5$&6uHp|k{< zcsl=U0}LvAuL+)gn4rDDP=qNf_yM~7_dBYKAh_y6^n&4!|LOohz?_3rmWgM*sa419 ziE1Jw{y97=(3i57zI8(kszTY(O6(m%w$F+3a>fWfp(qa(;lz zRs}d!LtEp=EpE$qrsgl?4kDd`gJXc5>lCtC zW)o(Hn}-nr9TX#mC;ssCt*K^e6K|59cZWK6`poEcKwB{rV8?J*944G3Tzp4IUA_h) zA6={gB?kR?7c|Ei^5PM#ZNP#0jPeKi#cX0+tc` z-wNl39@vG5plX&Gf2Gtjm_FuIIwX?neuHx^)0rfFc@50N!~L18BXa}vSoz+pe~!LI z0q4Hu15bMK45ruF8O|;3pm5+xVH6Ecl-TcRu(xYvc3P}0bHv1w#atr}9qL8_88Dak zYHQG@-oIGSezO>ICk!jtnF^Hyr= zU2(4|Y2M%QEOitK4}A}TADaMD(`wxbU60E*};x!gC@OgMd zCnN34>^Y8s2|`&$R9p4-(tlz=ic>Her@hO16EsSyWgs--$KPrHDIs+-0+G@?4obLl zNNNYBIwi`U)>^7LphNHo-S>>wVg}Iwtb_l_0-*#tQL(krwL5JpF2-{S6Q9c%aLZE; zA(cEqmABc^S<&|-X`*nY+*tygCw*jgDhxx8>8zyKY>btPz@Rd$*UECO)qlv~lMI7P7_dZs{zxU{wBi#|+-~px&=!SBMm!{KeQVDq`??f-v>j z-uCXxXWOiTl6Zmm8|E4he|LA+KQDx|eG7X=^eNOA8fx*y&yhvEJ@W!OXF&l&8VaBW z@~E0b2DQ`@s;#US90P<6rPrYydKxodUH3;nKTvp;dA(kI9TCTKFWpg&=lL^KjrX}p zL_)Me1Z8-igUDdkjspzF1(sH8+X=E?2vm7`!hz%bF53q2SVuMJiMC_K$(NLbVyO4; z0TR)CsJH}-`UAsGfG{ApQtj^|-VEI!gYPnWNZ!MQ%36^K0@p$EezY4qsN=9FycQCT zn{okg;J_v2&7!RQ`SRkM%oNI-?HbCwbgUbJ{|(KN<5Vues@BMBLMqqr3ZgU0;N}c= z4_VR7E*Qu8&=bz$B5~#tkmF&rl^hhM6uXN?k2r)pSQdT1QC?2^CW5e*qVh{k^qkDG zz5UwpeN$(oCl~d8*j4lb21bySy0E_jBxT+tN)u2tg(ERQiQDn{)BosY$lcu6GP49n z*1Vkm_iT=GJ15{E4pQ$X`E?=TZmUzYhZN#ps&jpD_GwxJ;w?+D6W1X&OfT!NtPy z8dSE;+6;d$fq5o)tP!kWH{cO37FR+^UYkb=Rk>K@_tM#V2kFH*?2?W!G~DpD?<7Zg z;S>P}(sz~Nug=_PHN%OHK#)#Sgl|EtTmeq8L0c(Zdnsc&pSwSQGN68n(bQAKexD0< zywht-%Lu+87+%-G#UNGpQex5goS9fAKVrGt^j=NTS^#8E_7EfTsCK#3N~dq3$PCB{Z0{PUIve6v3e#DLj^1F=?hIuaHBuVZL@` z4NxZP>R9VfM|WdFM&4yKqijC?HzWsZ<#E=$H>hrZH#o4LcVMgTK{k-T?t@*v?nBQT znPyo0^Zk%=e;MKv&bF_Lvxqp_4Zfp@ijQ;IKrOSy``j6&b9o*=j&^@&48&V7bspvA zeP^oC1UInX516Qx;JMg!A=yb9fIlu-H!t}=yaOmJ43=<5trB}nWaT0P#Ml0vu)(Gz zU~yUEotDo*gez+%`B!vljvE`+19UhX+g^}C;CL}S=CzCZbT zH6wW3sgHwf#3)CB_01>7?$B`O8QWKS=;(H31tKedYR_#z3;;WUmHgT&3M@7sT=mpnTlQMrtxINK!99&D}p-40D%qN<(gwrnwOas8| zfWfvtF*ZW|`B8n&?*$Bew14Nx6~H;W9*M6dRki{4^#|iFK(=@YUqpA4 zC|1H0oR@eP3d?={gD^EnPv~4A+c(@*bH0=;NF{)>G6ZF2?3Tz~<^^E=AEmPup5P2m zocW4I+X@d{!#PUbw1(kFQ(MU`MT)QN{Eg>T768;rCo7vT*q#sb^Vqfkf$vQpSYG5d zxxCbsb&aG{#FY5Yv`qdBJt03~erZ^5HAp@5^nI!PZiswf%_f3Fz5CvF1E9Nw-j>JA zm6Ck#zfyi}Q+nt;hSe1V0yM|4D@^haKs*3rM_KiFHZcP5MLZt20NoAB>k0hMPv;2e zAu529u!mRcc?CFQN^0ON{~K1~uPL#^dpU++!#UnzoqvHP5T|Wsw%&AXSxGj_D7M*& z1A=M}Q5x5r7Pw_XWA9`s2M(q_R8-L3xun08E?}P<5w4sIr<=!08|Os-p7L7mFp8$} zvxDda3|_0cLOzdZ2zsKa8b#dJ<_oWErB`p2ghrYFGJ@iJ#BNaCDqneb+}iw~NC~0i zQZf)(uG#N;qFMe)u(a>$HEpm*EewnJ(D%NAt@;+tn|$WVK0qrk3V+*5!I98~{IHB@ z#~5)We7~5D5uEQGcS0o7_zk9W2~S49uQnAux?Ao;`a035V=}ULjG?Hg_q7*M!PH&D z1Ib#SX4;LOr||N+x7sCL2!US&RS8tP4O3q(r`}##C>v?XHcohDGplr1I8|LwquO;`=j!Q8NqiG_pTYJ`7u~&89N*F zy*q#Jt~1z4@iiL*ssr;LCQoEj0tnACx51XkIy5_Xc866tTb>x>E(uxG1{GX?bqx4o zdz-`c=fsh390-BNjUL_9`)#b#{na1n8uaZ$!al%<$t<^h`f$Q0H`Dt2@@$;iex6_| z|Moq;0uBcr(;9SMW!(S9d7|H#_ZjVOdL&b*0EqSg8^H9U;!qfixJJ?{ zdaUyoJ#ifR5Fo+^t+@!-iJ_to91m;0)?Ni9D5!@>32D;f7P)$OR&^8klCUJcHB-*~ z8swG8GMa;jVjO09XVfpVnGC|N)d7(INf$pjpAx%RKaQX?ocpzF7Yr@sq4=;7hIX9g z-8^Jwd#$NR^kab^jV4GI8g9;oHon?ekjxQ{B}~k^C7$t>MbNpXIQQ3wV-w%4(L#SG ziLsFa&n?A;$~zes!a@5R;70^d$40nsle4wp=|K%(|Fi_(FPeK9o_~Noo0&U1ihfqm zCI;VC!SLYCd7G28hKpX-yuEWrK1`D6d108aQ;m%PI^HZ~ zz*Y@&MT@bIAZEShb7#@mq?RNxb_HmeRkN$+{6gSP=+*hx$mfQEJB4b}QOK8qY>~6x zmup}m5zndJ=-D2Cl0%VpLtK@5M?tc=ZgF1K5IPv}bXVK)Aj}e>A=ee~X-@V}NLZy8 zbjRONN`dkF4SPd$Y4s|&zM$%3gwvFcQ)u%EU>PD4>(Jkm)(UE)@9jX5fnHN0hUN?q zNdUk%Q1`!>2yJa`QulVg!fW9`3PP(Df-DAtfWH&F$3Y$2_gzX3mVi}n=y*i8oBF*U z*L(+Zlz;uf^FL+w`~g_D)h_q!ft-{*Bxcl)#m}IdeCWH~kaHYb8vJ=(+ffs~8W4^+ z`vL@x&S$7>jkk;?kYHQ8Z$)R7GXKBB8b;|#BMwr(A0(jq!Q8U1$uEp!Iq{eKwQwQ# zvXtwToCF~~gy_u-HOa^*%`UXi=4Xi)sn-d~8eM^xwXWtL;wgyLKhB+PJx8%-u}IhF z`(46QG($jdyADX~I49$Jo9|s20f&c1jR4qLXVhM?<`RAzhF;Tc`dw?jB!_r>gMNBvU)#A+x_pyKC@c@ zT-MNwHzBdLIZH@}JUWfDv@=1|r5kV~nsigRDzGZKQru~ptt&wW(jnPECa&_!|HEkz zeMGIEvB%I?4UVu44zJTo><*H*`X^{?WVOBn<*lRT)Y!!~kyw%o%pu!a4LsF~L?Z7? z!dhKl6_MyQfs+BNZ0|XUgTq)8g2~*H=jM*w)iuvl$oZh%`;6lZPj1J)+29BmG%i%P zKXuF^0cwe)U!Ty(PX0%IG^itQgEmQF%$vFv6S%iy?SoTgIp=i2s(za)XFzPap4T3p z_4T(A-1FcG2y6WprU3>xW!4sN0&857DtQj;d*YwFaL+i~Sj8*h9HBYy9WOvQ@g=Nn zK^R*u0A?`Ug#nWP9`V7YC5dA+a|!z*aZXMSZ}ZQ=Pe3@v5pcL}(#Yfwfx-9bYq-%G zJZpdR77<9`1EJ)#u&T2Lx2ek{FyL$oOTFQ5kFE}UNA)sgQO)S zuZH2Uvh-x9yrbV0b`0w5cWkcRqvqBBJ3t9^=F{^sU~r!J9r+&e-zQ zkqU4brU+>EiHZRC5JWu_5`%gsBZ)V+XZfvA#kxUGVtK_xVCjtYM@Vf{)DaERP&)|N zTDE9yJ^IK|*;9iaKWxrX4Kzl&k>WL2`g8t*n6Ua&^^5=`T6%eHwRfyaO$>@O`9ryP z@-Lo}o^uUUL5KY)q)kmd_ac;cd*na@@R6l(Yfv&t?9eOpt2a$I`QcyXGp#@VA>45b zuKBcn)#Ia;wH$_V|JymM;o`bRgF6HJsTH&+pcL~IG+-F6TRqJ|sM7xA z5)*&yNqo956{JmQm+dLrzzUdx{*cIbI~`ac|WaT`CuA=^y|iD|0g6v**%mO zog`Fzj^)Q;2con33IH;IFfaA~64C+%`j9--66}`FtS=;;u}-DrHk_$RXvIe}nU5gZ z(aZ?UX7gp|evJ2+=)Zf6&Ksbb212=H*EWj80OlrSw67yB>Ai z`hvrd0dTfE%dX?-K7#6d3kHB_Ew%~wnHCuFo0Gtvn{MOUQN`Y*tUmhDfA@WKE$?fDKP59H5joe8GEz^ zyJCnR(5=peEf5?(+9gK(sP1LB4`xAZih<9hu&5qqP5>4!rr9@ql?0YnpdS_+=@%Ob zaN)0{JyLtlyc-g>w^+Ce!j2+Y$~mU^?x5e%oOq5 zoa55rIg{EL0Jq_tWlcuP3cOGy+=Kv&YpO;U*!KWbhT4cZjo%BG4AeStK^jyA<+Y>q z+t#QM184CK3#k&$iFlm_l4_x9z2`)Ry3sHGKxoF7eQ`^CPf^8grNaKBqeMhCKir3p^mOGD!YF+|?EE&3kHwmj>G9++^zuk!Xq zi0C6%Kw%J@qeuv?0kFcd2!Y!bR&a!WZ3bZAMkMg!i03Ft zSMj1Y3OEd9j{09<3~ZoIPPj2PR_c`GV`q1u((-GRfAc9k6y`jtuz)C;v2{?OSFMN7 zm&nwyX>`@j?gFT82G%&4dC?34Ng=1_!Xr(GwW=dEj|lE~{uoj1;)U8iYB#U&X|3va zpv_S(a71;IVDS-T5MTENPWP4QC!lA#X!46tvT$sccKH{;?GgS5_~6^4ftclB7EQA+ z`(U~`${$3BB>iAev?)lTx4Jn z)6&PgZP*kpr^_!i(9Re~Crk+#8UWIH)i>MyR}m?pSJn}-8;&|q{GPP*;k|0pZ#*3r zqo5(a{pg#$#N%e6^VdTvcu3^u-%8`|>SU=4M@-|a&lA3(CusVo zncQxj*5(hF**f$=`LF6Cjr%Vu!=eOL-?N_}cOA=D8hL-|Oo|5dJYaOjks6FgO+W+T zpiwDWNLUVjWehy#6J?@tNW1@u$zZ^dAaU_Y*+AGGAI*eP{25-SU%Gzi+4<)}X-1fZI=W%j_8azwf zxUzm6N}!IvysF1B0|PF@k8$HdDznUmEi?P80yuye$c)FbbuQV#Md%ZeSU^Z(VDk{wAA>%VFa* zmU|%@Hs>viJQjk?6;KrS5?-4;BTvRYLwVUhDZe0i+&A>m1HI+axYX|k%z#6W#@PSS zz&!x&ZAh3bl#|ND5lqNx#$PmX=WF(PXiBu2{roYGBqSvP*RF@G-iXT3Z_CBbEIQ38y-wbt0qmUvMH`k_sPmKO;~ zjI8oPEI+m+FBLk@aPlPFyT@1MePcXN2lTjwN&HyvmR}?dXN&8^>7@=V6QBr!PWj|V zglU)NYj--Q4$e zJd9EGHao07TU}bN(oAPjN7~%HvsvKxXLzB&^kik5zP7&kY<5St;V5QnQ}-DOvW#qO z+wo+?QQ&N2`b2X3@~a&6p2NKoKc7SVrnkf4#Ato&D}(8EOWEV`1(fgdH0%6XVIe{t zIbww@M)fjp5{1G<{3K1hIPo5qWBN?utEXJkZpS5HgQE&KYZpzJD$<#OIkaV>(z8*6 zZvqRr3d5deLYCvy_P{D}cOt2}%V|Z*1g2I`czkfr zX1n3PcoJh^KwC3lNF1SGv;^!!QGA+TM%It4kj{NA%+h!A)&dfS){jbIX&j?_f>MvL zfz;w`648=E96WR4jsq7d7{i?Ly9eS8dh82hm7zh(-j7WG#<`&4{{Fo?QTyDR=|bcr zNlL~P$P6A8G}uVuAvY(|#~~^TN8^HEUg0@^LURdmR&us?#$K;0{Bf$`>@9n0{|WxP z>|DdPiL&#_G2Ol}bxgIN>lwmv$!nJhJ<}Y!QGSenIa@voSz8F?x(W|YMETO5&3div zJxPR_H@F|v&CVjeZB8}^*}^1un+|?{;amCA3-}^ySA}Y;>^{OwfA$2CpZ!{&+)V`I z-$zFle|Xyh_8X1&Op~LyOl;8-NRu?aXS14-+jw4_*h?-r&n{%I-qo{kiPTpJ8jG-x zr7D`e?wt@t&G24eisr;@7D{5dQ842U=1=aj2LP>&BhUyx_yirF(N5k@vKVyGQ~LJZ zx~1_B4A>KkL+nJx>cIRSG)8PpIwG;W?JK_!>^F@JHl6l)owX=?ek^*#VHnvWZuk9ivXP)2F!wq9n(4q-n6 z$iA54svk=rnr#bh@<$nfIU$+*kswz3D&z~6tzL11abX{@CD#L%vaRva(=Gu~ZBg{+ zfmz2`dyz`!rN4d++w|XaiUV~C2#%ydNOc*BO5W?N#>;Z{*w_>KxcDd&UT^sy@`|uWf%C?-w3t$I}h9`;${O-dh1+ zl2QsFxTl{?|LvLPPdV&8^EiBOdhmYtNPaI_=FH6fSv(k{r}igg_h@ZNMseru$Ft3n zQ_sTyoK9O*|DLV+fCN>` zM8)Rj{^^sC&o}jQgUR$R(9%jC-Tm|KZ5_ymn8^1P_%%_1V^vT;XK{;Zx(El z+f?Uw*Y&Ou?|L4ZXEn_ITK!L{9*o>VL-y#{4*qU`U~$-zW!aT#O`(USSS?(1*gd>{ zC};ExF4dmPwcH&DH6G*9n$L6<+3emG@x2d~ZwOkwvsk%;w_TL0Ibh)s3U(D4`f~^k z>%EM=<0acNx#s(lo-ge8j+6y#;ZOmZCup;yV#=1^%sXg1Z7t)J8dIFnr@tnl#RwUW zAUmNy>kCff@?sEUlZ}UX0m}=J*S-p)IlWr|^e>p>I}wsG&;8w;lpsWsluwT+q){0sWd?A5H|Bl{cuB zOZBDeMY=ZL!0Vz`W-rBA$?o1uXsY&^bp6v^(oiZe-tyD8ZDmo;ILGV54uzDt805^v z|9%0DdwpZYmEJe0)DK$XIkaROxhLc!v)^jsQ5tB;gI94Atwrg^TKna2IIE{|%WG?? zS{T~XRAD_`U8fFxhvS4PDGsY0MmM`==-7}H<}djbE6I*K`m@^pS_&2rI4NLQ*(d$v z#vY50A`E^k^_$U$X(JwtzwIi6Jy|d6uI6)O+`k4%Ca$4=-<8)Kw8XStXCpgw@@DWj z{0*Eet>N`L=OvY0+h~($^#skV-%eegDaML*f?@%K%iUiazIsd7krnuBe&YbgXpxC5 zHmOTUhLkavUBeION{faw3NMn2J?~-Zax!~Aq01uvmE1C^^=NOio!w_m-Ls4nDr;K) zflYh{Is!aJ*FJmgZM2fmu(!Zr3)fwzJeJA~9cyChw!8T3upg*~rm#I|9B8>qxa#PL zZM$vu2ZXarfA8+~)Qi~oJ2SnPA-T{n|5<6QYTB32Pr49Cd$v2+TT0KT^9d>g7`Ef| zai&cSLcS5rTi4PIb$IxHUjAdTMEcTucX@EkGR3DYTP3NBgp&24&Tp}sA8Une8CalJ zH(Bnz5;m-`p%37GwLH;mQ?C>!_{w^-ZP9A>gt9Gm{<@&W)NtD37Dw?sqR)^v0H+|``ppVZ2M_Jq@k0{juyL+9Jl zg%qcmm+b*K7W&iByeHk89x@)@r<6;*Mxk^IA^sOhOn7vS(JQrbbG3Xd7t{?hSod?g zp3T~yayqZZ7Tun4P=u+>%GGp`QdGZ)U9u*DkZ^t->~!Bdj{i}8KP+m6lj?fl&E`R| z0J{CBWJ*l)hbwAWvy2(*1W;pJZbWDm1GF>R3bk}x7Y@pj*l`TIcsw%_)ERVbtO-Dwj%~waS z5d%AgCUP43$r4&E)i%R6r^*Y0P`kK$t$hRTi`1Uv&JPONUfyI%d&DQpw|l(VU>*fg zeeH9!`%+c<@HTl*qh*S3m*<}~c?bRdwbm6ziyqPt1X;P>4ae^oHNEoJRFWsVgX2Y2 zQwbHahP<+D-yYxb-lCTywdVe{Kke6BT)$}JO1RAU`IwyuWB==Cjkw|WUE<2$1tqyY zH9N(U<8}K#l{{`{b5UDAMfCd3*86ykvsFzuwS_WcM~X~)eNPW9#hmBK#C-q8+sM+d zzd`tZaePVtaJt@y^7j-;;ew=_M6l2PPdBLMt`W^>zuzP|6Luh33* z&4t4~2`NZ*Qu}4$B<)DBHhxv>g*wz+#dj?ee~#rXJEmJI%hz% zztX6Rm}%I`D~}LHk5_sF1xJdX&q;d_sg7Nd1>P$bYGa&n!gCzxA(5IhR-$h zp{c%ti7a&nJmSan;b-Mfj+6CaB%K3Ul*+T#&(aTRdpyHR}2_qgx(x}$eB?~(6%+~o>A9dL40j)1{@baiWDTY zarN;GH3jW7zrEC*FU-79OjlU@z7T@2-|QSu|{f)q``8p+1Ew-YYl(?YDvzWv@| zTzjyhCILAsx&`MylY;~ku@|E6IHpeN5Hb<=oI%`(dG>Yj`s=vjC+{>fbEZRkxnUw6 zmr0XF_&eob_2-+5*l(W`Kh*km?5fNJ8dBkfC_m+HOdi_Ix7_B~ySl_PA+N8{gZ^rq z$(@SV4nGpuLq6YE7(WPJK^Z#=fUjyu(9@`E>)SBw&{;c<&W9q5QJt~QM<2{un3`Wt zA9v(IE-J1aMx$YIh`E>3y|>{4G*G9aSbqKHA_khxj-!3q1nGVJbnfXRyqxKWlcz1$ z2olisot8&Rb0X}i3oCymKCIYhplhe?v;{4`)w&=xjO`X&)K$B8vQsR#4u`f=9ow!v zoiJ45_fuf&T2)O#o9#H7Fdj1Da;w0Hckizl;hnH!!M9_52t-CnoT}O7F}ul!oo=B9 zwUNf~8Nm;0BhaaL?292wrAicB+*v*3BFA651-TgS%bx7gz4tr%l~br&V)Clhga{Bnvz!-=by>zZDr?};ac-)fQgcqb&~hk=1u$SfPbVP$j@ z?DR+O-Vwbnpm#`Z-}$o|D{${e%C#+H5m^llo$AV4Gx8KAy=+g#{gs#x`K^27P78Az z7R#HB?VGYf5iEJz?a8WKGLdu}xi?45|3328Dvoau!v)}n8IJC4FbMmY=)`JPY8Q1G z=TA`&_vH0LoJ z@GjCVcfUz$U6`Nyp#UJMx314IV@)wk!#hKrLEdKdL5C@h^}pu6E#1vSLm4sAO+H+4 zPjtMK(CLEguf=O^2DR#|pBh97s71qD3wmx~I1DEB{hahKzWzRwou@9^_AC7kdv1uP zag`bC>@HXI#&iHOh#MnhQu{QUcebVN!SYyN{E=800Rh93A%pCLNyn|&)9w~+bWUCllrKX!Md zH_y>IFdSbYRuHE-B!AFLJ=*#e?VDPU^}G<^^gSG$L+2`|W5Iy4G07@;#w>(^5B& zdalMjG(X=@@?5$!C768^7evLor=ocrqM}*;hrNK~MP7jIuSyP)7MRLbka#qS}|+yEtFEK z#NI_!P^0!%bP#**U8_oI35wc#lo++Q)~HR8*faKC@A<#i^?rUoB{?K{PR?_l`@VnU zxjDBvPRAn2-iv>HUgSDzKyL$y>Le^8C>8X*)(p{x;D1a{ziv7s#1I|2riZyh;c^B| zmJwgt3$p`zeNVRsFm3mN^`3ikyM|p;t3lHhM#)i!`#V$RoO#lj<21<9U=U`y8pH%T zuQb|U44BDPiJj5al2HjvWFkx+FwQpDo775#J}42NU~`WEm&w*~Ex7HBdMXE!~m ztI~~?)r}XdDOsD*sfBTw41|`88n1_0a6LS?rVI7^!Fk})bP(}BIkHPA2$x~y z=GhKHxM;rBhLPmR|9n#AIaF5Oz@r-Z;};W{mF<0J2vtYy%dw>4Vr8hsE$?F$Rbg;1 zws&!ax}G6S2zdF8@*{g0pF{92JS|?EPZj}3sEQg5;rBaEa`Ner_NaG05>PE4Fn$Ih z=?K_2=SFPwO#D^%NW$yS@~nOfT@=h+iknDGhqwqXuaUJyqU(y`-V%8Hnhej}rQysU z2{3+}Ss_}#^phUwLhRr#S1Bd_a&SCMT_*buEa@sngn>6qu;HVC{ zo=!!hES{b%M8!KPh5E(A{hfy5s}7}Y0?{g(@Ta`(FB)=$;UUVy(`5%!!Y$-OT>s1O_`4NpSru=$t)2DSvuO=0_R{;p$%4bgPzuOeHI8S0vZj%5XHk>lXMA6 zwnp5jp@xiIDlzG0U-|Q2y)&1Cq&e!F7Npcod<(b!{*x0?N;Tz0>-#ajaD7CyGPb(@ zu{qJ_PDcX#5ZXzioYz#=@Cj#zP(LQ=HnUHJ$n$)Suc!(E)c!ZqDxpM)X&3P;&;d-wgLeo_sT47&=?*;nQ7yf)7`OT%}mL!zb}?! z-CI)bsqqB{R1+9_uFker{**I!$lz@6>8LUT<^B%%;dRmlNLcQAzFEt8>X!y>i5nK~ z`Hr-p9UJ0&cQ)+r_h(T77wD+nuZ?cA)Njny?|PT~k2Q(9_PcsZ4mJXT`=UmNQ?xV~5(@fsq>r7gb#blv z0}6F(rO(p3P#VG>sa^WtDJn|Re{EkUIJYEmlhcC=_4{=hE+en4%flwV9cG5a+^R@w4D!+ zdo4A%<|Taji4bc_aH%aj_ZLt{K%W>p0+hmwtEM&_!EFX>(1l>TD1X6^zyT*xYGXI` zZ~0uVXhX2`gViZ}S#;7wNFyje0aOA!Ob{xlyxnG~ z6wh4E2O#C(jqhywrlwPh%IY_wMV&L+XFRSK0dHK?zv`waWo z5Wv_r*AJCGR2Fmm$5lu|N{At!5X$hUH);C7SKic7?LJ#m7GT^vEOqZcRsR0XHfzWa zvh!WHk*wb{j)j@MJWzN)fc0vnUR0UN9shY&TUE(^!0c)}i?y5ss1ijLn@ zH8o>}!KI%HV_daEud~d6E3yt}Jt19LO9XQ4hk`}ExaUB75;IX;FVJ(>+}o&iG!cg8 z9a>=Pb%DaLC=LsVTB10RiGTp(?qcHBvB39?tg189R;4{maPcjjERv#7mI2$~5tyEz z4`_Trq_I&(Tv(+9|JA{_E0=bBd!D9kM#K1=KD1f)+W=72j=nCOc#%(l4Q02^u?m4K zbCqHlMe5TLV$%C#aP=$7$;80Ju^`O+=Eq7|LcZm=o~=;{U}f{bHCFI&{W9tEULIEY zopP<=^=)u8HC>#pLQCBXh}HKe0!XxEIQifx8~8kZVAL^SAyds$#7oMz=fW3Y((0EcVpx3koV|=Q&zJO?&FX;30et`0n1|1J$8p z%QxFS!_4IETyOTgNfirON*?=o+ExQRw^lW3ZA4-wWSYF}wPY`C z7o8ev8!LzHWc*Hkd=&o+fKhAz~sDd_CB;0bKfMN%Cpy!^i=8gIS-U%B?<5J zpej71ygWkR#Wvc#f}O8DA9FH7^vxy05DA71e2D!S=&i<>&x0HoDa(#VSal_)w=1KU zw4Z`#113>iezoAqw<6TT%0RlI4J0)RdmQeNuA*LxPxK|Nm%5+>!wC?&i`h+-_U?5F zjHqq4KB5^E#K#V0Rc@R0{P8s_#QR-)Hb=y`J71mv^0wIHLbn^zs6n5NGM57bO*mA3 zS->jObT430vg8%4cQvLL<1yMwFxrqvRE3$TQA*`2sXupuNvhFub72*D{Y3f_njOD! zXpx%RY$dMgRl~X}ybc?_(aDWgXI?R%;IcDGz+;e1VYB1*vMtn6UqIkAG{y$}EiYIX zI%Pcnhor$jhHz5C>^{3%(LLqA$vda=H_ES!I8;qLwAQTgFt~rq9k*J9U=6ZX(`;Bs z$shK)S3Q$d5@8A><64P+@xTSTkRMlN`yjXH1t+!~*a)G~HhYOBq3z79%!!>mPS3V; z+DZ!jqziuyBP*{jN}@E7@h;ZqLV)FVl5AT9KTXp3m{6-P5r7dF1;q!k0>k`To9aS3 zA-b=o;+l#UMif&}6A#aS`~A|?J-#juh~Z44oSO9yv#--P$V!*6Yv#QT^3|p++!a?b zI{~k#ttx-_ADBce20=H0iPL#<*vC5ZRvtFew++jC0QygEv>CX5 zL1>gt*}oyNy$CLqV`pbjJjW~?1Ub1X!dQ2zVc?G2EWfzA2jpI69n7*w&5q0;nHxZA zE^n|kUZ7<^UsM08=e@&*(=R*{mRIN7Ti>5;-Sq|gx{UpdO^NVB%?)Qgi<+CraB7Mf zCUg2oP<;L@601;|>ytK>bBF-480tj;!l>A-ANCGb0d(GL7#C5nU40!)Xi~80;Sjm_ zC;7cxcGpySb?Av%P5Boa#Df|2M-qFN;qEKww;oo7>L^jOK|>pV@lueKW_YqQ%7hKk zY-Bd$C=D0Q9_@n(&#YZq7LK(ZU*ZPo{IxKyYu@@u)q~@i?g?v5uX^>iutA54%)wFn zRFMYr7sb_aD?bxl2!&2Z`FYlpD|}$ZI7UB})R7KmaUUyk2yISAhJHFPR_I7<8r#Qo1b6<|KpF5fEjCh8{xMp}`^E0*PrF@{VhX-}9WHe2Dj{zGB|-wAt*h46U;n(|1b{4Sk;+8$g8}Xm z*fNVw+w9{wo-*&_(l8OYui4M{hSfs4G#FF(i7_II=x{>4owY=JU78se@+PPzUD@st z@>pzRyR`DHOw;)fztC&!2EI4uJ`Z=6+E_D0?1-f9TaJw?&415)IZr#7tT7n-*Lmyd zgeLtVw4VjSv|4mNJjdv5kh9jn`rJsogsPhQgx~(5I|2p$5mu!vB*^xjG7=%fT(*d> zR|}doe__33bZ$wSlVLt{R?Ld!(G+=tELT=@n>O=G;%7n>NbDosw$AYce}(1R%0grG z9)YS&|8>etYch5G#sv>P@{6P{F9LRNLr1<#J3s>iP-!f2{Upp}5pR=#-`NNmbba0I z0C=xOJ%c0kp#CXBCBOX?`NC}=uOUInKw|TgmNsV@*BWk3j6Xbz?1_?hc_a%h4ydcA z0by8DfNh+_Q3DUp`(@ta@;={uT|fx05v-3i;F}s!e?e)!mlp_q1G6`U&o_wEBEtmj zZg^i!CEV*jHkM^$arfiXu(D!mwT+DMi+W)?c%k#{kK_pN_Dj#`@xLE}$bLMXZNuKU zZUX+wktV|9@B_=LxM;i>EiHT)UTH6D#9w8J$AC&nevWV)RThxS2qS_coH{$1g}6Rq z_YSZB-~wi8B+3bV6k({g`cr|hF{L^JN4%2JIwu$?t%doq{(H{et{!?_u~3H;#k}q% zaaR&B1acMPj^BSNQg0#}L!6=`;JQQ_iV&={%-K6A3}=BHWE3iQ7kbTLNNp0@{C@`{ z!h)D==NmrSOL^^`5RCr;#t%k>I1%7iWFi7vC6%kf_V#hbwaF-wpQB&D;Bvq#6cmt1 z{*^940y+<<(4be0hm&LZnAPF;)4W5iYOKt!+WyUWrHTW0SaFmK5o@{8*|4*BBS&{T zo7YRzB5PMR?=B09gNQ)q%zCQ3g!OHrBot67IvZa{Jwc<>T~6G!J|e8YQW=bU6}+8^+tnj4XB{<$*U37bl_t zYH5XdW{J@02cvc9T#wvt6EDZ4>b}AWat+` zyHUY77MVyAR$0>mh2M9l(-yO4UQ2(kPPV!dq_@=`*?8@vt(%mG9WP)b}*3vA7BZ=udBS{#0E1I?+i+M1RWs7}mS`BVL z1iCC#WA~9*+Gl#uG#_+=W`V3LBW<(oMGODnwaD&7@4UlsHL4vN{OjwUEOxj6XQ1K zonb`+=xSVKWsV&^z57Tn8RruwBqaIbK^xt^6f3I)@WS>WP+@`+9Ipfjy?r$>VYV8x z!S41a5=t}}-mZ}?6>RXndmvb2xGKU=2JTw(BJ2_RemuKg2MSMXbbQ>F@ORn0?9;Ef zcvps{dGu>M9NUqa5}>fT?MFOC92+Bm{jG8#;O%f2AI_LSGy|jui~iKyh}v(E0sxd` zs&G?OOGd;V1HK=OGi64>_NlCDJbd-_+j-J-W#);rjC%1z-9Wvd)wCvvW6cW=1ODsd zO60wLGN7el`2&7`w5H`YOi6>O+U(FM|J~VX_Gl8Q7(V`TZJWIs>fnL7?(iPwN=_I| zcEw!fh-p$Uw}OEkH>FEqeB;$P0xn-Q=nYThVSO(jnZYW08TTKe1YX zue;htsa?-N03l1g0V0L)74iGkpI_yG^z=xdNf8JBfZSA@*713Qzr-e=>JMxnS3tb+ zuI{KGAV$cOOB z7`iLk?tH(-cxV*vg3REsLpn1!rH|;tDC^T6$fVFnPkC!gMCr!|7=HW*6 zh&5%%CF@N`=vlw4T<}mw;vPs<1^@7(@(q>@S1mnzz+&vJB zCFT7_V$#It>z(Yz3zzzbWzJ2HjuZas%3YwsHov9go~tKs+TorLIhmWRWO z)VxK}i~7T&F8~Sko`(^_7(Ub1A#aI0(eBtQyvEf@J3J@sjc8<3SuT%fjiO2PRZ0sUaR|BC>geBdU~Qg=7){2XDzLWG|!= z@(B)|^Bl^L^B&k%B7r095s{JAIr}%b96FD%fehrMA$G^Y7K6&pCI_u&kjT+-vFQ@Ckwx2<0_s{#LW~cGyX|m6 zu`gjr=Sy}WC0bH7Ly^aJ9?<=Q;@mg~qcwoH9Od=JpO5phh6q(orYTDdE8-51-=q%{ z4)NsLA<1rb`o7ed(9|~r@hL9O$ zC_f`E*OwhKRXTQjRIo2q6RDfAV$>lfIn9R$M40&YWiF6cUz8szN?*mCX;S6mxSrdn zu@Lw)1OExgD?Fn(&N)69&}zJVb^bzr*Mu774{Lim)+2GHEnXNR?-K7y)UnXOB%x=j z51oiY*=q9C-~cf`_rov8lJ%|yAbi_F)K{fZJ`!|_KM+(<*B(zcAT~S*a?yd>=`$H$ z>SB?B18Xs_3+~5&+}{!1+C_!j2{mU}dL?P8Z_24$>@S<7HI?4Y%~qbbnzAlU$ax03>D!>uVCQcvbEvar0C^86O@tijl6}|! z5V9Z8oe|Pzi}h`HbMJS%DYa}1vwR;nucyCPGmKQbyY*TsR&@J}lAWr9shYTTR#~kI z-Ca=D;Vd2FwBd{hV1c{{F!dVr7^T4HCXGi*kNyHOY;Mn9gv)N+vti3b=_3bEX+_4S z#iw>e*B2{^Thd8E%d?cTPZ|~#74KFDk_Y~=*j$ps77x&*9hs(sbvCCut%@Qz0(X^& z8zNuzs)J0g%{lb<#F3b!`EAULzGkm#5e&^Rii?wZ-RExc0QrDmVB%j zc5eb{1<@DXh7iu|02`%eGSs%sn zrv@9xyCLWvk`=yzX{m641sBDa{52W#QJT#pRAKS<=00oG&MhGXV9A^Rz%sliOz3Vj z9VPF3V5`>j%2BL2pE;x2EI`$ARm`lRw#H=}~U&8cg zK zupmcgSD?^!Ieh}vxaU2ww2svRuU|F$kA6k5ykd$uY)}3s6hEE1;PY=rO)d8aH_enz z-H8z`l9K3^TJES5A?BJ*z-U@Hr#+kt_h;T$IXbK{6Z79@0_ziDIO@bO4d_K9D8}&A zCD&hvc8lTak*?tiToD#^8fyihK1en&iSe&AxnZo?H|8qPN2DJ#WGvolX;VY1Ln`@Q z@kHi%JNR(D5GjXkt0cDdI-%p|v&xWO`EXs@>I)uK=pzuC4u=IAP{SjJd^hEz_*6Hv z8Nm4H;gS7Yj-}hH0?2DFRc3fiU|qe+6D}1#J~(f(bGk30+VOFGa(6*7emIKdanA^S z%RLbfI0~%3M7T*2G!W|kJUpC83(|Ei-N4NSMzZE;5Y@BF7OGNd{0`OH$ z`~BTD>yh-{hslz}Sz#kazx#mmF^!*W(s0R=#Sva2NY2CPtGKoVGA|soE0%CJn>b63 zXVRowmcuhOSX6`*u+i-Chwx-ZO>f-u&`zLuy?wjvuc*W~?3v#sQIYB49j0&j7<`qw zH{YOhjUvE^wM68*{d)&0i4D>JBsszfQd3FIwJyJo_GneugKENaLBCjTQRc-<$1%XL7UX_wR_(lrFr?q#>)k zuR2gBAoA(rFOxT(T_obRRy(}@0ljU4_i;y;&gYpSq0t{_fg3eFatw1ser#eaRvRnW z^i9&c#Mf~k4TrpzVzm7TOaS>_hJLe6hF3E zV$t(CLhb*6G9s&DiKjg8JL6U3<9yY5r9Pm|<^BV6!C+dX?$zI32^FC7H&>>~{YGi` zMT4FI!wdjX*D#^?=&W>T2NkJesf)Fm79rhjfrt4PcYc2OXT!QVj&d%xtVcq_zZ^}&78H;lNA^_%Z_7gS#Pe|n10XmA+`nT_y z^&2yfe5;F}{)l5u-IcazrJoc*N}<>FALnO|M@FnGf1f?R&B|x>Z?2ai^3Ts+IO^xh@%3zJZK>oUqhCCCuA!H2ce8%w-elwKSv3O9@9fjDPDGjo~mSjY5k{jS3cg z?WWM!BEaZ$zZ5}h4D`WX!p`$ul2VCAbs0W>70XuRfAWMnIK^K!Bp@9@`lfv8mBvF$ zx$++oehGE|KIsy6$ZXPRE4etzL#VUoA9u*WU$b+^3sECp0l!_~&!1zu=%yar^OU34 z|DyGpP!(-Ae9y$NUVj-cC{7YK&4epn6Br}-(?kT!U#mppXEIQmnqKcdc8z>^j?3km zE38~7V~GkbLM=9Ev7Q+y!@%A^$CK127FixwU5>SB*+F*^o#M`m@PO=gD65yRSQUL5 zYvH)p#Z=dZ%S!KVFB!yqPaMSF?$U{^Me=N$MM;^-Tf54>G3aWri|z5-`bT90mjuX ztfX}psET=V2-|Lf+&}+s08m*-N{k+H9J;1-T<>T67keUABznT2oeG_{EX;xoKRU0s zV`!3}OOFps>Dc{nIT}bOPiUe^zF57PCH5;VDI**ae+{9{R zQA-ms^o+vRPIjV~@B9Me12B_t9#~Unh{|hD@Tb&Uo^oOk6$^nNzF}LqfrPPyv@H(v1Dv!t_#0NQ88jeafj+3uZlN6 zmIl})+iH|K1w-Mi^AwEa8Oq44$(_D2xkDlJT41d!6NLE~KbiP|&SOlZq?pzESlp@D z9)#}^#`C_eLB(7yT`lT8{*I?BUmggfi4xt;)gmuWO5TnFM4oz{ye+ufC9#g7*KI;< zqCuByw4#YyS%2+OOE(d-LREl9BwUP2o)KUwYB$)E4t_!PI*s;u0xH~1`w>;<1bX1yr6%M;4<>^y-(#={IA z`{O@=U@Cr2jum!C3r+6^xO&y8tFEYQWz74)i$i=*VD5~y9F&w+avUxU<68x-7A5T# zWH{&2V%@vzmHrzDZKkCuoS`gnyyf}q_PE2$>(?aH3=M`lBasV`iJ4rED~qIP9>>%p z^I!FM{^s#E8x)OsU0#1M(UUH5I(ge6Y^n+O$650CkTdI2>qsi1vK%%?IF`iYLH-7K zKSJO>hS3mWB7nTc9ij`13cI;k?iJG{Igb7YBccGap5U}{2MTsp^MG-^))E1t7>yJT zcg+#z>Ijer^en>|VUQPVJE8F9{oVe3|F-4Uzx+!aB((G5KmU!>@6)Mv7tp=mQ2A~Q z{j)meS!$S;ocDcz=b40kZHE%xxQ`_kju&6;#vd!U^*_T25+BZXXLr$2EY_LL?m79s zwY9KM*_o`f=NA3O((YeP>pm>L8hRi!^3V$_z845bDy=t`M!~*)Xrc4<4CjKcI0>lM zND$^=EovwHsM=)&vnzz>GBa9W2y+JW$JFw?vb0ZN9l`hCgAE-e?lQppn!NUhE1EHq z#wBWf%{TkakfRYu)c_w}u;W2C7(dbE=*?$ST>Yu^vB7V% z32}*%Plg6chL8CXs{gL6wLND#Whl5IKq5`YHczjphFYD{Aq@3H@KRDhU%i7t*8!P$ zr;0ji(Q;SK29F)_KBK_8hh_LlV;~pL_=s+0?1hOju9jw28b8uviw0AyqQ><$y1ZUZ zKrx36C(Fh)na+hzS35jb9&grw(4sEMk0ybzeK7dS%6NN#;B;0I!V@fwbDCjn_NwCi z&+02cCl*VZ8_B_hg16n@`PCTrNfWpJ69!9ez};qUE{~0NLJVGpxtZ2^C#}@$;v>Tp zhbndgEQWtEYasUE$1}u&LZipRe z1x@AQ2lEMMA2&a27R$1EN!b2gK=C^`D?pW+&NaoNk# zyyg8y#RsTp*hOC)y=G@qWoBeG2XYE!_mFsCw3P_)>TgsKboIeT?t7kmfYSHQ!Flt6 z&TW3rdOdR{<-gmIj%CsJ;61YwHLYl(}@QjQ6y^It8%y%qKdFf`lC zDWT2Yd@Kri@PadRJ&CN|+Ny_+I7(fp@Rc#vi}X=xOM-k5#%_=gTDttzkJHP^#56(C zWzd@TtGpQ?Bpo@n@_npFwf4G~D%CoIo>xt6Y*ubPtb*k8uUJ#eBa=BHZ@$JfJJzNOW;TDWZ1BUhMs>n0+2q>> zx?(b#T~^-INod~R-8ynIzH)e|t>B)$`cKv8&Z`f4;j_9VTwJ39>WH}}24UUQ^H;Wf zxjD-TiBfA3W>mIfdzdB~yJYgpU}3z_Elns|>0;W#c~t{%-p50kGhSrTq9z=f-MA|_WMt) zv~y8jr*{G1-<7{H#*h6Db5%qg{JqAkuM+&}Ogq;|%|KVvxE0vtuQulsw<)%Hg55Cx ze(_5kMRPhXmpET=Cgk*yea-GmkXg9S?dhWrD{3G=IF*b)&gIo&u3<0x)CjZm#5L>* zwfp`})HLvNt&Zr2)>7+--EY-L$d5DeKS;;6+J#c5B_9Wij1*!iL%WFDq1wT@Cz9Zb z9CGA2aPQE3waVlDjhaa7oj2%Fv76z2sfDxJ2`yw&++w#*LS-HH_*3KLh$vQ#C!;EW z@_&+@v4`(f^a-zt;WoX7d`8DCW=T{(QAp9{6VslHmHH1sC^uq1cZW_Xj`BL|$E^x$ z2gepJOy*6Q;lQHz3Q4_H7ak{cgn5PPARo1t+jnn|6%U9`QbPT1))GmZ<2cwJ{=4)? z&~B{r4#m8ueOLO)&F!aa`cM+i=^`n?kLcv-ME_@7ZOcPRHZGE*a{mg7t6*}bl*oHM zStNU0fBoQKB_~Z`m#kKv;MLsYm5dleIB628U0&<>KW|M~1Db3tx@SvXav`dDL3KX* zD`PBWu)b99Swe&#Zndk8OB3w#_UjjH1{Ff2ru8U5VL|N~AWgR^KJ;JwDYnZm&`@}1 z|gNEOP_y-tK z*4j`SqYKtm5FBSc4>tL!DfBCJh1ZQ_sNx@VImR zd<)gjbv4a5xF-@VvR=GY$XH0Dj%GT_TrX9gH?sz|1Qp`eC4W2=nMpcT-=sk=u0mJL zry}`#X<~!Y?sK}*Nrr2yQHTZ`H@Mrmg)N2w#?lV8$yvtL!VeKjk}FJQ(zKFXfiJ#JygeJG>~TsOPyRz(&$lv&6c2t_gm)D-kM-20Np zjas=bw^SX4E*`zz%bVYt7~)IqO)f3BRMjQ}8)0v1tmN_X*0C|H<*_UyFNU&1iNixh zLmUJV8=a3DQz!^*pK5>Z{j`o_J5O7lRrEtzQ6XL0nDle)#<&L`<<)NB+5z6Cx=fBSq$+4$)ROfF+ZXBNgJRG+&B$3L3uUoKF;J<*~|Qr=7V zNTDL-*a``CAPwSJvW@S`Ht%Hoiz94=&L}t%4kJg72{mUFqy~#OGJm_rdq>O8R9F0W zY4<1J!MZSxe)FbdY0KsFi{$_-V>XKf{!ocDir9;p(c}%Vv@W}#XH`_y%Gu5*#9@`U)KTjpksAlW7OwIrtd3@0P zPv58k8}qvD)6bGlSP9qwWNMGU-li1AGLqGGxdFEx*DD*2Je8cwUK>gsU$PrYT@Shp zIar(Xa*J@F zV4wc3aJQ_8J??%7V|3U*e1tA!4H~@O3**|gA-x=wOVCzBY_3#ptW|cb*saL2i4xX3f`r0>Cu3C zaYM0TgKIcfVNjnEH|qg<4<=@^Lc7;bo;(o|zjq6)b)?k1U`Htts~BDU2Bgu? zn-4-k-Ym>HtOGCM_ENNz*aV*pQ~T1+5A6c07K2BL+q?k4+ZMEboF4?D5ww)E-QYZ0 z-v4hU8^lU(qJ2BU(H1P!@-*Xb*4LmBS-Ed!l!h23-k^8ux{qc4*#&J$t@(wB_2k5h z*Rm2VVd%6qGsV7UdN0GK8g=de6BQ0jrd&zD(>LG!7iDf6Jf8)qE;V>Q^Z^JEzuB98lUhE;Oi1yo23IaUK zL!q=AkKNBCT(pM-*MXmiMU-EylYQovGI(W4-4VQkSH&XZ`=zJ#u8b+rTQ&U^;Ej|w zM3``^LfA>&I?NbTW}@MRB@I1rwOGH|R1&Hb$Oa!AT(89a8sY)+LLf!n5P1(eeWuh{ zaXkM}134g}lD2!ZdV{}sRR8PWTQP`MZMd&QqhB7o2LKso z4jC}0ckj;#DeAR#SDh?M4~o6p{rdh{T&NX#SUd>SqE-|G$nRiI0CJUL7D_p7KkEu$ zfyK^pS9DhBJKFhLK)f>0DI*p#7zU`sj;TB-0_f)iYUM^B%@uXdW{rUTL#4FHFUlTD z`1qsXbW3Bh{Ccz*<7og2NdP*}BuC!&$1YzYk?}4s(ZSofQwGmNbmP!PWVoAN!}+W=;U z^11;qTI;2NhVKS3fMYV1&@)Bo&e|q`C>Vfyxrz*|a z=bg`AG!G;OLGXLi-_mK}yX=+ zi6%bI*MBKx5SckLHAxBaL25u1*<8>wb!ri6=<(`PFc54%+8P+491EHa8vl^#zB@kFR?7K5;$Mkd?tA|w^KO|BES-q`%m@$$Xm|z zl08PUQzkl~eR+&D%n}?(d$ZWVy71+E2^{MvP}qecVjHR!kikemw)$BrNOr_Wk6QgO zzoVApaFTTbu)a)Er-Vgfol|Cal(RzmthyqTg4;gMd(tQD3c7n z4O5@4CrDw~K;(!mdbvPpsiPv!fjyFKfeLm5{vTOi%U@RemUbnC?l2SV<(dnb*BQn> z4_V^HbWJn1z15OArDBxw6xf;i#aJ%5Ia8fy`nH1A+dy(PIa>H%{;NCw2W{h#g(D?SndG8I!+OuUP)>_+=#bpBy|4^Ts&sK$QASzYSX zSlL;oqI^8@gdGtz$_q9(w$y!VsB5{L99jbS;EH0)o4D;c0I6FWUqqOxA<-&f4l%fb zv*EG9M-gtaRYG>amE!gY>Gj3?MgREMHRTLhOx!cWa~7HYzl^|H9jzGWYQ4CYwd(vX zsw1|%CbtC}PCoQ?Hu;GwsL%zcQ&sO+s7WZvp!7%-KsN0CxO*Mb^H$PgOdqlqs}>Cp zig?xxzcHbQ)~HE*-WO+|>rq>L0hx?6nX&IlKX`G}3(?s~wHlu=RYr$ie<%q;b_S>l zB1)y>UFR-O0F3l?fh^PxU19L2sVEjeVSUU_j2^x#>MqV?3SVXhG&yhW1qGXfifUWpK3{LB9I{SES) zTIrIBx}LvisDTHYq_R3mCXZ9Ux{+rvea5t@yBe~8rEt#&H4pst9>ms&nmEoiqgsCC z9bqZ-%xGh4C)WM5i+W6b;;;tU0qpU?drBoD@aJJ8;syayQ~m(KXno|{CU@wZ=r7Hd zqN$4SE}eqNC4)c30!Ym_Ccqsx328Ku&lWbygcnIUls>(y>Vrvcqk#V2c`xmI%3@zg z=m=GPqApF0jn{&dxLPN~97_f_ZI-=E%o6~|qpMz4$1`d=6vE^5ppEu)lVpdvbBI3! zyvyCs;%MRD(g3kVe38Mh=Xicx^UG>;C_@);qjAleVP*`I7r#_GAL%`|J zcYOZi%Z>uTKXA{j3AAKIPzN zV&)Uz#v^4=#smSjbv4gxX0Olsfa-WT0w)z;F;4kOC<h)u%VV!O7+gfk?Z|TgR4h<*|H(K5LZad=Wg8Ei zEL0d!uD2fH@8vE@5&>(1KVrW>0Ff-5Q28|B1yJH|u4$Q+z8#2xSXeRXOH969F*W2k z?NiHZo$pCqQ(jQY4)yE3)}(lopnC# zZ2F$jTsb{;b`4?&dm7%HGVtaOVuSFN@M-?moRV`{(B>Xg6sZh#8`n$JiI03CA*@x{ zbipWqEN|2(hu=J8Bi0^}4>Ld8a@<~9z2)&zAmF6p%(-n;fc}%UM3Yv6=k7dSC|tukW;_s)+BC!1bEk6D$nnKOs%%M1!R+KATJO4DqN+@|4dx1f4*8$b+fwj zF^%@<6EdJh0}x)eK>6SkC#l7%h?f1~(szUm!NIHYIW{lE15w-F-x)Aat%Ue(1F-2u zM3uncdZ?ceUuYCW81-KkwiN94$M7-bG@;^Sv4(D!*|oGWmrJ{}@emRrb{ZvzR)On; zm4x~I&l&Aj>TF{E9hgI}r2yLhXjLQh3LraL1PQh8X<(KgI$55yU52C)bNCy0w!dKx z!n*t}kK1Mjle1~p>)&-S_ z1YY@X(1$T=?BQ!p?b_+{{AW!hrWlgS1Z*n-^{mfm0dFHY-f(O07zx0da?&CL+IUGwBdD>G6b+xw)9`t?Jw~%x z(7z?=<%?(jOuz~l%n^>{r<~f}YzT5+SwogiV*vH)ea6fyO)d~3QYFDO*R3Jg7%mor z^O-E5>u0Q>wV9OHz||!E+ZSxWn;=A(cN(>@X-pxu1sw>_F9(E)ydU9#<$l=el4*d6 zA5H!#cGfFy(Ep2~3iX3E7T@-~`79LI*fAma&-Tfpb1GW-J2J{|s?clK;X^u67Xk9w z$$0CTk}5rval#;`$srouGZiE5^`K5?|vE?IJ=Dq zYY7}2NG6VQ*`Va(?TX3mP~fodb!;nws(echqJYzBxpc??=4V{8_(PTd;p)5tsr>)< zAIiv#3R&STkxd-y2od2>WF%xoS;r)4L%d-wVM z_xq!`>vYb2@;a~ad|ub%YC5Ni#g(+FsHEG|^i%NWi`V8D#Lyu7eu0YK^z#;r0 zUDtzQg=8((m0rLCFjz3)(m?NB4frB4{HkXaqBX~L49H6!y%y`B_ zDRg2fPEQn`T2UmYBp@Q9nOnP4o9e=bNbV9C8ZGCV125!eYA7Z)8D5Dr?Wi!C0&6;Y z!j{6T2xcs@eq&wU-0ydU8NRgo~8AH20C zKW9&st&kx3tU$S}s zN9ECjO?JK)K93shu>SbD2X4*%vS#A=43-z zWb@rr%iJqvF73M5;r}?5>Oj@&^t? zNn>P7(==MDuUqm6T@;O7bb7U4uLt&l3U4$-Jlsc8aOHzD{SkJD7N=0r=JzG&#X^?< z+zbKlcc0q_Kb4W_b+>xiQQ1x{*RvH}-`nmgHr-h&;eh9jcR;}6a{M8}9RWXGb*XSH z<@#J**-&&}7_*P6fbt{o(?SokRN_<( z+fcC7yAQ}EYNB&N=MS3Rw#km+%VJftBhi)8BEjT-JSR2Zz#hgta;eJYjw_+uC~WCW4q1 zalUTwE*l%yMar=?yy=Z92?TO1He)uiLFk^#y`}slh!yX%xc`DSuW!iUPM>&mi|ipp zz8-&nF;(UHC~C373Wg2%^T#Mj?Ic-1U!y5PBi{e}{?mH<{PL!CLAOjY*UOqQ^=hD1 z8E@vhl5%iS)tgq?FOs3%PV8j1&}Qm)C~uUmJAH<+?N9_f(G-ChP*qU&S9CPpJi|sV&ZVk~_ z`qmbeHY6?fSG|!==ABPvgWJmU)4;u6{%Yk=@)gmJxd@hkSGNkC*H{!vviMirm*`w) ze63-ozxwc97gqxULKw?G)!y-L0!x_#g)urIdaRybs`Wtj2~1aN{0?9MBVbmUatHGW zx*j5LD3hX21(>RI2kd!+#~3i~d3WPNVz{4ze9gwqDyONowgY``0J*oE1_LazXe)yO zpGZj(TnvuoNEF|}qPY!YN6slDmWy7w4&tfOIvTxJMQj78~ z+XuZFF$*vZX`GQ1iX=xfwJMt+N^1pQ+o(azU`rQ2Of+f$_{A2`(+ldoCtP*C(3Ba) ziV_Fd^(#qQtOpqp!Hytn5FkYIM9z5#@G|uDScwnxQ;C#g3HRT)fg)Jp$9ZfzQ=TJg zFZ{2`@^`hbbVL7uzW)Teq7>im65a#+BejuG^E>9qW^yd?AH>3Obs&B7n?pIbaJXXhI_iO* z%YDZuW!dSOOzUG#b#nkdiI8HJCbG;((VxlPhkAAzD>JV_6fmHGIsvR;HLtN)nM!3q zX^^koG=hI;OPnP z4w5g_g;E^V5$w>HTP72&K|!xCuGiU4^yvTK4U($YxiNI#Y_Fzz^Q#+$z?#5{hG@63tWl$Q@?- zwibU?zNSB)?!Y3KD9-D4&jqdVXw9>kW0`>>BHA2G%q{<2=pB79;G2)vW*9`Qz|AQ)> z{^d2;RkcMvzsyfkulO?kn_a=4p+4KB(yGAUwApV`ByiKPyFHwGDpH8v+-Gyv~a(770mHYUw1nL4{H+0_cci}j{n2wK*;@;h0&pCFAq}|gTI`_-KW1OKZove~ zd-iqg4(3(kIVxVMsAXL&loEz+5GTlf(uiF1xBfuHT02rsJF|CTompbhfoGY&Yge7k zmsu9>jZwr)z=KwJZY*F~C$!#u`zZUKE7p;qa`we${{e5gxnU0be#L$|MOO*XbMueG zJAJCoM3cBeKr)txYn)#5AK(Cj)TjuC@Gc2Fj=K%X>f-9c-(;BCF&dCjoqU5Xb+_uQ zx{P_nh&en_xxPD91?ni~A^CHQcfr6^_IIb|V7 zs#})I_ zG}mD7Cew3aj6EkHGq(B}klR(O$p2mdw%U=)U7@ZLIX;HhN`+c?{NNr-#!x znFPm9o6VG+B7Ak36?EAg8+fe@eQf$rQuoymt7Mj#TzqQk-T6{IG}AT!IEoRrXbAxr z$jQ;`;LhD{x$wf<%iDexQ&S10o#@-o7lOjcenU?(GZ0c+(zKPmt3Eyggg={5JK~l7x;VXszkk zvU}v#V)Dul_srEl})WW5cQujspywAQ)gWd85Mg%2$58L5w z!o1~X{p|5jjRT9^b2kwK|97&hC*AQq^rKe8(=!j&!$@}?s{JXr{7 zel>iRvv7Iep&Qq)|KD#v(WZwGoD}_)Z;73D&8uAPx_LR=ylT9R>hE7BJ_4M_`_XdiuY0M77j~3vUHPIA8@UfH0T>QW5~k!zR2Cf-iCE*?nlLF zY3E}6Lz2+G_i)Q^FfU)aPM^3+4N=ua%+@*;`jJEA=LZX2Z)Tl8T)dr20;&(v&v>SE zZ>a-LFRIa2xDNBX{0*&Dp28Ego04z&0!_%N3iG%O@hs^Z-u*_^bH&LK5APcea}Rwu zCN3I?US6HR8Fs?1yx8@BXn*m{a!_4E-<+ZULykw+0LPT7Ky=oev~Gr8gudg{&}?Ub zFXGPwd)wc(=nH~kjn0e=KV zqb2FbzQya5Xy`o5tPN&r-I}fX#Cra31J()sd5XY z*PfsJ$X>i=#sm*81U$Q(j0dk8A9ZE8_@J4rsG@ea0Pi9rMn)NW6&g4OP{dKc2IF7k zseh5r7Ps!I$dmK5LP6No@9yS3i|-vX(-H~B8UhfV5GJC-S9H5s4lpBmZ~9!%oZQ)b z0|hU(5yv3%vCRjgT3(RHo4rcMLz35LVe(JohO0vsX!~_A*>&@Q8FM~kv75(BFg_Cn zYGqD*MF53`8$sR?;+w;i1EGN3tlszQ-{ahs4!+mlgv{UmS)v2odk+)U4sV3}NDp(a zZ!KO*-!f9-PZ6C_|B1N`$>a}DdN6t7`P9y?@Mn^K4N)p#U^`tOR^`=92iYuZu|A{w z02`iQS(AcrPJsBysjPAVIhi~?FCgsbU>9>n=5qM? z=Ci-705aKB|9C7y_K>fn<>>CCng`ln+aQXEHSL#LLTkc{29~&eppPORSHk7Y>g;<* z7HJz(dVaE%$7t8pNwH+A*-_A|eu+8Wn+3QV@JTS*(~+Ei$jM?pZOy4dd+b_aK#?>^ zUS>q(EGy+6$QAr`b1`eHm%tG|?WrMJs0{fNzvelj?{erS=+;-;_p$36vX_6-(BfUe zi0tmPW>QbRr~@O0wzZ2?Lnx7Md*9&og0$15{Nl+pz6cyMGYjO!=5Gv9xZC zh4FWu!Fk7_Yqu%`hhv zi<0*Xo~3VXYe%+*-|oqJid2hM$6YH-f>3*dOrzIf00&SN)*H1~sT=YuV9K{?MGepx z+=0J4`;JC#pTQn{z;(&ySi=Lr1F)4|~Px11&1y_qB)%zOli=;fXk#hf06Pi@}8Vg7t z-%fI6#83!Qd-r|0_(xPuZeXwJWYyFoE?#N(`ajl! z#!jtlC98cMp}l=B;>cn4!~*aOKkF!@mrm?>ybE1)Dp3@ z*5&FCJUKLa-St#Ut^&Tsb=xM?Wz&~g+E~9qQe6ydE1?qpg#=i+r zXf0*t{F(e#QtHd>%Cj8RyGrAsRDSin6uv%3w@@xUZ8tFtc(ULAhwiyfJf#JWO*bAXmQa68f9$?Ey*TmQ_kw|42mAC& z%}SfiKV*M5P1{tGf98ZkzP6gfr14>w+`HF-%|IdnbF7JJ{6?f}WJC5jM$3KOey zf9VGb*J2fCZn9jbRnKV4mfS7dLGOu;UZlkD`nE=)t;$Rf{J){!+~dc5NT4T{IVCR< z&P_aJuduI`rOi)H(ky!VI1ooO4%7eqF^Mnc8$37cF)(SW)G2%Kk=iAh9)a7xT5DgTX*_YMmHhw_>fC-Xu=v;kDUUmU#hc*eWG3A!@ zLLvN^E;=7jv?|St-$&qY^tiRd_ZshN0H!Qs1bzO>I4L3!eX->`!|pK@?QTG>B2QI_ z(q)H$=U!Ak(9If9k7G&i{)X6YIeQEQCmf&k1LqX=?>8^^&;O$6{{fOT-f}&5`>)Y{ zRBid!jf@}d+X`VH;AEpac`_TB9LJb?ExQ@$P%T3~Gqq`5RX3Mk42R!lrDK~b*_4)O z%hSyAC;h8~j$dtY5Teu>h03ZLv&B=6g+E4SgMsI}&l<9%@7q&Tdy^P!x=078W>jQ( zPMB;?S_E-3KRRv(iXLfXJ|xi26{7^bcvxpWmL}v(u$A7M7UQm+xNCd4Usq?w{Fr(8X|$b)M^z7t_w<{Blsn)LJKg zh`a?Lorqqh5N9SmTtTYK?beY%MqKukLuzGnw9Q5Nv#cYZ8z|W;tGo@=5EMYM6X(XjxZU%~ht>gPKAAsd7+v_z?HAL*WZ ziA)SeaAJ zqffu5>GAUq!GOZP6EAqRn}uuI=RShDDkIyzl(43q=RT-a`yo(B~pXz{deYxY1pNr5~@xEkjw9Xk4gM-o{HPN;F zzW>ZVTkOAhSH~H%mSf%8HBw@9^^}$$kB|EF758b*bc25dJRzfsYgAmhE=!i+ZW_b< zyTLve42fJG=C41ptOK@0`2U=QN@2=K4i{DoU6J^3JcE+Pn>RGCH9=6dKEbwksqHVB zgG^t)##95k=bNONl9#C@6PStCUBo(cu1nB%5uL z)`N?)LtdmAMiOdDeWu)QezA%1St|7|^G>k3!-Yc+XNl!fSZ?>F?ucv0VN#l4L!Xe zzRz{>&*|__oyLsO%$Iu6At28|^PDl9??NGfQq5A&N_*lakZFa#(NC^0R`EAK*oMT1 zbwzeJ4G?4%Cb_FsJvYDskg<*c-9n~b!50xpzpTOO^oPR1W#lhGBS&vNDNZGf&%1^n z7BbMi)d?nH_*j)I5xq#lRXFb=*PeL3{OpCoTld7@I?}vImVwidwfEw2Q%1jZD9c!@?>9C2N5p+r%p@A@_=3_-3I1I|_ zCU4y&IQKPx)>hCY*;wa7M>vx;r8Z*3Yw8WDr|Vu|(phF}G{7V10bC#e zB4dcX0HQZgkYfBTYtXpb_#OHAFte8|UeEnQzNFly8#e5nGEVo>wEQb@*Z@d_s^QRd z!JiD6&aSDWAH~kaA^=&Cn{TBxk?D}i&&LvcRM)D=zqCur{-~vLaspHDZtFv73)(_I zFwiWbE;TCuk@5%7ZoI2f&?);bN67Bh%a;?qQGpqgc)EHlco3qZfm;?WdHh8(B-w&_ zsiTQrBw-|NMAE5qwryMa3d@A)47R&>$cQJ=vaPS$*L4oi>Qc#f$UpxWmz?}j=+tK3 z(3Kzu?CcpH{R_%C@EXy6Wx)9C`SX~<3LcU!y;^X7!b`?yLIq;q+7v}gqIVOuk6%9D z3OyZcP3+rETZUyNt}=-^=AVRZs7uDV!G~k8ucM@J0kzmHLx>;Cr#Vui!FkP!LQ44xMVO0LhN#XfxOH6zYrAM-{j0f%+x$mpn5 z$Jv)Is*ShDG-m*MbIQzn?q9suz$!W@BT)Xq4$vW{Gx1gpBbwN$Rx|=JU+9v@pGvLbA{u$DzfMs6iho6VAZq(tKzr_sp!KP4#NtPwO8Zr`PSYaWKP|u-ULV zU7e9izcm<$FL_n^aQm^5h3e!eh0w~!gUaqHz@a%b@ykrrvWS0&EBvD`Pz;BMCXET_6WzYn)_Jtpl(pYdZUh zy+7m~pi+i-$UTR8kGUf7tP%ZD4F#r%jFqsyvaTpR?ctq?x)unG*WjHmB+?Be3b(-M zs6Q0RWJ>x_gJkeO$J+vbC0n+*rw~=p!%zdr;3s~2j+D=fO_ga%e;8K7 zOhYp(pfGIUa1GRj##uH3x>I#B3J`$1C zdEg|Gv3uvh zG0wh8Id%0!>kXV4qw<%>PV(&#e+fV+AI3Aq5;Hp6o`e6s9cKF$z+oxH-349qth^T! zDCtXMMC%U*NZW(gCc$pVfFO;tqMN0^UYHFS(Y-V)OVWDcns|gW6E~H~;db3x65FRZ zSFMKXwj#Q0_Z7;W86I$)hQ_J$#cJK}&=j%F2NgFay9R|T3B}MWz0tH<_M9|(X1K{v zDC56-!^C^e6`#2|wG?L!fNQTu;n?4uRQ&yVw*F@CA}&_(jB7622{`Za#(sK)kThWz z>}lL?Qq8@(AS$&Hn(^i{HB6~EHkniZ(u`IzLvo+!W&nl58qs$xO#)OX{1S@))LJd; zz6u};e8V#R_j+qc{zZe87hpq#{fi#;dx{uXeey&%6Duew%W5hH-xEN$*&1 zWoW$txBBpzBN3OuHL-OO5B`?vF{+7So<%DG(SOb1?XC02zb(I0zqt1c>Jc5}@qoqP zds4H^na<9|FY7|3?&V%n+pUu5v=f!XD-FMF5cxHwm3UR??GaIqr*D z-!B_D$}i@^=hr%fG5XKR+KcV=c=#R8`LsZff#nRA@!4ChuOQ|FGZQG9k->n+Ke7Lh zCbVwbq#54M!#BS+j?y&D0~%<7C%nTf{1{!RMdz%20=}_aq{MZPqzYZ2eY5Z1HxJma zzp3o}|DsQpUp~lq8h(SA`_kiF>1h73eO;L#y_4!ItIMx_0GC+s1RrmoQmj*$$g6Bm z$)fOqRq@4ae(sHX$fvm5oZ7)%QZ-79rMavBiL2jdW4KMNP04So)$i;LE5hDLCjYkK ze7nMO+r{E+c7ZUb6SUEUW^ovh1+0wb6R-ETsQu~7=C|eXUzbiMKH|TniFdP0t}G`= zh)2k4dK7Oke*3b(@9Xxw@z`GYJViZiIHpH4q5!tvI|BwWg*NU%=^4$|8^S0R$%!xE ziyUg|JEUnv(|u8XUlJtFY5J>7Wv8*6iWqCtlz#HE<%1Y_@#oL&op4(eQg2AM+!o5! zOBH&CM0T!Wc@$)|wyaXraELzEE+{NA3IhZ$JuohV z!xEZRrEfspTPc5FymNXR*Kz@##tv~37+?M%m-y((g2_IrDI8HQX+3Lfm1mo)r$=FQ zhl0rVT6<7?XX6(?GIbA%Ubjba$`0}Shx%nLevfBbVm~)e6SXL5+2<(vahIPB;};42KjH4;pxa>y5=SjU(r(W|W-GWMnB5c$VPm}R7MC-@wIaNF3rBDu>g)Ss zFSfJIcRw5H{Y?%!EDv-$<=Xb4(7Aj&rOc9gbsl}?D;IQ09rx?2+xyAkrWIiq?xlS; zZ`|xg_`f?LZUVdthJ-GzV73T+eN~d{arRIlB+|J;8o9LiR<&`g7yJtbiu;s(J1cAGt z?-*)<{qJXlyoIBKwJ|mNbER{X5>F^?`-btdw-UJ>`UfY$Zs=*KUo?~H`1@IH_iM{Y zK-c)~)%g33^z3ySi z?KTQw-Gwetr(wTleP^eOBs)t;UASQROETO*;-=&yCUUWwO5(;GD z7O1}aYREdUuwEq2q4YUC3YSx%2MEZLP6s=%V9xfaeFv=e6ZxQDqK8n62*hJfr$46+ zQxuQ0eb^NaJ@{3!fXAO-uG!J6o zn901ZdQr!f4ws`|-GIcQu!gg`z-Sc<9-4<)l@oNl8Fo;Lp-g$1xvMW{W=m}AJnZFI zCz^||{Q(EoTzO{0cYS2uHa%;MaQnK%ZLr?BaAA5tRF40Ju5f=#a#^=sZ+F@fbQ-X% zaWv%Jk~9iF>DAS1#)SMtAMIZELv+iT-4qxjqwB2A4jc=iB{c1GK*)u2GP@T3NFbI@ zwSv|}N1XjZQ{SC)!EfsQZ5#Yo`Zn)3v|4-x_-4oesT_GBg9SLsXOmVi;%pPwqFXz< zhz5hcD|vp?5KolMbVCF1;RmNrWA9mj6V=st(579h09;NUSYgDPi*o27f9VtHJvxWxc--+j-2RYUy@Vy)bNl= zx4FuP)g)cWGOMhU>^0N!qLYoS6)6Y%=+`n|O&uFs4~=xXP(Q;KvJx8b4{qCgTT~Un z`s955wVxoRAlsBQ3O?-XBAZ|Y3x<9u8fjMXgbHW~M({a7>ljT`IPUD`;_g36;w$?k z?Istk1iZlt%CAzEn=fbul3v(QEqwugd!^S{q}q3I8*Ni{o!LO?X0(!yO|FRwX^dwF zHqhxOQZcWG@g2KN^XJBYj~_)|kNfwpdKe8uX|$>sio2ozZiQvAVM})J25AA^YrCm~e)=&b`x;iweXUqz(%L|r^WJpswVN%kx zd(Q3n&`X;4y#MNK`|84(?y~slrA*MiOkrB{rfp3gYsA$RzB@2Rr7m!zE@0z8abaH( zn4V6aOH8SX?p!K;RLVRH=a{RT^O`*Vp}}GBO$0>a-wX69}L;-WnbbQuwoR*rzY_vAhG2J`K4G;rBe?jySwS34=cu% z-pzjfn+8)q11-Vm@2~;u#wPyKK3J^_S`-c8xEG#_44{W&pVJb^$z;Wk!Uyx-L%G`P z#qtN#hhEVsJObiY-iWeb)^L5_i_?c>l?#@vA54&%dzcJXJc>xK3LH`+_m0&zQNn+) z>4Sh^-1{29-FjcITyfpA@$L1kV2Qha;5exw5n32HE^3 zxYc#*y@e5-g~*RlmE~Ky6T>ba_wqpcy!^U3_cwZ7RyrhU$cen-i0W~Bh|}^o>_=6b z7bFvgrsR$A5|2oJ!5AuA5ct;4{xx&Adm=JZr4Ku7P;SQFoj%?v8_~!w6QWN;kTRE= zkIRY^h8r;3Dy#odD}VDjxq5qeykY(|r}afZs$ReKfqQPO3gsW>ChQFxnr`^n)mipc z5*=s2nwEvM;?)V7H}7$m#Wmn`K|lxIrPI+--N9To*Xg2<8?U-IH9ED6n8e^HJv!^l zp!4{vFD$&|I$lL2d>6LP zb~+MQ7BI^bUSjfH8BWy<_{EB8t`dmTrzgrf+7!PL$VApZPJatkLOi+9+5nH#{-)FU zJ!x^-ACw+L*!D&HMba;E43LbZKFOB9lwN3R<>P79{ZQ&2-d;2@!`6bI}kIzp`NdplC}JGNlIt>Ay-Y za~P;E;!#3B;P%SLw{7fKk{qSj~ojftXUv?S#>@< z?$;n2YEp2e#aRU=3?rlLUi39rrGV#$cwq>MNzWwAOrnee-AsmMc;1TtJ+uijN z*#>Q&4F@d0r;FeBZatghKIgwX&Y*G->*Bw3K)kwiFSIxgx5yEf_~d(4oqe&n#)|go zIsj@GDKwQut;avPjt>e8jav3n#w1&CtYfD0=kHGah7I5PALHl)>`(2Kda?-rw(F|z zjTPwZX!y_*!Gl%kiB%%jb@e}b?~<{?K5}B}kgU=)>%CJp@3cYcWhLfzYW7q?KmxrFSm01W8x#1apD9ISQAow*)L{R; zw^@pZ7^19x?zUuL*?%|kGvn$$D)Q=A!6jvcUX9?F(=xxuR zhZwj%Tk7JXF2lDkeE${UyZmV)>B~{rzyu$}_QtfEnL@tZds;%CY$(#qcikig2u~6J z7oNhJwd@5s=r>ZOA@Y`Ri7!l6r%Dz_KZs}~YNGH$yfxA8t?y^m5?#UX4P;}%VXNOy zg99b^J3g}@qkI|JFrrnJQ;{Z)xa5Y&7VUW4%|#Li&@S5- zxGsKo>r?4@v(`3{Rwy4)Eg_A}Nn_$dsd(bFA1cejMo>}2bYK%=pph=|eEs@k2rDYM zTFQG@PmdYvNxxfNDeS3*l?NMDiX&#*kL0;^2lRQI!EWvi(93p@-BGn}F~ybeEpL^quZ1iF=!tNh z+65}#T*$4^#<1jD!2!?@sF%_vYy;^&2#bEzJ_cakzt-b9LYF{G4&9qL&J#0n@05~; z=EfFQ>v|ocA|91m-QZv6@%%ye3 z?V+P8p1(y_ZTD}7lJXC2f~GFaZ@*NxLg1~E(tx`G5*|^#&g}c(#=gA{h0eFD#B3qm1ZtIZ1U%&$>Ft zGoMK)SO|Svg1-AN8b}MpU3wSpGf$y7>;k#j2kQc7>vUQ#W?OaG{~8_Kc=q|~Ap3Ic zfZlwE{s#abjqYp4#j?L#UAUYL+L&+mTOiJ_H3D;XA=e4Bl1j7@&r@zlVHz03&ZT4TW2CU zCdaalq&^?U>!~{)#K@Puj~TXxmqrcvjvKBeNN9fl7D6hhW)D`jREQIlM>W-Ww!NXT z_J>dF$skmf9b4Q1RKR}f#?Kl%X{6sfwmJF? z^9vqR3r&*Gg!Lv>Z{p}UW@S+}vE+P=S7T{&eNku6>2+4{2+^T|QsX=9gS})ncBX%x zKu#cs*4^RA%nckkfyq-vrO#fpm_`vE+=EXhkysBn5cE2rtc7wi*M4$)ckWo3$mF^E zomW=s)#Mo~nXEwmzzNy6r_;urXNxpkOG>!@hmaW(W%V-D+K8wX=^Zt7_s_`82M(6I zc1lDldT*bDw=bw?FW=|hitKWCEBdJ#m+_OCg4otO|DsCI>_cf6G&itARlgH(bJJnN zjOb|yQ<}N7gfnb%gN9QI9KZ}bbN?~>MUv;xRUXJJ$wNKYNT-EU#R2Q3GZE1c4K+*8)+0kfVwX&lYs1zwFxn4h zCe>Hg!MJo_?@q<_`Lp=g=n{drNV}}-`<)+q-;GX_Z`eM%+FwY!T5IU z%gGPX$F%jj;)p!aG1!lfCD)E5njz#w3L_TG%IR#-nTsyh87XWBn-nEVg^tCETy|J1DG%!B1_ zP?Z&#Y%f*>Kk18eFi=S~R8batj6kb=wXuQy_&|HZHd<^$gO-B6Fd~!|PWWD&n^)qX zSQstpK6J1_g%=!auS8UEl^PPPsd0i4p^qOz_ZD^K^9KZ3AbU`>6@vM) z;`i4-m6ie%ogTw-|LSKMT_}#VVuL*=>LQWRod0NDu8+6;Bq30=PVxa0uP!8X1Wt8x zz1HnB(u|HmTXL*C%0=jDBd0y#{I{O_q21Z2n%W8gxu`( zYOd8Y`&9m`Fa03nw;h6k({2Z}ypfVbQWG<}H8d{EIJk|{FNP&9D0$(JC z@tAw-2gOqPF?s!(H>0Ah5NTKjkmmnO_%P9JeCUqj<0JqzDkju(h>#pV?-&kU&ALj6Py-CifV zvma1qL&^X5Rp|x@eJ}J(kqCcLudk!yGvY@>xbs++-E#gO7r#SRj2cWMjPdUF!NVp3v^ogkTS7`S^rr8QmK zp^0vvmF>jRZKrjh=9qre9KxlZ7)C2iUz;AQOH88Zu|+B0c?4Rywt(p|dFWXA2`C^? z3gpp>-3o8N%K`Us{>q+vxm3+7kq1x8X@4JU92co9%OAYbA@kTIiL9>Xsfjyqxfq5N zx`zQKz%#6N3>;$mII-IIs5j;o{Cglf=Lkzvc!PAXXt|KK5pr*fy9w~BFm*w` zF3Jzgo~DnlviQnY#yJVaWN0b4WMEUudv)qb|I}5kVy6#HBUK?300mC8f)yv8%)Q%aH?MH2Wz-7Wn67 z4&-;7)h|fq5gEjVBS&!rK1iMobJcsGI)e=qA}6M4i+a!y;)&HavM3>8-HE3$LDeh- zs=klc(slJ%;$Jp`V(S5~zYP!!#D)o|yykjb%!;`>wYb_CGYUF1f^9Dx=q!xaa7T^Y zGe4@)D4t1uOiVw@$lRw2SA*{_3|;)7+A4dYareM2R~P}soqKdjB1{o|dv>OzTeUe2 z##04z%m;?C}Q&2xSv7uHNZae<_kNadU(CKNs`|sFu zfz^si0;)hX1Y%gzT{|&1X&MSGy+v(WtxS$L{6hRQ(Zg#sa)cBH2qx_a>cT-@a|3%D z^^#Jc`kBVxux_L@A0Rh&e_gJdfFvy_Uv@MXCO~_)%XTs1uMVre5b| zdhnifJ@GcmOr_6JL0hgpO}h)42@K05iv5hg;_QbRnqGG);HO6RNLB_H<{os+h-)Iwk7KhUlG97zd$~!toDFOO z1O)$BHL=C<`}*gk|Kse;!=ViOzMq8DpdwqA5R-k48EYjX8bT-`TgW!XzLs^egb>jn zI}ys#*o}S5UbeA}Z7do49^SM2zMuPe-sgGW_c@ODuj`tb>o{gRuk-qy-{1H9xuACD zhG!GEsNOb!wT!9J@RAUj57y!g(c>IXz!bPq!txm}$X(Dxsct%Bqou@hJCv82U-BBB z+Go0(hAPzZI#dtsFDb{SogPyI841xJb09qD$z{g#XK5DW{CIQABCy|oJ(q8~i+ITt zg!8ld5ZZG$>>aqa8)Q6UsG3dB|218Ag#vK{UD3%gU44}{SLj{^4M{K^Ht6rtASp!n z0A=Z)_AmS5FC|tcBF%-a|C*b6i!GA!;jcyeh{`EE4?Cma^aO&-s_d^cu5P>y;U)(% z_+pF%??m=Ch1zn41Xfff4R@?@?Q~~*Y3Ul!i!8O#8%DDO*&2gdr`uYCgjkQ`RwvE< zjo26o6NtxE9m-Wsw(#jYr#woBJafFoHy%FhS|T6dKnXJZ4c(-Hib)U8a{Bt-h(a z2e;l-_N0P zce}L19|Hqh{wLOa1?G(RE;zC${h0do;F zBrofLk5<}gL{Z?0LIbAO%jRH_@!i;kep2BoRFq z&wE3(W^uSy*dN|m$q$vCWRBK^kmd(&#cS+L5q07{IQLO>6*r^6j7QfjJ>uRtFJFi5;0v^+8F8_aL({H_nj1>oQnI=P-t| z!gTof?Kk8a9U~6URAMp-YCqJgrsh6GL>1mK%6M(TE}Q;cMB*3HobC0L-8-DI88tBF zhE#n>-;C^nU#>D9LbE;o8e95uuJGzPM$}yo@z839^$RbBrtQ74<7atYk>5P@(1cHg z0xBW&ajbaVD)!32Z=V@x!HDj);M%kaz}4z%x-3_zg}yNnxl_DfXwYbCOSflol`Mtg zrQ26sm3x_ICM{&yN`QGFo%??JZJUA{j1KcMf<%Vr7u3{P91HY(>ZuURGLMbBmuruU zKDksuNLG(03=7Sj1K4T>`X)~!UY+#j67joi5>CDS{7Jxv9VM1={jf5-@e0Om&vZqrYkyNOW}0o)x+ZBY}4dA zpoaP!My>5fu}?XLdV}`EEjpkN`TL(#pNU){{EYmz|8Z)&Rpv6&WWc+1BJ@Z_6guhR zAo;`+DRbMCHQ2n#$#J};zriUQ+zDWmG3aRO(CAf!yXJGDpxyIS4X=nE{?_ZL)5GG^ z!zEJnT8`{SfYM3BHr1gb+p4YU_MYcm~Gy~=*NPQBmFqF9pof~(!zdlu-b z_zoS<@*~VRI|(=OoWWWQES|enjq#n}xdoM*~;Vs zh4)zGQUX2n$TVOSVkkb7Gy0zbcrl)#=EzrS?8#60Ng2GN7;n28psg>J*mMk@@gliC zFf(~7EA(Jf%-n1}$j2^ZNh$sZ>we_t^U*LEJ^$V60*k{xUL+kgtf)zFpQ$B$>TXuvmqKQNOY%Vw#?EV*0O`^RhK+BiR`?{NEC$6lF``v`CY~u;7LN=&1^8k)vcot5-9HUwYelo%Jl| zeC8^T7tCAwGQU(ca!p57dvIkwpo?0R9ode@7-5WU{FNG zdAxW(H?3}~XQ{H+kF@<|>hQ~;hu^Tr!>L_|DQUkg&~x2RHmLVL+;3At)QiF%rL|9= z6k0!Ys-WCktMxk!bpnkd$RFwR9 zEggtkexL~;az|an8*6%9+2i8APhXl{&=DBI#ai{dcJ-=Ta(@=q4exV?siYR~hZkQD zIx_H|H$ZscovB7!fyUeWF8%oLB_x-M(>I1OT$@%^eaJ=PwIkcdMStC1Xu_xO!P_6r z>M8>@`gE^sDG9|4K}Z_fv%z1P_d=ZgZ5_uclxLg+HPG>7@|BKyu!E8f(BzlC5WUbW z7i4@qqH>pVuk)FD=FysV;Qoi9mXK=Us%+~!!3rXwgR6SK_*HvpR?TM!CeqlwJgcO2 zQ==P4;y@7){gwB48iz#mPa^~?auM%9`LK$i#$>TUF^Y9;aP|+8Hb^4bHn?2R?J z1ePcAJ|WBT(}(m&L`?`4LzCaA-{CsE-(;~Px%1Jfn|61f8t4s-Y$zAhRPTzfxwfJ@ ze|cUgw~`BdEsmL^xNS5$PCoYq(--ai#%H!AO_l7fa!w4;=SEBJaao-UIZMqd!S|7> zy%Tx+;AuOfTD=6m`3+nS663Mv%Au394L|Kf((^F({Q2T864c)Y)m)8r{(|?Iv6Vz2z zSsWRUdiIVAZ~xJzUNUb=D(+UODChKx@#by0!}&jbdNfB94L>Tv{wT20M$HhM^oJU| z_69V~?U~q{0*p*>;DH{u(|yIcsznDs_bx%t1Cz1l-t`$!78xkOCpIsb)TuYswvRH( zhmzL>N(wwVC;AF8D~^9S$)dVi%eZ@?C(rUS#`kl?XnMYWpTEI}()MY80apCfJ<2(Y z`n<#h-m$d{?+c;H^u2UDm(iJ%JJ&qkq1WZ64tkc3*Ip@=3y)P&tzN5{P})wXTRq&f zF{FC_q0KDY>(whw)$Zt5GZwC)R~e-zPjnj zBmFkx(&mg`EGzb#Tu+cYsZ%-?27k6ssN~cN5yejs)6}-^1ss zAMVAS`4QG@e*{Z*;56a-SdmJPpf7`sBx_lQC%6nGY0JC_s;=p?N7l<4!``5CKHt|F zxOLU#LdO|c(=OR@hHlah#tEk2gPrPB-E$%Kgw(jA(iNTNgm}rJm<^wvCpR-6sZrKF z1NcLT(TStNtqDmV>>hH{a?)Kk>`jDcnyO0(eXE%?mh-&=K8~1ZP7Sr}cVshelU7{9 zvQG%v>ymrJ%F%Ln9kb;q*e0&Qzuro%3GYBo(=f122*Np=1lIbwT1LB>EL%}1&&<(w zxKdNiHZuaUAYxj1&yR)l_OY{xi8l|CR2gDe7ER*Y%CMlrVCz20yeSGwtD$r_ZKG&TnOWId5 z7#aq-WQ;r{=~3~5i1B024m zA1L9KiDw&5LQ-hWk?6#u6_Y(#lRtRp#^>D}tI>T5rRm0zs}}@GapMAxOwQ3eb=|nL z2$b(nS`#c)=ht@KE3T->1BZ{oGN5*2`+u|0P8z zSl~3>E&o(Fq4nkY!i}KnFoNSsOl|?@Defz+WUB1L-$8K;73hjD;dw5b)*n0Db#Dv+ z%bc!a4Lj$@B9p6h9&R=-DX7zX5hYKsEX>gMX!h9Bo|K5BEx)2W zZ*_UPWC`}>=dIH~nupn79@$$Klx7??8#kM+{9@_(sB@*6F?p z<*(^iseDizKgK`nz0-8Qm+%wUkwWW(U127T!%})BkxJigO?qRU=CfYuscs`ho!)Y` zgb^7VJz?b6-+sXumSKIVxvXg4lv3Hj`59Lq4*AS?jD}@nhMXvyaKGJ5Zt6B(LCD|V z6^M#6z9JgWpN^)FW3iV}d4^!_Jzt8q0XtehV-@D1~H-k{%$8wWjILAZT3-*F!so_l?>w5yps3yp))}j&-1%DOAD2M4c~&X z;`vthv#$P&%6zJo@R9>@ECp zx0s(dy3Ym1>K&mFpyQZMUs4-RBepbU`87nBGg&|t*~8LHEh;U+mZz+1;rPc%z2gc3 zxW?32HqRo1Rh?te)y+s~kk1pMKEmV=&eC6+jp0z@Z8=7Yna<=)Kk|}Qr|d^e8{GPe zEY}d-k;i*C5km8E!_oWzFI#eW%2`#hgJ-`+o5H@*vL}aEfzF0~EqjwXC{ygDrq0SH zfSJ&Kt}L#+J*lyC+qn_TX^z!UOS1SgwLExwp-}T{JOOi z>ho&5K26Dcml^fe_XYB;ZO0o~e5W7JN+Uz7U_R#R#zUt+hRz7WBjRp#zWuv<5$;8# z8*A}>#>?EIE{>;LU?x>p#{L){=?o*PMkw7!3xvvT%3FayccTOh)ptA4cVSas#vAo(yHsXCZ!CkKQl zHqHAmza(Oej-R{?4kYCF6xEG>3$Lt1c(9e%=o;3AIY_)TXC=H>$L!#*laerc0&H{zC)AT^l^|l!4a?Q*=%!N!p~?ycp+pGzl; zCdSbHe3(Mh=JIVdNFG0H(ZCqV+?1k#uWc-dxjDn6z)ZVHPz?~qbfo9!I%ZSGUtSwj z=J&h&sTptm$0dg3Qt8$n0os7%Y(15igY*-7T;Ab8`b5YG=$dlIw!9Zt*DW1zaLrC>??~09qlAxBcd~bAabtM%yC9 z1&-5+F|#d-C=U{_`}@KPRc{P%$&}(Ijv@|Y9(_2+%s=yMA79`}^8nM26kCJ1P#$?b z;FJfX=ktTtcQQZK#NdNPsCtz>H7xGN*9=n3hs^P5ihkC~ zmAa-Z|HE%?X1I9KfSWTNXkD3OdpStzl{n1drw0@It3jaM(6XAd8m@r(8$0BhM&3NOW4e!rjzJ=?g2G)^Z1|3k%Y5hK&2Rqey_^^h z&uOyo(N`ybm~w(rM3~3SeD4>&T71Q+)WjIQe8@>d!}4{ebS={^&rD zZNCf$U_kLz><{9_Xw%S2pk_=MQPkdW@l^95pL(a0plB4AsyVpoeH{5q=B4lsLSUV2^m+2$BBm&)IYa**Nn65 zkH?wZZkcgVSW=IlnLH!S*3PKy)86mh(>#5$Efwl>HGIptiJEw_&fDy@_5?K0AtY<_ z7nwnj(CmN|M3^KqZ3%m&In0ov$@VSA2iF~TbU_?12O)h#MjDoN(U9!!IFo4UjOq6J zrpl(u{V@^7n{{@4vm|{KN!s4XbBR~$Uc0of%ezEMk`cPM)4;5=Zu!b8I;)T zIC;D%I17tByvac<56)Jy5N7o?FmAl1(%&9qSq4N~xE8p_QrGE>BCt}ztwk|&kL@d7 zt47XiT40StaLkD1%>1d}woKohbs&4o>G>SLoOO(!nIWx(=Jl-aKB})Ql*&xg9aE_n z5xMh`UUfGDSmhiHUuJf*v>|69q)3b|=ShP1^4q&}czq_Gz`xB#>$$zkSMvUtcf?>9 zsnnZ@3;Zt2L$1re0?|i-N}+cykPcj28$>L@@CaA}_vZLua?oj@6Y0^-`{_RVJ&+c-F+v`dy0 zwl}4$W$VZ`T>;KyG}>pZUhjeRBH>1mT!_qaeuTpiOu3$#Dz(*@ThutTjap<$CWu^% zoSmC2Ij*?0><g9aW~pi6YghpeB@G{}>{W9Ri|^H@-?FuNb!{b%;Yr z$~9-rvdF)mDBO1mH@NPTvbC#bgjRLV5P6`+G8)c5Y=ao8w?W=tJoi|M(q%>_mQ1@a z0#TbX{~bB-Tx0KJ)uaK;I3?a>A*%}O6NN5YB~eCGNmM#xu$|j!)##J#YK!iYX}O&Wta2 z#pC%3Ck3eMmLDfVhGXI2MgHnFTo{oTWZL{a-E0_gM-(l;Cm4W#EdiWha4W?-=>Dm> zpwGGrvw-n}7(q&BZ53rjHYNF+wjUUl`8|iALoObFk6dWp50%Gff4SntuM`8ma=+_E zzBSKE=k&&DmD@ot4vDRO;7$Yg=Dz3Psgw7o02Xx zbNASr*FwS|6CZWK@6%cl?&0zGC$k<9d0>=XDGN9Av_mO&&kFq3j<3q=ikz$2Sf@#T zJtI?HX2%rgGfoa2Zb7@dU5;z|>c`^JD!3w}o>)bRqAYr9`oi_geDH||(`Yqay)k$F zo2?gd^i!452~{KgiC^Z=G3|Urn>FTGsk-RYtM4f9_2+lLL{u(FjjA+OU%6x_Qw%=( zR)xUdjoI`&|G^6O2>8$UovQF<89L&j+4c^Kd(!0v(lq?N^uR+H0neE_gAtPsk@Z_% z8e~5`j4Gu0wsvR97*|s~=A=K_n~m{|CQL-tMMlnKbgkPWSPHsE=uR_?Un^6;6?J#G zyp40*?vM75KU8DRdbj&E+Ry&5fl5*AxSz8&jd4;DWDRuv2dw2Vz~Z^~aL0;*rR#e_ z+``8Jk)ExvEI;;kbt)t&m3QGq`YUR1rsS?GVxkJxlU6Qmwz@1FzZimISkT9l9sChP zi(Lc$F7i;4hJ9m6z_h|wUmo}Y`&`wVBg+H5-kS*Ku?-(yhsQCT&G6HU$NRO8xVL73 zt#A93%go=v^b>|Wo=p;vF^?F@{nI4Uqq9CO5 zN%hUB6>~E7yEk;=k~hcX0F+-z4y{MRlkTyjjK2Wk^BrLJlA|C;FYAG=|F2a+>DJ^ zYm>Ie`pbmf2p8>i1oozIS?PYJthltv+abTqJ~+| zGQb`S^jOesd?wzkSW|SsId)YueR3_Y6>FaTcgpf>l+|f6EqY%4uxyxOj zQ7B=8<{(nZurEWrt_%c!Iz{DnMT~PqKJW4@9PCKfCm?hDo}4H~&kwnME!2e>8Klrt zUCDfSZ~RTKw9?>vXYa$>vdS-w8TxC?2-h#umPIGimj5AsBxPg3-smH?6Im9*lm1)mt)xc4t9}CL_u})}rFV$c4i$8Vlw$(Pioal*vr{d;OqwXo)!E(3WhE|FjW<0RPRmU% z4*o%2&tiYQId?m90b&8G(XA381?WaIxs12DS^Eaq@j}Ni?7hNoE{8N6MaysAd@?&4 z7iWQLjE(*h_vU@btBB#u=vZ3pV%(o+A|}y2-W=J6e$&nFS2nKTK8FgI#_JXhpAHYp zQSRB2yp|`l6lAC>E?UC$y>}ay{EwlQ;ByQ!b6M{w0Pm)kuLTe379LjAj|T zkGGC_(#Xll%w!=+5GBZsdd?#6x? z=DcY!L6Ca&8T9HZmW9^P_KBF^rY`0vrWGdc!XFKbV-r%?P1qm6AA4^-fPdxHl`q%U zGCyYSrJfKw)5&Otzcx{->mWm+@)d*O9B)zHbpPsRa|0@G{v0#yet9RT zD#0K|+aRFmTw%j2VWV*2W z{2|=Q9cljcYAS|}!@-fM)DB|JW}tA7;|07IhA85c2#xcXtUtx*`j7h~hPEv0@;gNc zHK!*>O)xeym`>1C`3vtJk19P62e`7rDWZNiLj^yd)3Eh_a zxmEOO>V`!{s#f<}ZbIo=?#cH=`ZaOJXs~ccuar96wI38F@~FSM;i6Thz8G=&*Clkm z{|tTF2gN@GIxUb6rOKt7^x*WWZDQ`Fr5w(ixZwAY4r;vRx9sYcHsBOaCArrhyY}7h z7^9<@5aw4V)5_V>k=9?_PYqoNt<}Gr z&1-H}AB^mZ6Wv@oiPBKgMKokqruwcNw>V=|J@HbHHnD6~*}l<>owcRI0tOrU^krZN zL@8U}SR#q4OwKR*yGKWaAYscVE{?D`BmFXnPKP1MnC)b>qnATl@ZT8ArhgE}>lP#?Fc zj>v{??#}p@F`@Ryd7`JMW8klVDZ_W<{*7NZ`Dc2`;Tw>C4xQ>Z%p`UD#tn>3p0nxV zr9aXz(V%Ae`X4Ma_*GdXTa5XZOUeq|&DT(|v`NrZOW8a%&1HrK1=-tbw%v)}_OVs# z-r}(a5d&2FqA z@4TYy@LD#PcyBL!L(v7YcQGP0GcokuVOkHJ>z|K=)V@S#ypgFETtQ2j`&f&pwM1~* zUxl6I`_t-s@c;A4O-^7Q9xK&4ge#p;D@yGQ~jrgp0OV{i=vdrYHm3G}zF*!Tdh zU$LPumw#FmFb|@9_RWoVg!NC=K!oLHlTP~-ITWHX!VL+MgA7VfE$;fp;zg?>IN!_$p@C0?h6|6CahU8+L73(t{>=;Qe9?*!rJlhr{bDEol8(hn_ zZD1C5dp9O6I$9jWn4{b`-q4V&>}T(dGrYyf zi`!c$Kx@KAjKbJG4?$9)K`yjLGmp>-${>0GqB z;D?;PlV|n&&pVZU*+ck_U#IWgXu{z;mxR|sk+l808KUISUTDlC{txMC^gCw}+KC<( zF(dWA(V+LtJgaM5Hv9Q22Dcj^j<;xaWEBgITcCHT&p%r9LuRB#;Mmi>e#<$)W9CBnQ1RYqp8|6Za%j8`5iX3 z9y%y>Jwx}q*2GgWY*&!P)P$2mkD_lSvIj=!t{-nk7}D+e^x!3lW$^yzltDh3kMc8S z74shjK%p#O2RgK@OzR`rn$p-RhE?5zxJK4Jr zMwlMwy2xK6#?(?Fg!VzZZeytm8(I3{-I)l+If8%ccfvS|2j0l#QMX9g#D072zw~q9=xtv&|WxQe0V`aRtswl7$C>RvDEcuYn!bmx?2`J2Q&SjN_XmZ?49>&|MXLSq)_1zt%(_xfGx z)uW1CsuI}RLEQi1;JiknZB)X-=U#HytYbuFw0m;|MrFUUPn6Q5JD;3w;|m7acl%B3 z&~%X{o0T2BV;4Xe(7&b?Q{z%f2CF`pvq9bGxFMIu6#?J1*}W$R$G(wS6EMfv$I12T zl8Ni6qS!Us-<*|{GXxM7$?fH`5(pQ3QjiV=Z(h4wz|Qo(Fyu{gs!dP#w12O{Lqta+ zQ;HmWb?3!>42Qsz;J&5nz7KQFY=xnb3`>?@LUu4%(L&O|9Z@l?$M=XX_(m~vLf&9f zrGN^#;R}{r`;aZ!ln4DF@VCuI?C{NZ;%9i+*QCxtGJxreLke!$&ku!?vt0k~TCqtM zt-JRz$&BB3v%ix{2%5^{P|Xt^R3lRH_ccQE4f1-X3Th=;A5@OSfi>M1-!p3^LMPMg zpCodoZz3ejDWc;&O;_OaVe``+$)5K+X0+njI;bZqaSDlSE$R_U!wNyw@9{nAsor8( zCdlW8n+TH3!F4@*g)e4;&`3c8VvNKPZFO8SgGg?`-|T*O0hU&9>AgC9HEML-An){- z8E>sbY-rV+80Bx;DUB}$njUyt0f)wA(9&$T`Q7yQiDe0iP-WwL#$ONk3v(n2Zz$qA z9zdw@PO9;4Paj&@s2el6(0Qmnv5p5yl^3}+x2;+1^HRr>$_O$*9c=o^Dw3%5h@Z4tfJnTg|D!axXq50X?&bOr`J|nC2N7y0SyB)CR-dpL$&vjxLWX%-W zwB_;hd%u;{MTl8dd6AgG<+_=7!)#~Hygs9T?~Y#Kx$I(#*YdHFtpY_qTf{MWYwP-f zxRg|jtBsYk@@JA2bn=XU_g6&4QMS|du4W_`t_IOxeAhpn8dWgx%5L#5a&FSz5}DRp zp(dUn=}0!eAEnre1j3GWT6e1VW1-oym=4y8nWJi9`NG*7bbErZ#ogDbR+IiiC6SWi zD8A4j-bLZK*3)Ngyf%qngii{UljzMXVWB=GLLE(IYBMq>n4;Tim}|KoK`#}0P30YK zNag#~Z*mqq(Qr5wr(m9P;_z1ks&j?+JI$8poGC^+GWihcR|0l9xU5RH zsAkvv0^edvC7<+b%Tq4-n)@03Bv(iqnRKcM5SM8KBKMJh8V`og67qem>cjTO2@9;- z^uawx` zlDv}E#$cz7I`P0O92}`J)>XeZSsI2r))d2je+L3w?BE>C6wa1QsY3fiOMeoYXTf(3 zMCvQ@B+ek9q48m>GoA?F3*$dKrX63E()J{r2?%NC$(~$_B+TstbC%;<7shdz^9XUi zYkjUcJ^u~C98~w*59hg1*gVC9)atK=J8Q zDKL^I)hOFX{hq{^dA7ql;&j2a;ox?*w72ECcX1F6l+EYlLbpdEbHL)<*`%QMmu$wp z&5XbA9PYsoIn67A(?={Ows87~T0QA_+6CtIMFPi)xyZGW*g;8Dj)1@gCYJ;ns-tOp z7QCFEm@Lc;sRYBq*q;SMt@Dl9n*I{Y?w8G1WdpJo%pI;9B**w!8NqCI9d@A>9X!a@cokf6|4MnXvQ)~j`rbu#VT(3 zauh`!!`{dBoU}IN@?K#&fTm^Nyl3^z!o6p0?l<{L1Ag%-tiA_C|K{c@9m=SQa#Yrk znPBBR=lLzx3f{P3t{@D&u({BI2ar9t7-cSR zzQTX|`9ylYUHSrjbWm<;QN+<|7c2_`(O5^`uQ7gZ>X8^p_2ri0u!aZFQ8ZlUs+ z)2~|9E;t~2cn`t$Lg;&r31QREF76_u-KrRLa;VtC9h8o9LOekPG$;A1&S^OF`iiU?3vW4>&FCSlqCdof7JW{u#1rII3xG^1BG_ z?1al}ESsn4(Mn^BKWYih&mB5X(D4Teb1tRl`z;6Qp|Sq`x>~i@&FXx#RpSqo$ES;8 z0H}!;)uYnh3AXW?(O4CIJ`E(YaWte*GhzBUOYSXfo3bv26>r<KFfC^iBU}Q2n5C zeA1*NGO4Q1$JdABdfSnlICM{66&=4MhP9q2lM!!}&jC1>`}e0md(iVN{9Yu~A@8(4 zUgM)|7Z9a;(C|31cRIW}3^(nMG=Y%Ln%12+kbekBKhjv}Xxw|J#;e5U|0j{kxXPR?j)ZD{fV##hKW5N+9lkalJw!Q&6k_-z5c_;5Q* zi6>`$?z6kG(r(VcC6YeGFymJxg}4TZ*W++UV0i^RJ-}M~MgX|>E6^J@=K4pTtayMp zJlO}BtBt!-SV<6auFhLFSAEA@7%GiDLg!rg7TjXj-B{URFt793J8U^o_rWC~?hPD<3KGqZCIOWbV1-u`?^wZp(#|#%30I0$fz(lxA(_f5AmDB2t*<-oFDLrOvanaI^Dw zs+pBLZ-(J8I!e!j)yG>lFqTLV2ZBlcv}0;>2I=$?4ROCTU3(%!klb6Qx8E~!EiQtt z{Oa_4Swt#r*QkfhOLeBqgf_!hX}m+5%v$U{tYZ>Z2)b<7w-u4|-HLoSv+c^Pe7TF+ z#w7B4>u|Lvk=%c2OkTw2e`!qp3t+eeT^y>92P~I@r2^*+;~_Koz-|s${+F@0AscL& zxC!W3C;t}pOC~e42Ii%2hA<|N=}OatlGM-PZ=sSHmS6aZHM=K`{1({%!d!B--~P*7 zx`hBx0~UOni;gGHy#0r3_%;;yJAU^KowN8$_q@SJ>9Ki7`19M);o{%&W8py zWxCq=@(EF|z_<3(a$Iw|iLPd_OdR`aMmWLIZDh?37Hz>y#|$rx`jis{3NQQW0yo)P z?7@nNWdJP#<#ix)W-|2<9N6B6Ufp@@ARM>p3$o#K&ZR^$RQlwLJS$nu=$R+OM+!)= zn6~}iavR~f^ZZc(AdKRYNEIK(KZpNe>;WE?C~P~*wDc1X=kxKhEAb!xf|m09wT`1B zC_wVgf9JET)O)>1qVM+QsDd6!58c+;!gL(VSj(l;LEQDfAW5&Qg7$MmlpdPWIy|0a z!ibMjE1-S;tH6`XS~{&{M_F5qPiT5>f-wc~nI4mY^soDQC_UZ7)z_H_r>dSM{cI)Z@lg>^^e;?dXOXo9xhMc7;3H)g0qhZb=huF zWV=2$#oUtb!ORg5Zijj=kaV95d(K+F`8XkkLbMzSp;#Lv_r z3oN*xkw@uYE?8hG3)P^xDO$l|9A5ow`Z+<8H2fB=`~TQ)?4a70Zd_VWaWP~;1GDOj z^s4g(y+Q9EVWiTqxQjn)Y@9J&MrE61f-aCEJRe(gVU3C)r?y0%H!s~DqqU$CPDq(@ zZ>5f$u5aM~PBR)}?9;@5Y5_Jp-F|Wc;GpYruSl7AJqTxnasgv&){T$Pk&XE=R?dyJ z*1b9@2ndPmJ7kW>m5K$fk%Gv%H)Z|DQ2m0MTuSGs8~>&m@$5f2#$bz^F6p$o%9;>t zuR&Sx1cm#m2ta$6|1x_|b81XrO%2R_=5vM3KREsq$B1DqafqkovW#I<5^c;@A9Y>M zn{3R(pd-BjhW;+~P~J`CeYK>Dmri=;63X zY~&VT9AV71xuocR(rtfCg6cP)M|8)HO#8ok+oIZSei3v|wynG&2AAjz!KiuzA)#la z%r*y$SrU*Sz}AbjGG$cmEO8##L5lJ_FW;EXRTZl2g+MWnUFQ>nQ}1DfhaOOXjF@Ar z7glsSSOhLvSf1&<;>Qj7$qQU_fU=qW3)RUS zpCOXz=jPc|>4xnTn8)g}JyJ9@exsj3uJtri zugb5%-pclW00~VNDB!h{m`OBNQrfT0@_#Ntuv(h(msgUYb~JP^o|6M%mrFB9!hF=6 zMISj+8HSc)yzzysm9eWN2CNmra1$52_$gB`Qa8c+=od03@rN#i6$nxuGkA)*f8usn z@S?^!t2xs*=Kc-ax!!a%e^XNE;9s;INGPv3+v_gIzdRs77Am3loQpVbN?vRZ40Qhj z2HnH^&MmkS{)8;eWJg4qd3XMcI`k+)>3q40!+Yqhf1-u*bOZ0W(em@0{RbJq{hRa$ zNno#EXhu@~-*G})=b}pX>DRizcM7E6iB`bV>4m*SL$pS;kVu} zZ+u`lL+904-LjDOCgYz=-P1+=+EmxBFar9bkFsGV-_!p9{BTx`IxuWs(d3Z(*&Q*1 z(|)F_efvv0=Dx#YMxEC4!gsRI|A4mBdgzU^EM(u(z8P4_+`6AwyvR)AxNw2-I;jHt zF0!E0us6SL-&pPixlVd2HyBF4D;6J>yrzFP{1lzz{>J2v>AE<{ zDvj*)m5d1rm`G%Hr zwI@R2Zn4Iz{n0XY7le`o6{Oy$&DOyri_IS+r2v^K#o;kId|vKnG&>WeM-lqyHe!gH znx8!L$z^hw)$2%a&f0Jd?;ORR+m^8Ci$=HMlKvHj9br}beec+kKd&4|24EO;7XFYu z%&;$<>BlfkIY$wCsP-3PGhw#hRR4+g$qCJlZ}KDAKyx;R?sBINv!xT*`$Ymvs#IfgaTo~O+n&kXP5v4Ppv+@$ny)|4gb zsw`f{z{R!d-5)kCv3^`fB8FN%Iw#Ip^sLE(d4z=WPhqN4<+ZfsWjF`QC81z-RX~OP zrLA3YzBFnGxsH4Z8);bLNEVR&T=mPP3P#ZL^o0!;o62H;;V>p47{>hOV$^tKziwNRn7}`PV+^kqB4_UU#bLKmKvC1M6+{Pl0rvpv;n>G%< zA6#(-p4aaQ_Cjf0f{r+@`?=Oh+RFnP4uv@0;D5&H$lJmunw^n9tHT5di>TNO|FN<9 z)LVILXh}C8UHyNc-Ha}{_jC2B1E`0=##08^%2wE0vCn1fQOccf%w*q>pUV~ujdzyE zQ@J!g0w2Mk_9K>U$jMw0$eg)>-ZEb~UHvC$ERe$o(qu^b@dm$9X3_)*!oIl879sX+ zoZF2rg0o=p{l|E;+z%*Qk%=)o3iaA)fxuyor3yM4$`7c+jXk{H>U^7(L1WlbDwFf@k@_Oh!Pb0@YN zy1u!0(`+Lu<4f<@^kjO8@{O4hW_&TOq|BG=n{x0O_}D=Z*`+U=%TxC9P#+X`k8#J} z(B)gqGr&1y3>nABj?!NalB+SjLg%6Np(GWkr!O~h?Otngcfq}0Ka*zD`x>ZAyS^%o zdMY#x);9nrMy`1;y+nlytZ;%iusz~<_IE7vm~#obIM%P{>ZG)L)Tfcl9m#CiY~Ie~ zE;uy<6!HS7uwW5NWoBXup1lq!1{CAr7QkqK zS;qTXFMK7V8EN3~^N&x$b+{Gv+nd=yVx~&9g;~o!5gdxXgR!}2W?w(DiKLQ7#qK>b z{L=y5646I>;`X>)0|g&9+y#xQ7XQ*hD9-sM5-n3AjWz0#JV~p*GCB|VW?UM3k{KgpV@dVNsq#N? zGE(u<-@Lv9^|eu?#qnOw6=<&mu~e&(x#-43kOY)*U)NfhMzHoA9Lm^d4%w^AgLcKB zTB{Z#384Wy87F2?Q#Xjr`Oaw$r*Lzu5AYj}_kNi5lxAy27hJn~P!$?wUkMGQ+O{iTb89n97COpV5L_hH<;feu?to4W{1%Kb;Yp z%z+HnQo?Yz^Y`T|vV@H#S94=LQSzKN^sZXcH8Jcss}yY+g=;>5c(~RlU88N~5jpu? z?|(f@Q(o#P?Txm;aRDEjW&hjHxK47J6Ly0vzww#L@1FZNLPp-HYg#cD#P$`A7u*p` zGIX|F-*QEYh!74^7_OG87Im2yIP`P;)vqtf{P5ecTaF7BuPPtU(4yB)1ZIRQIxl9; z1}@iG%7(67GdM_=|1fngnvgf8`K@4)DP;xoIihOn_i)oUKMvAgjt;}|H@6ON$8i7A zDoX{KmMf#I-rH|9qwVRux3}Ac?nKvdu$=LWDjEdu8C`e7(LLSxSs<(R3uJLd4(OnC zSYQFE*b=p^PWDv7wqVFNL(3?Q;f#8c)+f=XeIMicQ7Faq>rRjyk5qJU;1|a-HJueG zD<`w!|IF#$W>0SAz*@hR>@&o9+zbxKjQX zYwsP^MEJLFsvsy;q;~}&AWeEg6{U)VCPk`(f+!_~-jNpRC`}-MG?5}m4_yeoBOO8s zEz|(g31!Fc`~J$Fv%6>aoc)VQ=7dZpnP)!jzHS)!@XgN|+4sP;qdngCi&z*(&GOOO z8rEE0GV=0<7@Xs^>DZ<0jdSSeIt9zUi90~Qe1@ImvCmoeH8DXAb!G?HJdv#<_|XF* zNR|u>Cf#3ON8N&C>xsa2HS8Bq2FH`SsHa#26P`is7@eJdws->W8FDXYn7(IK=vXad z-ou>eLjSGglBiPUkF?!cKg&r^97ECk?T^9QRMsuCzphayhOkUDjQ zm1A+FRu|T3tH73$H0QI{_>nrIoy@aF|G$q%k5N9j>oJgo$>cuQ@Zk5mewTYZEObL5 zm~b1qOZ>__5ifs($CSu*h#b3F z5Iu5=$&sJoUt}kV;(mPT%jNJtAtKj-2`Yy6vwk*iHcKY&nc>#0ZPAHA3|$r@LO_ z?t+P-Ur2$bhNZ4rkH(*CjI0ssr5Vv74m;1*b-d( zCppnYf~^3;&w9@YMeGoMBgSnlWUj6YNcNns`2&?pMqZsnf)H-`TXmrhqc~8V*v?j1 z{t=Ogoc=`@h1C0Ic*nTw_G~*7-sd0vgnIeS&JQZI(o2H~G7tlov-Z0CGFeZd9vEo_ zQ;ZGm%DG8$3>EDM#4C}}3yq5v7PkX{WyHsT*p=bOSUZ%SCi;eF>^kf>Kx_<)U<Qa_OY-u<`0_eEX|$b$VVY+yC>^sdn4mPUZG0=e`je$2GKL5r z<37kWZ5wCP!N(J=*O@+of#fEzkPVn+QK^l$|_iLS_5+Qm@y$-tVWd zKOy~S7R-z{*L1n4WowiV=}GmWa^>5Z`wu??Sdmo0gC)NvmELdJZE<1+uM3KMzTH=! zs=qQuD>2N`7Swc@mM%VXW)$*bxi^>& zTS-5r1+ycaEv{w~@|6j-|{BIbM|Fs#qhV?JBgE={u>uY7UH0EjQe2L`1 zGxkuiknor@7*a(B%jEXmH8$t@#8zb>o}8gAsN{5eT^jA{ax?i`{)5#3<9h%muISMN zNhnjKvn3NQd9~VnZGkwMl79*4cejR{-vWktY@f!CXu4owi|idG{##u4gX_hO{sKdX z!U^{jc-?f}O>=dKt1@GUJKERLs3s z6dV`b5H4M$D92(7R*$9mgG}6 z){Vl_m_%(6*Z<rR$f%Q^u3_k|q56io1zvzZ*|c60t{v_~@V z$~d)#J8g?B$wlv9<3mpoBgSxn{2Bt}5I}E9w~N>F$E|{5p!H$&Jt|_TtcJaoiyAd0 zHSBMz)4bksb+AGNU^%|}t2HAzQwy`2W(0q0_TD{}t%-bu;%rCH7yk%N-pNa8n-rD_ zBdTc#0v;47&&BuxY~-1xsBUq_7yl#cQ!8bn4=W~USCk3hJP1_gc zw=6D^9oFF6kT=%D-v4<5sxa1WuU180IZwYTD2B?6AUT!>2;Y+;8+mWTkLsWBY=(^R zUIUKM=*JuR0;d`2P0W(Hx@_5CNV z&F6V!@Xu4_@9!X>^xJOMQm9^Xp!{7l5=!Lv?!D&&9&>%s{5Xn0aeK}o5t+o7gQsC5 z6$rvldsjsOFx(};0+NC!efdZ`a3YTrOc>^SKx8S51WQQTpVl9ax(;q(=g{5pUNh?t zxP%w|So-OqOo*w45)vMU?tRU&ka*q?z|7c>D3_Z6*y4XdF3w4(M*|r^)gAFhqRdnc zAA@pycyQLnEAleAX#2na#?1>V+1t{x4=6M8klb zWEVCcT`+ASKLalCCoWx7BMUZ+bVI&NgK2wq0=7s6J(?@V1L1X_jxJw+SjG_Ld!qKS zPS6XcE%X~m{>2l;3XSekn_t!R`w2VCH28Bn|5D0wW3!FByrELab~jrdHV^(=}4G=9SoMy>KC>f5tmX*=k+Xz#Fm15EptTT z3+<9_#Dl6T6(fH|i@!{d zSDbmFn!)w0c00?Vh)WgzEcf;iEZ^5tRzb?V5vT}#qrkg82vLx2vBBEBLf#9OmBZBY zhDEUeeC%Mr-e-@C{pB3;p|Y{06j=bF14+!l_74MXa6Xr6DQELuLzGVvTZIa#a}o zebF`UxruE`jK9=n212U_Nq;&}hUu*(EJdIMfR`9v{0s1ZA@>G2idS-tE2VXJ5<#}0 zB)DEPGX-hIgcktM&;;+XO%;JVV4%GxDR;fWqIRwB`fV#Ad(W*U@=GEgWq1`LV9>ri zYhfEWAZHhic^LYSSyrdUfyYt1FR21!8V_uZKZUehM6R@QgS)v`&e)bLr`w-RA>*45 zVI4#@s9310K~D)b3Yavr3HA{bPt~t6$cqzO0_PxnFrsPJbinH?BNeHt;jKEpu#t5gWWOxxk<%XT!KADG zNQ9gNAMuV4=ggwV`|{m15eTA1Ozk1bafjlc2awu`kO}ESKENm?PHaE$14GYg1T&Q~ zU&;BZNS)b~B3U~{tKA+fvlOVX0u?sv|B0f|26J!x2S)MZ|As}OJ^tS;3TDuU_p)%M zZo~gGhvM^l%Z>tSEqZP+E(#aI$jVGLnpGeweOZ(H<~E2GB6=;g@fur}F3@We7R7Wg zSd7;u#xn*yO39=o4Q+Z3oCV5`V8+K1Y|1I+1H3rrfs_#FtwZ#s`P+0&u(RT>f30gc zwU$2j^8W*a!fxqO0sO!5C#HZ|Zc$F7+p5lg1~P+zYt6Cb z&Awzce6e~`K?@Boj}jVQ3;{T6`I%((KQ7|L9;X4FMg5n* zdhrz@Vz~ZU&jo7%W z6e96ZpI!zs@>HKaKXt2K%K#{2R@~oMr1V6k)oPw;|2BdCef8ac|DC(su$VQZcK!`1 z#}-tbcpDdud_xFC$Yy8!*x$UXM5yg~Nix>1wgi!rt2xX#VuA_+isFyvj0F`~PiVE@ z?*;!p5q4pThWlal(+ZE4y#=*%T28QXk2%^BnK0V3GU)&pqv@?b#T@$Dv-QZ&e1#u= z;@odMgM!6JU1awjVC4jWGoy5wB5qsmZCTeAoI;^#?B(`m4GyR|8Kdane7qz)Qi}Cb zus_$-nK2IjdnSPB7jS_JZD~AWYy5B>#M^N9y(WdG;rGpr<&f)P4XWM0DtDW<#unOK zmL73z$=mK5ncoCb2LMAg)Hrqi*+`EO*L~h33=3Csd(*sb5v#(@u))QkA(rxyvAVL= zlm)P{46?E`0=j5yMU$(s4Q=08rVF2>vpcWXeey0JJi9)7Ka4O|=i;Ro|Xl!7SmHM;i;dfFDe( z?zUAZ?O+TgehcfkZ)8bj`;IYrw4En;F+_(!J2dgm;X-af4X5iK2H7L$cVx3 zWHwJ8TOyv{<;tK#l7Nt#d&)2?s(Xj0sYa@@_w7fcd2Mh3KK{rM$)dDGgih*-$t)kp# zWU%u;WJF?V{Z7+NgFx&*2*3!UK8$&XS)pcb@Ea+-+ed2O0Ng%ABCw<^T za1J4Qpf&X{|7^wqf&gF-MfL7`H>zR}*y6?5k!M~8V9`%)-xs`?4C46SqNh_;U*dTu5H5f^;Qh;5v64jOZtib){e!nmeCnCy)X<1|e~Ag7 z!pQxdTE>Ced0+L7#vabT@PO`p_mW5n4)vax72?iQa$Gkm#2ljJNR6yB&#itxUO^39 zxxX#5AukS`Q}s~j$o_zi9jF+sPUhh(wuF!AdA5I8%II;#d!iBEN&eA`^d zZ?TP>eHw?s(}gLTJ@}9DwW~)&hur+qNwjBJdVoeYAXx^;4FN%x8;xH|r9m}S^kRa4 z{8@SJymE$-ljOV!fEg>BA1%*;h$=n-%f5U72oKpoS05npqHJUBCq6N&6lOm-rKbUa zDNvDo3dnHOS|?h(0LNmG^gh9znW!OHCesw zXG{BI00?wS-0@wk!>F7aGCcTsY1*;jQ|R4;35$PHJ*-3GHg{JP4lq{|W!q5u<=1x_ z41pxz-KO1Q)7RIT90frGpMip+72%dxF!+8AA^Geb^Aei3_$s3X=?s{8b$SBTZP^l2 zm^B=m7yNmV-14N=@rE1!bH~N@4C=AXAq@eup;$&8lJ3i@sQs!^zwIZ%goqMK6+^m6 zW8IUG3R(d&#cqHD^}Kk*W7f^+l8SDQ-m4S#`cCEYMFKf{nO0=-;tMm4nKJ5urxgBd z!nGvuCs%oz$pz+ZA7g|$OO%jh=F1<8`n5}x7eV!`9#wfupyQQ$GPv)SPc?eDs72 zbPW+q;xB$)pSxp*PC2(RbZpv?kzM_WqH1nAdo*AYx>JuH3K9)6?`igb_8pF zR>b-RVIY03$&tK|Q(;V8B1anQ-qDsnS31c^eA#kZ2bfo7wOkN`JmF}7dbVlqF|v{R zlWg!7I4gxSWW8hkNh*Qez} zI9{ulauooA7%(2UbRQBOa&Tyh8)eNot~}UD2KqCXTGQ=NXieY6BO|p(TC=i|rZ9%_@NLC0lDl&-t3<$}39~4QApsVl z?pNPxO%CT_{>$8)-9X=X0wVLO= z=bO!)n&4sgdv6|`iNU6Qi(JU_qp-O@%eNyNt6^fvTXU;VGkok{eE_%66SV9YYtI$H zoOMTcE-b#Lg_=9LM&s;bi#nWJ4O3wdw@;aDm>zD|{2cc(XjifXEH1bm)d44nCC@)&FP^ym$77aiP;rU)M=`qhWDFTLgV=80`|d zL+Tk)n)JY)kDUPCV@bA8B^xlVNf1wHZ$H{$q*7;;W3{hX*E@PX4D;-GeB{lUO zh*zIym~gfdLv%6rU@uGh4T=Xx{GsVCWsZ@+R~fnwSV`0$*#EF^j;=^T`_bk@1VQ%H z)FdAu7$cWOjIQNa7j=CEt=EO9WA@HH0&KZb&Tp=ZzxvZnk<6!-P)<|GXHrWz3VozM zFn)*}X22#;RljriF&fW_MvjVnZ+eEik_!@_USx-(lB-c)XiHBwwe%hQvVvo7L*3$p ztT;1z7vo&ElB8Zt=qB$k+bz9cFPa-6XcgmfooS&o#nSU*wGrEvS9b;g6Yu?}RL4gY z0ru=eCF$+S5XtGPij(?&J8n#wU18M~zVYsvkiD|H*Jpu?Y!A;19hnW}+79QOT(0!X z;n>NuanW989IWOGdN$_mMUGG=_=5|oDP}6T_R;q^&X{r9kDAd>1t2v1eGrUOtJjOe zNXU|cfLN!8{X2SFHfgMF_bO}?($3(Vxq^eqgM3xXOY@rp($V~8@yPP(Jo%Nm7PbL+ zw`j+d>>sw0rVRB?1?XC*_aZ(1bFFCyF`r|qcM1$koIC9t2zVx~x8U@rm(>|2SYpC> zb1#}trQeT?uE7wG&$a2dr|%xk_l2JBY}q+XB%PGDtS|0J*fxIuJ%3|hp3ry&@<0U~ zRhZOeF{d+$tYX1&gejFh*_mDCZ=Bkc?X~mmR8S157{8LDSnjpS-{JG2e0I*LB_x$3 z!*l0s%jNJJT7l40{1lpLIrrne=W%|7cM{cWun3_qX!Ze9fjhdT{5sgSTo43f+4i?? z)m!U&e|YJe$k*{XkFNju@u6gb?iNzQu@xKB#b}G6JIQ<82sHFXEa%8ssj*pLURI$| z$%zlw3PSa%Cdlp5PBQR0qk=qdqdN$kyCr)t_@6huWY4quHOTn{$MK$G&|4EOvcAxA z6_dv;4AFjqt09ihjms87(d;-~&F*9auCYj0OW|8Xmqo0oEM}+hV)5ZW2@MNF znA;YvP1R}(hO1GZ1jISjE>CLY*q-|t)MdEYWBa7F+PTyxRs!S`kV0Kn8At*>q3g<< zX{pUGic)_HJGa4j?DCf_hVZa9b7pctgIc4y4=V*L7aE^P^ZO+yrIqLfmeTHL$6xMX zVov9$=-6B5g$G>IoBC=g{h(2hFU=QYMmzCnKY`tE`bgsjXpiWTY;Qmj=>angWi5zC zB6O?GTbKzd#SU+&q+yOVFq&7w zTG@}-u?;Q1$lUXR#m;(C9k(MZ1HT{?B~8uRZVTt8cQJmT-pCp5n6{-nvc2#^7s z`4HO-1$TkiF2sIV(SinMx8Ex1gCU(So;$xs)XO>^89X8Zdx>&#VS?jZ8|^Jp5G0_1 zEM-*AJi_nO=zAzj4mrX{xay0z3raS^2>u=rX6}MI$)L!31ReG=P~rF&LR==vF>}O} zW0vH)Dfkejap9LxB=P7gHrIKiqFn>(jGC|afCvXDo@1SQaC>K^;#Y&47jD5_nto=| zL)c<=vGm#)FX-4&FH$w%&UWRp1nxhmc5?ksBOMlRwO|pxd0QDJebx>%NGXByq!@yh zKa9*vcv7L)g3a|8m4WO-%=8^9^pu=8oJYtPUKfz0CXz8iEVM)X%fuYXT($1oG#dp% zq;E)^QF(N546MNdgsG09!9Z8fj*4-dcEda7RT!X-<;R}ZY8d$+aW?~S1^ zXR@z;^kZ*Df<>Ea>sJnyKTxTC&5yVS8ekp28;ZW@9s%J6Ip6Qgv>^Z(AX zvXi!y<+9^_z&Yr2Ugcw}2REA3@>ebhd;5(>BAGk;mR%KsHJaLf!zA7bO*%*K`8MG} zwt?|(mk!G>)Z)e2i@>5~+b&@rj;;VnJ9e(#Xj!#XWkZ)7ciH!OVjR3=MLDe7g2lhS z3DSP%>iUA!2RP(7pBPehcU0^v0T78Ui>t+N?3|;+@KWEvQp)^$E6_MQwM-1<;iI1J zYQABY_cvUxfjCSSs#K!hdVan3rrGa42tqZtVuZDS;oMPsJxM$!t;P8_wFdk`03ymC zCiEVZpFb~u-@D6S5G3^dHvEfa_f$-b zNpE<~*9YDuXS=pEwyvlgONxT(jmggNCVmLUuTv>}8|k?lqwtlDv|aMU>kL{y5{|f` zqCtJLAZIA@DR`!oe~jTcQrCSANp=P-G(MySMl3OTD!@wK@hv=g5A$AdsSULb#@Irx z7DcWWeKS|L-c#B%&3O5`V>(&xcjs3<{W0-DyTbiM3>Sb#db6V72*}SC=I?JX{l;Op8~dnyCA*3Xl9pK1m|& zBUjLw++b1a7^TS=^eo(F-WH;Len;zweE-I^j|Rw#8amn|c#n4l43!_Brq^?;*yPNS zob-N7aDAL?Awz-f*fIDYZywovA=`9uo<(g=lI0_Jhn`4F6t)^{!iHLWOl+RP;f7%( zU7vq405-nTf`u*hB2zGA1At!xb^1T|(Tj6LzzL#dns7|EV&DYEAZQXNAO-qa(W2Nk zmh=RPp@lw%4?Fj5O?b=MsX+dWQWJ3rV&MEn|950SrzuEQaCHiR#5_*ff)dMfHk6X2 z>oafvi;ZSK3n>hau(G#=BN!6&R>@*`lu-n-PH+)DF&ti~-YB7TG_#HEW5+)vyB9Gr z9ooF7$k9WF>GXWOD3iqCVs$-qLTfJ-c6fi93yLqAWSG5WGwTTgaioT$8)rrExaU;I z^)2nw?!cmxWBHu_?Rhn%+8N%wrWJQl4Os=-l^wAi>9R@#4?4g!_D`s}x)l_5m2VW% zlQ}>q=a)dS-5<#n%$^qhEG#kPJ3$V2haVXI-35)7;*|Zp3HQWaaQ;r2JKx&|WFfMc z(!mMpI6aaWp2L|h3wNO=eVvto=dif44E;gu$@L<`B)`dijf-q$xGJLl3-j{%rid^0 zd@nZO{5-4IOfIw8a&@bmB+knh7V;i)8IDcQ- zxr@7?o>dG$U+q%jED2+l`bi>8^+ukS$-6d8XYDP75kzOoF1|MoeIb@~|K`odRxyG( zCRqzER_tL-8!6AoQF)wyKLc?9o;@|~kN1`fmG~+c?2=*oC$*94W(*z zY;-7#p?%4;n4#EDAwYoCQ+aIt*wA`#9C%6dm%25YgSYEZ26%5i9IzZyRJ{5la`ERB z;lE32XLZogIS&pvkM5n9o&yJ59S10~pPYB(#caL|Yi?G0>$@PH{Nd%=Gq@nFS1WFZ zbfWWy(emJ7@uKfi^p0Y{K@O*Uz`R=X&Ur_u_=ZfNcse>Z)a9h(6g_`}-LLWOtr5gM zxWIa2Pfl1jqk-0y=kLFSFD2Y(zk^ zRHFjl4w|LB4+A?3I{RD8=oC-a#)y(=aeGv(Cwgs4c9HVwjoy#JWnI4yTR*glXq5mg zz%S@@cKm%ry&Wnd9%(Gf#dA@@4fZOtu~dV8nSs>u#>;zA9qYmALGtHbcnId_vOhFp zG#K5usB_cM`7f%Q^`u(Q;kt0XQY7uEcV}y zMZeMPV60IZozTL7_5Dmb1}Xk7Q=B^y#)hXxe=itQhZYr32^7q9u|cKcs}KLP_kqH2 z(cXrT%Fq0gk@tm9HQ$>Ga$}g?(lr<^Fr`UeSaz-3LJw_>=h=RrQqJ#E zw($2kQI5zAA#rXTGBjP9Wi*(v*?SN5ooyMEe8BTAh#NCgJvp9$ zjt3U?#*DSrk>#hFf4o~YbRpTcNwf;w4P%y?{NmZR3ABgyku}SNZ-?JUy7=KkxMfnY zuS>`JFJx4xHjqQ}t|(2a<2o{G`Pvtmjt8>diDn)T)nIVt2yl{pS{3r|LrtHdm*{X8 zPnTdN+(U(xpVpipl?|27>(nxUZ^_lkd1UiRWQtjg1M-x(md$ngEADxkLglroAUN)D}Ty-e@O)hMiTkhV1vMXgX2=0Jdi4uuG^IcXivBf zxU}+vs*R5fSgPurp@N0AmiC7RERyMd1NI{?()GSarkbV4>w(&|^dYV0B{+oyaivDH;SW}0*)7N6-;EycHwwY~oW~z8@$xQt+}A4& z_XFNdNAyGr@}lz)6lP%g|%~L zMEIiC)xb74jF<0zzjVbr`)a>e@}Lf3x#zFv5fdWQJ2NdVC>qn^#KHS9X`Y&8%-yw| z4R#OD+Ls(?F68xk7Wz5+nq!Iku@Al$8&{Nu;)^=w^e|M78Iy{RM;{@_z&%X<@lZ$~ zHm17W9>bP_b|5MRJwp&^Ud^k`Vw>pRL}L3}`lvl9x{k3;qV+7h_se#c=w}NyedSj+ ziGpGHiSk>K0)9C;`cuEh0$2J-(ogD(M-@I*S7MVGyCI!Z@lYy{2E)+wx<&?zm+X>u zemP6)%V_c)Y5x<}!GG+@Yg&fz(aMuwe@=KiL#K-Nmx_@*l{$)XZ%zzssTehFBx1qyMBjG-8=ePx=8JtOp1%TIHWn6tLdqiUMPdoI4W4 z00?rY1(0+j6n&{S%Y%L*w_w^d_-+QxsZTnRy(xoOUUt$EBsm)?Em9sq2qf#c23l>N zn4kuN0GjTXn~W2%4hUv@HbuJ0BZO|ciY(?89>zH@QDt8Ajkuekk#tNG2;;73+3@P= zFm^V)jc~(PT546#n4KA}*EFDGgUL^@R~Srp3XuNuBYXgp*(t1WOIS^d!il%LX!pxZ z^v!~5mJU9gT^qJ3#zn5xPZ79v0}Ju&tEaDIL4#O02=}Q_2r1`ywi!-iAdcKZ(3&1} z_LsMzztWxYnTc$bzV+i|v7VmR+k&ZC@?2P%Hkk|T=6Pb2CH%gk3pQ&xYh&bgtI{JJ zWQ|GBPFBAc&=4TCmM>buVuV)L#%h$7zUL+sTna}zAiqG3R8W~+I`&k@4jY6a&;+z2 zcEMhjY8<}tDcJBqzNHMQvJH;P<74Tp2s_b0TGQ}V>HNj)zL9Uc5wiI-t@-qv(0oO} zrMfp)QgXQZ61uR-ggm!3grcdFYjY*B{UaGnQ49~cWxZu;pwZ}hRSKTCD;W4^lG9n``(wTzyt}z~q#ikuOAQfzK53L-0UhFY}7_uy$rTlyc&p63|x}d%vJbG^; z)~N&(G7OEOEYj^*fAts6i^`QkYAD5f`BR1jrj}|g{hB8~LDe!C&^L#@$+9T@p5J95 zw>*|-ZpNIsO|cCqJnn7URue_IF!g+KV6xQS!U6C(0aRxfkQ^}1p;Ll*S65Gf99uzd zTtW2_`eiIE6Mf4T3(Ew@a+n~0#eS8pw~nlLequ>KUM+H9v(y==U&b!(Xz~j!pPRr8 zM>&z6Dj+2|)B?}inXvv_D2-~qrdSU(B+};_9EG@b%susY)3er-kH z;>)9X`6!o-{08SC{%N|KRAp{!3b&T^8{%RlmH!_%Ew?};+EZ+&CK&^ zPy2HD^zwp$D?LpugVexsozc#V!r<*z2chNA#qoO-R?7W^Jw&884`-1VNaF@b?|BVzsS68|*6(y3soHp#`s0*ql zO`I$x`(8Gq!Sf%|+I(*!Zp6f7*U*u&k-pu(8~Xg=Jwg{3hE!+GMF(JSg`v~AG5PFx z?(An_gu-YVe9&iJrB$atSPS9tm?c^S0ZrPC9WWm3zQ`_b56b47q<{++94e2R>wFE$ zZi+1tI&wYQp#R1yXO8gEwk=h-H-J?QdhabGduT^B@l4llX!vE({0gjeE$Y$X7A!eI zY!SA@FZ%A2zQGR>U(OUEsRYliw*Bf>=8+rTtn;+v&Z-C>5Bajpcy@d|4PIPlahY)I zf@>~gY@#CiepW~%3SV@KbD9OeiD#{l0W;MBHEwHI)PY+G@IraJc{(CN?; z`&5&)+cyi@ILXU6M!%t@>vX@qRs=DyoV0Z1Z74waBdT4#Cy1q!zvN59y+O!k{N;*$ z*^VvIp(V4ihNJ1yG z-QiEJaS1j4l%ebm2Wr>H0^ZZTR7@p6+h8htLs1=w9)!OA;{PtKWYKr~Vp4*hI+Us2yM2K0$712FHWC_^F!wZGvUK{ES7q5Qy2NPGKxfuuQ)Z|xUa zC#|u$j+gx!(BcIc;-}}|BCr>xFXtc6BNnzHBLFN$?0Anwm~FurGG*zTCm5AM8*?XP zDH3h2A-GCM;LA~+Z~>AMy`EPiFG_)euZGi7!>zRMVKqW>we(1oD#}p8QsN>z-keb08^~*H_(?(ffg?ic zT%=c>skf;cMW((iCR6_zvqG$&AGa7JzYhzG#Y#_AIhb1d$86lX3z9?>$zXiWIv^Fd zj&~n_KiZr=J3|g*{VxJL7+q57k6f}Xqo_$O3n??G7jm06#27ogo>O^bz7xrx@>P$v-;fhBbE zJ7@Sa=0R*zM*JUE$qU#A2oJ)i%{&|2qY$LoECV8*(m3+2+Q`}|{X(f`H0`D>H& zm{P6?;^p!fH+Dh<=ESK`Im`54Iz-bqhzf#!H3b8|2({LrG&cDr8U4_GXr?k zynjx(T36(G{fac-qB!q1{7&E1@?@)5IRvBi_7v3l;6Fu)*z)`amQAp=a)dGfiPZb` zS^vHamE+D|qa||e1@i5s_DG#hbvkXcfGP@&6+W(Xux|#eD{kTV^Y(sUm{AZLA}$oV znddv~C}o7$Lqwr0u6$R(KNhfxGUOSng7CDavujRDBo6D%6x+k}Lh7R*mP|T)G|WT4 zd>&Ud3lvBgKEw!p>5_pS?0fzgb3v6Z^vze_@-ukqPYu*fol+wjy8hM&0nm`LkNONB zQiKXO3$9SVF5Xe*W3Vw3d;9ySjQtg#wW5ct^CGKJ7gl{&>%W)mvs#&f->`~h)bLWJ zN*M4BXw^y#YIYF)dNra;FZw&&1>q`YH!^x1 zT*$=&EGMFkx?j_#Hw~X^_F>y3M?QNq_gg_H7#wC)kVBLl?x?g|9y9LOaRiaFxduwz z_5rl@j5{e1UbTKN*i)+Feitd2|C8~@U#`~l?5`@nbzepDf`LE{$QhfBKX?ikk$?+I z|2XkaHx;%rYuXzi#Hmw%MH4YNcQj08#8(Vq>0?|L**b0=n=~7*?UJz~uaAmkm)5bX z^IN+;hqu;p5(>eH&EF9ea3IB`P!&o``Xxq$yo(*+f7{2_Y;V%qBLVgznup5FmfPJH zSOUmsw>Cx5S1)X1Am8!1jj(2u7rt0eUA5-5A<7@=CA}6-b&sRM7T`P7MPTl({hL%QCdf zPcW~N#D&LU_wBA5R10Xrqu|*U%J1*OQO!AeAhzG(D#9Gb3pK#B#>MDq5n#{#PMr05 zSQB6fdvxA>(Hmfw_CkVZ6g+zyUTDCn8CL#4t;MU=N%GgFLZ{Um&|!6UaSlU+rS_0hO zF-Rmw{K!c|G%dt$Nq=rJ{IAJCr7?Pj;ZUQSY+xDI%sT)aKXtxx^D+&84621;z&FV3 zJ9Jl)rw{JVj>n~b57C9f1?7P%X5!5kfu;Oeof|S8g4r zeo03z!;)R=oJU4=EcMG1e?DL3M?1Q2=6p>XhLSFMN#1DqV^F_m?G@VM1Lse} zVTOv)fx>px0T#Y@tO4|+BaU37UqLDswe$RAGZ}oRuO@ngZIDbPZjvw z2WinQ7_kjK^XZa(+2TF1AMXLkc7&l9*r60k>*H=_S;Cl?@R<#t zH#sFBs7XNqTD^9@OX{@rl`v&s`0oRK1S;r1O3B;|tCfMzyZp_+Y<0O3IN%`DwHtMN zX?(30-PVeW!-W+959Rgs@Q1vnzMOsrdFFXwHB&xT>AYs@i4m1NFhWF`27fF7!7#eO zLwta`s~iL)F1R@A0v5@8PO@11%_Pg2tMhJ$n7_6AH(kwK0}mTcJ@1)p?&9IQKS!}_ zKyUY~{iACg1AQa0ey5ToHp|njqK59p(EGa^KT03!^)O{IOQgmLec{B%_;KPT_j_c1 zNVJ$xxcKHKIQwzZ(BGt0cQS=FPj7~IZ#((%tR4hKy5^PhZfvw)`FqA)|wypYaR#b zW|*gptUB54tT8<;Po$;6e_CrXCb7LKB*8W84TV;@^?vp~!!BG$va$0}7k=;?V}bUh zv2!X%xXgbx|9u-r&W8WAOq?mW8oNMedaw$6QF@v7n%lMsYp9f~5aVK_gIr_Wab)Fx z%K-nArg%S(V&!28!2Dqo{-xs03Q}NmJ-7wfYizYv1&POX_D@u^+8SmuS%(^t1VrMGn4)O*x!R^?Xvgf3%-i5c4 zMxKVoj|;!&TGkz;rv|B{n$p7*C9%w5ln3A*VxU}e@ z?iy?{70c!xOnEcoE;)iWpj!dIOG2DK!mg{rL?eNeu%tuO6Z58byr5AfCIX$E73_2OBP{bz&-q5_<@?i72O`^Q<06%4DL2Sp17uHv7z6#l`6d&HS3zQpj>;qW zCK8^bKW9IIr?i34zZ<&WsW*sq1YkHvacuYoyA8UBiyR<-qbS%!sX@P0Ts((zD}w;5 z0W=G(5tCORw)BepAyOt9u?cAY(cy%`KCHzl!a+r+)6by1-SSNWHq_T zB5kLqr>a)fd{3$a zMSE}0Is;X5^z2iWSqcyYk||3~3KDJAD42XhRTHc^wAk0tKMp~LbcVaA)8Hq7#F*=y zLqm#dds*e3Y)REhMzxg9V``Pe0uvr|{*o4r|2Q!epC0hN4v)z;%B({BJ;nyAw|0Xu znXP3Z`#&lv_}K2;e=ID6S(;&}t3EeI2daNsE_Pxo{~|6l{-oKMer}MT%0uv5Dh-~- z4{DC|Q?<r8>zq^IuM&pH#Q?b0TNV!TV@-P;vJhMJb3lo z)HK3j@1}!P#u4q0oS#|?npidkeks7%O!DmRW8pjpnt_2yqtMN%r+n^OS6Yr%gUUYa8&GD`IM&v1;M-#5RBL_i%HJ8<)Xt#fh;!sx|%MP2awaV zZRuQ;(tOqfa@aT8!BE*&znh?e*V7VJJFt25ZNx_N)$vv5Y1M=UIqiKYPfl#C?=m+I zFz{0Bns&hcAH2PJJd|~$38^%TL!Zjd$jlscl#Vt}o`?l#DG~u3BVoI_m zbmz@3#NE|m+GXu=K}0ICn~-QIDF3L3PV@ZOfak2F;=yv?aJxzhv}PfU zI1!s0No}G$(;`2yyE2rO7E-{bqcwiyw6Ws` z=$>9!K$WE}%pVFbk1OrCirkP>J$;Hp2dV z-`2qc&WP`ZCNK))9=rwSN5xq;1sxf^=ti;JRTwU(_X4GJkJZw`_oINBKTKtDcK)^r83%HkYyTS*wruZ zdFT&vCKPc_UCN&Ex8C~?)-ymI*y+w)ZM*^Kkn2p_4uHE?$8coeoI=dh*<_O{=KyB` z--s-i7LT40b6zXE0l7b^+oK!$7K*LZ611WBU=ECc@aqH`zUXbUpivB24`VJ((U-BM$8Kzs{kN3k_^U4j;+vCcjK`3ebsuYa~kz@k$5zA(cu z`!c$VF(BJ$QWyiP6}Ky!m%gN7BMrGHKJTP(;^?U~$Kwk4vQGH~@G6#FG4UE^Uq#xV z6s@x0A>&%EN22mJ{l(kVjN}7>V@w^}Fj$tTHR2Ca3#{#A#mH zAtiqd>@l+gFEuC)5+X2IugSEX4TyWla-N;RKn~pZ&Aa{==pm+*V-k-WOeS zML5%!ix|STCxbH@&?d@?w}~IJ+Ui@WG*JjaDcaoJldlE#Pnr2EN`!W^OS*^To|0Lt zdl6ICu*b}N*Mw>N+BH}PACvM;9#dCqU{ICGjDpU-{pN_A5DjyTyf)a?v-0*E5{6=) z%n#b(XrV5jfcouKNpfhNv6xS0#RXQ4jOY*GY|r*y3$eTo+jd0|Z9`^S_D zt505wlVQ4tt%ZMDcZF-#ggdueT2f~{piS~_>HaH!`Ybp5W_5!1dhE~PCZkxEeVn^4 z>K0Rd?%W))7Ot;)4o3vF1_W07g=y>GYx?o@<@$A~TIXvbkCTF}z$J}QL80!Mb_o53 z9QtjvZhqHqI4XL>TDvdjuUyVU$0^*7`PWYOUBQ*iU=jKhKsPxnsMQb-=!?SR*j=Vz zIRG@;2awwqE{HpObx!({>!d9<04W0Kk7rKfc%L(@d8Y>_DqB&vH%*#lnrkE}^LJfZ1XL<-iCgPQHCO33UTv_&pRb>~mgIwbS_G z_p@bqf~QESrMQi!mSCJmQc{@fGpxiBiv3{m;n1CZbLv!84CNI)#o5%cM#_=mxgIR! zSNPfJ;f0wo39(y#5XimGD#-EztOa$OX`XmfFBJ8_qktj43wEE7i zJ79Cjt#G_Az|KJl%UlSrue#Xs3vcv$Ui)HDizB#FE4VONlmqroG@ocb-m%2@Xp0P7C;h7*FE9N6R`$d1vk6)G8H<1);- z(sX_?boA*dGk0$Al7$Vv3{rz)k5?>@$qL$0Wbokk+%S9;wm)6%J^Qmj?&v9DLcc(G zU`Jb_P;OVdsw5pe1@`$^DuoOM7XjYtz6 z{`LzCd2athP`A?ESK%?ovrjpq=D+Uu3|i9-ASZl47s*s@AGVqp$mdhHO}$xSHv&iT z^$_bu{nH;v6Im1G=)rT`XaNmssVo!RApT2F|E4z-0ky6vBTF}8Ce~7F7s#@Kj1txO*mT2r_ zr4ZIFnrs2ZS18=R04__q7H@;Cv~Z|rm;^xy*OVuGa`h=(Z}Xoj;v92%mJlMjMt=9^b}SCOmvJ6q1FFrCG^O}5Pas9$WCSz{n}n&C_iT4&}~ddfgsURSf6bYN{> zX*v89?4SbtABg6-Y~SNP1zIl5PK_k0yW8~vQkt7!hDZxiPkHd#`^8fTlabNkY9Xtu z*|tf(bXwE3SM+3<{I;TamMf~gKd2PhjlOOPto3W}de(iy?^SNsrt+iN7E;_kQ;mi7 zw0ev#LbK;7iR}SHSZwPCtAqCiA{~-ADLUZCW)n*S>K_M8s-nu8S7k6?j^#oUhdj zAVaSEI&?4xI2lS0l1tx@|>Z&_2Cy5-XCbh1>k<1H_aHS3NVxubZpJwcz?A zt*q`Dzh1dm92%FpR^Jk#*+NfihISoqIL<4W{QDAsmUVbo0Wsja18%;~wS4=%8B_24ZO|pHL=81H>r%t2Y#=HY2usaJ zIqQ8kT7UioY4uz}AavYUXw2Vh=!Wh0(Y|Eb*dx8gttwxEEUyeK1<^q_4Ur;0QC%nA z8ZELn@gib^0PDO`DKo`m3e(q0To_0Cc;-+1Ikx^qA@jcBz;QCc*d;1C7d9E%e6H4J zA-6&XS&jL%Qpk5Hvz_QFMv=p#>m{C@vPX+hy}Yuum)=i*LdEI1p}N8jzD7Z$a45xM zt12fi(h3{m_hXT`cu9QFmLsaw)Db85aWV8OFK;%lY^Egz{nHuSzd3U&P%2+yrG{%e zuNWP`JXe2kzdAPeg6mw%P>Cr0#wA6>M&NhLR>w!CG6Bv0{3rW9e7F7z+d}@x`g~!W zWK-s#G74IRWXB=ta%b*Hn7-xnpkmx);Z*$QiP+?;3Arx9&_+kLozpeWWzx4M;i z1hTcKXskG*UW)P$B6HLF<{(=TvP&>^3SaMBdh9D1ZI63Z(}g)ulVCw0wW{N zMX{Y>jyXA5vz9o5E*&0yR!>z$9rz=Vb&s|d*=t%_^QOZT zf;e_;`EBhUqTUGn-mBZaXJnZU-PrRlm{7ItsM)dnt46tCm_7*qagZv+9J7u5QyIMd ztL@6n>NP}s9WSbM(qpgVkI&{xSbm(SQYGWS{RPuDhS?L##S1RW4G$g;e?neU1hk)N zs$!tJLJRx14m6@7Ev;Ml?wW~}ciz+!-bLDhMfB3$f})RsxF5WMO&xY2NUv}9zITt0 zI-ZGycQa2=G%ZQY%Vms=NWBA2=prwC__4q@ia!D$o9+2ZRBzt~mS)~~;d@Bz{#mB1 z>psVzOoJyj`D`QkduDn!rEsp>odnBX1(P5ahYI^)r5LKJWh^R+Z|Bxcpfzu-7MkB$ z@)n0~*s%I<7+P;@Zd;SP#DDDe92jH;FhchPMQ{YmC!9^cGGM6X#{vrWLNNlc@}DjR z+Bo$_bT}$*NnnGoG5jIQ`u<0-_a8V*z8&SJ8zcd3EcsqIvFE5l9V>gu8YtcajL~I*oz_4_JzoS%Hsg1wBxBR5?XPe*x15RT(blv9aZ07-`Gi60L>4y>6I(Nru zd@Fd4o0Ixvsk-4-k*zjnLVn_wJIq(B8N`lcjJDf{Wm*E5-b+yfrYqCRz|_tr(bV)U z3Lkt78g!WG-y=qLThrpyP;nXT;4DPk1@o##z||6vE@0909w~Zo8ZGb9p)n>^mOm zd{QBAOOhY+6)N~5)l%3~ACI^6jCj-p1})@&oy&TK{?3J^9b3{B7LUnwIShziX^&`j zy??*Rk;vG*Ie3EJ@z;?bFjVp>e>Si4r$GmI1Vf@(p#?1No@P>i)WTvNRJH~;G za*JXaarjZRH8pHulO!JWx*+YXX^WtDENz-wph5+1z#JhWhCCb}cSW}phq4ZwGD{4+ zu(Uq8_oK#bI_h9z+N0N~Of>cpqIJo#RBcXp_+8Uk=-#+S5$NC*SYA_c8$f~f>YZ-? zf>CqaJb_|FsL8QxP-G`({+0jdx39*?ouBi(pc_szD@Vd4G6 zlVjgpw0v^*g#s0gF#U}k07#kgpm@T%JE=P*9Jgy`I6ndU&-;~i%VHIV&#YVe2X`fCKsjX*xM zBVs4Tc~cb8zF-%lbC7PMl1df@F=uIY;xh5ORzY^(^gf|GuulT#D}Qo8cq=lIF@HKW*0+l}p$xK0 zXN^t{&#;{R?w{kYx@TP~`e#~_YSPKTGmz37rZCZj zx1S;0@NNgy>IV68*w%I^G4TWYYG_veX6^C4}7cmmDH|Mmw5k7q%ud~XwxIJ z(*EK&DfDNIaoS^j)i#oRh4bXTdmxtiIZvv9^T7hYN%)f%?IN%rkX zb>4@COO=vdGKx~4TzJCgQL1CSzZNsz-YBW#eifQ>>tY)u@p^U}9`!PKm2Ik6`B3tY zT8w<_3a5p+suEAUjXt|*LV_Q*d37vF1RXuWMmN=^Y$0O)H7O3A^?bktGztSp?fIY^ zp^@k#9QoI9TLfc6R|Hk_ti@~2?wdr0&_A2On+wmS6nTUye!>rle|P!jY?;v=vet`~vpEEEgI-JbhC3P^@KTR+VYk zHWJS)7ORLW`^>XP8Z_G6aGjm{<7ypQ!Myw{aW+i*!IhEeq-TY$Jv~z7h{HR3LU>Z3 z&7(M0Gk;3irdsmL)H|cI@hH~94kyzMPtA)9NwWeapSgc`cPPTeE^U1yY7DmAytN z^H`}qzfB9%i?UV%{!Bh6K;c&2yoJ{b4Q!NVO$ba?-GjbuUHT19b?<&9eGym|f7CBYa-|e2Fre$Q@3=;I>7S@LS z(Qf2z-yW5l?pi6?F5=K-(YzL9;i`u)P^IXv^-iCM&SdOD#9AB`z047WfxMbVlL7yGup@*%6 zh-%m_^$nAy&JS6DozQM`_S-kBq_!1K=XFy1F>8d2GdnA5kg<6alIFg%+L(rWd+x*#^E#OJ>BAEx1`o&7s&G-_)@Pnw_$2bl|5+NO#4&4?ugupJ+Y{R zzE>xfErA+#!qjqnPt>T6+rM%W=46xTQ{O1L@++l6HocBPOymQyic)u>pO1My$`2`yJVeA6|xGgQ+mb2 zQTj4n@@KP)iq9^pj7%uU? zc{D4jkLR?^B17>o+Dssn{J;ge!|**$Dnrnb+p+1M8yL*KkOw+vEu&h-~g`Q3JaSGD3$_>D8fM zy97})2)4v}_&Cd}-ch*y`R78D8`uSuwG?J2)Ux~e;4>LGWqK<04L+;i{%WXd$md_m zP{b>??xz)(Kh|o7l2d%p1DHncstRM%CXgeu9CUu}hcL^ybvSuTDfnO@IFNcjJ2aiy z1VC}%qWv4|biQZC;IGVXyl8(stFT$8oO-as8zM9@o)B410z8EWlUyY17J)LihzuU} zA*@XO8ULZY_9@I~-uwA+>kf50CwIkMrLL8>1k|!l_NcKq4cdS$8I2+cf zBcFkB-bc$tZLKZT#78=ins09D%vrE@om3s$AXgrBS4eYhPUIh`4{pVUk=+SrYD9+l z;S_Vz#Rcn)`Oc~9>KCBwx?W8`xDeiu?;ji$OGp)Se&PUt|5y`yJ~Jm|X7O@MAG?bN zvVN<98snE??il67H48xzVx8teFhS8Z$YAn(*-eIdP_Ub%fBpXbz?3wAA6gySXvArB&xSEGV7>sv=A;)w zHTp*??04YVp~mZ42zjiE`L6hIXhUKL^?ni6nM`3f9M9!9X^AN3+*fjUjDBY&0cw7~ zcS&$uh8GJ!*UN}iWglOp;KoA=V;2RuP5UwR12kzzS<*K>C#_7y>bS^H6uaYiC-amW zJB*Cqn?5dCQ6n(VwT&}ff@adE{ZcPfoCdc^agiie3l*X0aH^wYdSgVysU!566L;y7?^9Cy%?_NQf6KW(pfwU~gw;$L@?Q(|K(tJ^;EU@;g_N(oPr>=1vYy9SNgcCN@OkX+No_Cy4sU~5eK4|m#4NR zvhOxrfbNl!h*e<6`btU>lBfNOJ6aTsIJI6vGx5BB>aYFmG;~ia0@>t&Q9V0iqoPJ%dJxA^GpWLB*>-Tcj`(@(@j`hPpS1Rig=e)FE@qm0Yt#?n;( z%YE-g#O1Evj73@Vx8Qv>wr`utX$X$Yd}5FU8D$~o4TCt|=bf5(PQF9VedBh9pT2~b z#b?QPm!)$6^l)HJNuT`-Jz)AsXtOL9!_!p@4pA@C@{iym| zPZ#>m%3N8T{RD^Xk!C{gMla!t0=5Ew`&&cSaTf+T8#^XGlFl{4QKP9!c4JMY4xcS? z8fmOiEzH|u2jmBr|0b#?$Aw;lz16egqs0Z~cQPF8m_G`WXO@$xuZqbrAxHidM}G9! z0A<{!hvdT(-(nsics*g!8ZCWJ5D?*FS>A}>PBGC+)Uu&%V+h3};K=17>Sb`qX;}m; zm2(FE4!yOZl9;FHT!i~o7}P2+r_B3$75=(XWY~J!DWUOw-pr>{+rlx(*?}H=33AJ? zXp2{(TLO9}bC`OIDZxS!$#5}Kw#`Ocz7pd~&mVJn`HXHVL!8@103mx#JfIy2#|wBw zW%n-{xAHOZ)^R4uPdtrKwYRZhRV9R$Vij>kYJNMRLAGV9 z>||GpY7OW9muHQ$OxYQC8nt0j8KUa&>}R36h(7?vkWD29N&w%4oRb1OD&!12FCzC_ zGi+t{&j(%}Ly|gTV_TyBK=TEXPro>V74I96XvBsgNC1|8n7SO39LN?$gRp2{w`L?u z)&38PC`D{3f-C@ApUcr}(Lz+EHuD`$8P`Q%wqNm6n)INHR9n*q-g9%gjkIU*05Xr; z+rMt)^!Nr*b27^zk{)?S))yITrBhZR09<>lr$+0B+WkCon z4N!V_z1DcW(;ZrL*tkWDnH_tk0fUh|g9kW&%EobDW351Z-xjExl^Fuc`Y30iza{WX zo^tU>-lUin|4aJRV142Y(n^tKT8QziJxro0c0n8PEKfmv3dAeYeqYHBpSCrf3Owcl zUMoMM-DBC^Pq90R$l{Hj_>KyzJkBULBPgEBe5IUq{7y@1Yj76M3?<@(-M2vO6;j(F z%Q57)pmo0rS!NK1?Fx!#$17uph`eOj9L4&QFCc8EoHU#hb)HPH;*}fN5sGs!Y(D># zEKH%Qma9UVqY+Z+-K#3$S|gdfNX>XzaioE=r}_CF3UXv1 z_HY9FBR=9^La2zbJCQeK<(x&Kqtjdg-gj%z&gB%Cai$XL;MV~dh$bqH$uTz zgRfngbt|d-MrTXFou8JZ=fa&RQOc}u zoP`IfqF5)hCXu&7SiPBfhaH#Eg+ti9TyTFr?q3c9MGg%ovYC?3HRVREz}PP zlaqqjI?srBe{r;aKdV2JY|NX|lLjaQiN(nnScb>qC6GG|`M_)U86QJES_Fkk)Z`0I z+Aaq2&2ilNFLJ12MC|{PL#fofD2@tY6kakykxy8yfZHT{DpH4Gtxa1${~v0o*C%;K zKUN=^p**HN1@zKW!JE4@#w3SEsX8-4A*`~pv5sAug@zYJCgQoxy(5E{HV169z(Mx| zM)3iRP~D#yk9C}%r@{VA8)$^_Q>exj%DkoBb*5G!z#q~^RRZh7yurB^5Fur(X-lt5 z6zv}kfd80{uA?@r_%_)18#e*PH( zFdLAMg}pmRT^5E+<~=-@Q}_~}!*egFQW3Xn-O={V*oEV;@vrZ7VX#>7s&*Eay=RTQ z_TByEKv*twH#-V#Ny5*m-&kmrhyT(pzH!lGJ8~bywcvQ;5%NC}?6-PZv2Nhr#h=x- z#w`Yp@Fv_dsf`IVkZ6q94R;;iKaV$ldBQ;W!Z5C=rb&l4j+WyIA>6>!&^-UaZ;;;! z5#{#^QTW5Kxd1O73ky7V@eA{K6hdVC8L-ZH6D-q?+CXO^;N`O6q?=-$Xm+WWR8l&3 zocOX+iL0~^^F{WHl0hzj-vj^V5tt*!X>{Wq)uOFOHGkH&Nl%z#Ne*ms0YPyF`mQmE zd;tI{xMkOUQPS%!o3S!A}!=C^P-V#9E?%T zJ;Fa)<{jCqd~pmb)gU@S-S^c{BgmITIX@5SjPT;z6Z$TA$;I16MG081Kpu=b*m-Ax z!LTL?RB_I^zIP6tx&z+HE!eG!*N;`qbCq1kLc`^1fokVm_T(x+?EnU zUHE?yLa{&6>Bne|yBxTIsWRWclH4*ZFSKJ!ejkxuxsc`D+ke@C=Bk_2auGuRHh4ko zl!IHb_X+6OoELOf3;am|?0)EarMM8&_Bt1W%=4V_?T#Tk(8WdTQ;~l^v5k>hLSs@c z&B{!D)a`p(qBg5;*>RC)ndD-q*&~Gb);+{t#jqv^7S6|dl5@txt%(2vAek_OFAkU5QE_A&<91Uq6I$eaW+ zEj9Vfb_?+T$T7P8E7)ygo+eg5Hu<@YV9;83EA~o%KfWF6y$q1EmTr9ip z6f`#Zz`ztR6tKVNydquHpOmwO)ITJ*voApkXoY{3x4@UUOIIyF9*%^+-59=m(e-tY zw690IiMAJTHZj5}d}~>skzD&lN%KW-Dx%w|=j^Vn{?h-L=PlKFUW1evDq!y zcdiA{zBwt*~4%k>p^0D+YZ z+0SrnB{Z?bY&K9M&uMc*eg*afUAIF(O)4L38^ z9p@F>(WkF?$aHWxbtt7rNbrAl=}EToaX+SG%4(x}zFg51(gS=;fY9-}n{CP{1MEwV znp#~aGzeeait`1rP_P*KD|SCWdflHkRqyIPQYUQRXktiX8J(ZKYS z&K6WGa?S&|1BMNFiA-4d#(WjTi_qv)*;u=q*8^!;ZB0uU^VD36lm5mPg|lwOI9^2) zeE8CrCZ`x4ytsS0lCK*d9e1tSmj{k`b&vat%|De&0fo7-j@*+C_2;@>r;ypQ!HYYR zO+%roY+q%nElHY__NS8OZax0lq>0}-zMt1SivRs!{4eNXS|Q=m_a5^ zK0cY@HmuBwnfvOd_-80w4%l$wi3h+OT6m`=5zgegyn6L6PR=o8204Apfh9_`Vsb|A zwyZCJwC_E_pO!E}VXD5Jq!>N#puskExOKrPAP8@x=&+33-c#ETln0v?S)0h)fEz-J z_v2ma_6I&%DvYvsj|pU+9sScH)2nz)8XNbx#JZ!Jy`qpS;2uhT!{7QZVTgW)A_b>x zKb6#$K5l8m&n=6cMUK=iMEn5Ti`qUkL7Z;L+85KcNzA7MGL%b;0ssIv+PIy*z8PQ0 z?5g2+#zr~Y!_!m9g>d4X6u0NZN{Qb7rQsjprWRLbO+b`5L0ez(;NRY)PovW1AT880 zLDZUMo$4kHzqo%VUMVqN@;|APg0vDP+-&r2gY%}_wwd_<)s(~to%M-7wLQx3$p`dE zfg7h@Z+?T?{~+r9mO75t|f$*X@tXTY&!n$o}>zq|L`Qu`)kFQ z{D&t=$WAM&`P3Vc=;T$mGi)vJPwscGkH^bX48sEAIe|1ul@moMoQR*h9?X6avS|G!C+s&dVhRc<5`8C{cx z3k;DbFxdT_tj|j(bXV`<=M;04p0ZYS`#d{O609k(3*eTLE4$=Kvl4B=mXB#am# z{*t9fl8H(so-Po*Wcxk8+}u>fBySh`6+CkJD8OX$8W;5WgSqf+TkmBg$IjA$o^mDo ztoGPkVbxXzim(s9@yxOZ3O?j2FNuYi=e;G)Gd^+%>I;5{hPBqd+^>Y_LoB+*7Kuya)o z_s&;C6C&e!JXR7;50@X;5>#PX?x!w)-M&Y+G&~2ZJuwuxGkNq?kSOo?5Bo`J_u;Q7 z=|AWigI5Fdq+w%&V#}3;nWq`G_XK;u>lJ5&ttzI>Ahn(7tG`=1gIxlBU*OKLn_zVE z1ageW(6wCZ(}iw41ZanG_JRAH&k93lc0jg2`BW0;^S;b}R#Tp3^D8OC>?1Zq7Qa=_ zz}~&mQ`d9jSzUPQ%H+WJ!ES6T<2@06)~-cnYBDPi`eZ5S7wiM~@$>G*{uPUqKp;qXAIgO?VDKU*XO$4EL~ot61m>k?YLG^q0z>s52%4u?yz!Ke z2c>N6YpAR46TTHZ4p+W*F$c1IxxNY<9V04BRGp(w{iKCXGvU#m(y+-$Is2}EX?5yv z@Zp-!EYBvM+Q#<>JwB&bNM)xK!Y= zu_h?4`F@4B5x%KEitaH`)*b)Q`PpM*V)G3!C5?X|ABhBsI(`^zLT04SW!LysIx(~NRVr(dVn(qMi>2UT8{`*Ke7^y$YFDxu_fqWMQ)JmQ}- ze0T0M2S<1T!SwwDpgOWDZq)HR)1)UDRB++ig}%>EWtd(oLjzhXQ^A==74+~V%u0?n zo%njAP8!7idryYk#2t`K=nDM5-nhf=q9FKL-Xj-D`dJTZwbkdbm9+_l^)Gw2zrW&G z2jyl%m3sCvD-sYf!Cv&8R;&AeuVKOg>lI8Q_B?hUWX`MKW3GQ8j4FJ5C3qSp_i|JZ zf`r6(+`Az8`RSrSB$Ds;$4=$Tq5Bt^d}5GkK)3ut=;CtjmKvcGIX{=9Z5Hw@YueiF zgYKE=nF(a@&LueIVwSE-({+NS0p55Hm~mpRmZ!dGJ)Ht9srbR3prUTL@s zY9nv})RCWy#CKpyh&(LI%{C8F1eXh~jUf604u--s%c{=GW)7z9(jWiyF3~4zAf_Zn z>LXO-;gzx#bs``?0f6?#VuPHV$MO1ltzEeYHd7G;gRaRb5|>6zEnM$~AP5RLgWA~A zRM;_96W|TvddFH5$+K*d^%tMJ=BhUzhdSqJ|I?H`?gOBBRadVd{$pvsI#z`Ht0&dulp>YAjJ}YVkV( z^$f)VLi#1(pWv2S^I?tt7`E*8)#9wDn7#p$W1qw@4tV`b4PYZHHU8o=zub>pOivI? z$Y6w^-HyV`vO?K|fRSdn9TPU-Y)wmn+sNKExXy%eMaKZE$+i6{E1Xm$l9}1oxuzh$ zuoK*!4KO=C>8=MQm7_r!n;`e2XX%xACiI>>CGP3I#J)@`P?;R?gFK$>mxKSwytJV7 zVk5#H_$PdPzI8gUlOWX%r?P+E({&Dv=BieW1hzf`)AlCL_-5>4=A29K@2eu&Q%H|2 zYtsgXgKnzW^F*R~3MHqt$Ej^``^AIH!3c!vOD^Asn6;Uwdwsqvk2-<4>xKj>1$PE4 z*1Y@_%Oc`W7SsB~s@8Pr?q|w`c*xcvc}s`Kz#VK(wOjEk)&m7z=S|46Fl_y+=pDM&T~pY2H9#YTB_!yxXH)CdNg<7AD*S?QZP99W8oLqCpGV-wjw3|X4A&%6WI-6 zli-M*i%UebPOeiMvq%%Mze!eaKzeK%g7~O+|NZ#XS5fz$*jscELl#;b z%;zpN)CSf%pv%@h4)Q<0qU$NW7GJqcteKz%i7~xxj_jBUyyJ-2L<8l5!Xi?ZWf{M8 zoV;xrvLd6(CeIw}Ho^mX7iW^Q8tMCDK8Tj!@D?9hBTsFMxV^}zW!FZQ5Y6>k2ZM@T zIq$jl9Rm&jJyEq0Bhi^C4D9s3EK8^!44Pf;dp$71gL;X@0>>F13#(A6r$@epuRyEG z_7F(2aQnrDFEIqByyi>U<~j|Jdyia7QnjD~fYWPiUv0~}ns+}mPWJcGr=EWZn3zC2 zO%l71NmsU~V0@9Jxe&qe=Qozm1gGT}X`%So4lyniSg+gOO208Lb^YRdUJb$|705sT z?OAf=Gr;bFCB8~Mk$BLso9f22&3;}dv^ZztIIriO?DGP85L9SB?gcVCZsGo`GpNu< zWa+u@<8$zAqR9Wwv-Gj_2{5iv?j5NqDp;osa+ThlwbNvZm70kOv0;!qb9Di>>YTQK z6pvq=Z6NZY(fub=?zDK5pLDH4ul80yknGg_w@^u_BT>m;4J2?RGNUefes7!&1a!K_ z1_TaQyq3M{#|=gAHD-S&u}+ucoQi?gZ9eYJPn^TjzokksL7E5zP(___P*N7thwdbu zw+9yRZH%^l{dFk(9WU6fw;mU&9fptiYwyxOf2BJq zg(LY-)E1vbXaiom4OHy4j|Vy3i3Q}##=G>uk%{j(fEUgvmje*OvWsbZzYw@)v|A9M zVth~TC&9@%r%-UH6=W~n+$vL9w=}vpVpdd&Ub4>WZk@%1GP2>3&W}5SLLtko)KQo6 zx1a+8p{9-mR8jxPtQb~O6<9Jp+8?M;a)CVE{j5cAcPKATiL&AA#YDN~~0Xj?k zpH`)!=Tc;ViRrzdCxm3$!zW9!3{4gtK5I)PoM2e#6GOmnlW> z`6xLhK(ur|Lt9@wl-#%3XUtprPLfVXBrCoycQpaAS3Y1VKNh@Moklb#>i<6~lo(GS zMHmMsEWrQr_Y|9spRhH9JeY9-W}S!_Ns7rJC%$Wj$@AVdp^pMSr8l5}Jcn$$S$fAJ zqV5t@TdUq$)CUsp)^1SS!1I@5XSIt$B@pe)k|vyNRi#v z*7}l$OUO0rj_+I^+#@StB}F0I8u^u7DztOUL0iis`drSq?3q2J`I9pT=XCv9=y2_R?Hr!0V~hFqqp!l zOn;ALihR_hJcJjKm_xpaD|L$e=X;A#lrIn;hy>md;CWwMWCOk=Fuvqi&`#)ARQtiA zknkDsanydEMfMs!mlHNk2Qn!1gBoKDdKgHc>O?(he(q?4(JfQOe5;OqLn|k~79CrX zeO4~&x*E7)_}2UF1jOy5D<%F=$xMd>d{KQ)jiBGE2gUANBVv%ua7r4eX@#rd{F!Dm z<6Cay*bIcF5mUzX#*H5BOw!H~W%J}k6)g`_&#;>&>2Kw5Dltfn8rUnuKze$@<9S%l zHH8bYE?e(HPMc`o;n_4))4C`i9jeY+qP9l-S-b*z`WBDq-(EA0w2Fz1mn>KjNKgMj z*Q2_p#`I*f(J_({M>FNXfO+y$eCzd@Xz7oeCmK82*=f};+((8iH~|&(<#otpub`co zSlw|%9yCeGDv}4Jd)eWX)%XMfiZFEGDci%L&YXpvu)6Ac&sCjX0%>uQRA$YZWv&*VOHw1eMM=zTL#~A5X2mO3nahH93X>n0!>xAv)~q8ep&%2+)2p`rGk<+CGk);dW_~|B)*?tG%zYhHr|Iv(eQ)E1hNQb}cG1-6(jp40hLPVJp9wJWy0?!nT zYcMTi@;R(=o}6R3j|58YgyJZEir3Ll9yrI68#r|Vw%>w!8pIO#7C0e#mnLjMm7aI) zYmHX$(C7IPQ7d{d?r2ekzb^c9VSR8vx&r^cC2x9aQxz~{cMxlVl&sAxaW65rqUV3; zlkgjE)1S&Chq2g&c;mhIHb8YW{;*3G?2-Nla}wMBfL+diRVPKB1_D~1(Wm2{6#`#Q z352|iQ+h3W^8Z(LlGgl*if-}Q_00jxjEHj@gy0`9h1)Uqk>w`6j`|4#mZZ=31#Q3% zk(H0j^E9?n`MK2J;Y)Ja+$n4JmEImjp+LTj76Dtwlhqa1z%4$U0vI|$g9b$a&~Q?D zWwn1kRYv%qV=&EgHGn^70@w3pu9#5K9OS$-Zvioo`7CrfR}vdA&4*`G=J`h&Ky$$a z05e{Powasuj%qMUwsju4;u0! zZn|NvG&b*8D<-o(%VGCV*uz>{b}4=^7|^Y1k*;9~JZ2&64l?fUFziiV0PunSm>VeQ zhV;MdqzXmu(w)nfaPF0(Fh5neFy;~|a97ao8gO2R0arnzKqo(YFLLb@-0ZrMWNz)G z{ZDoyG$0SU#KF?Q2J%F4rPB`#2ip?+S$`>eF`L38A9(-!(}SXDRQp9_)QV zhtAT#P9Ste?(34|8?}KiDILx~^OCd8-j(=V&zwrC~51m*}*Pp#*!wiZwQ?|n$pV@8ZG z&Ryc*0Z5GzMo^UYG`;GbE7_%}yA5){%ek-#nzEpkNM|5buV^g~cJlMo&YctAIulpN zyACF@NW+k9*Kzrh_dd$4LaL`AWD@kNC~}!js)o~3Zd5^y~7^fclVp!o&9EK zw)~fn=sbCHa>{*Q*YEl)G<oPw&W0E+z+&Hx#N#0=cms$DZD(p2(pPgZ)o5^=Wur(+1&`L;BIln!$L)Y4wxJ+ zMK~Tr9bEh!fSXiM2z?fvLbIp%Gyow4vImef1KGJ=!ADyP8Ifp?8Y;jdOSo{jqJ1G*mZcA21J_WGM z!i$iO%i%)9ySK);nXKC#La-boRK?*5Ol36NR~G>oM!K~1RZPB{Og}blW{s5B9C#f0 zps{x_#ic3PoTSsC2Xd_?PE@;*DWbl_MPv?nO#7Gi;kLbe;59Fwc}x8s50MH6Az_D# zID#xYLH1r!^m#We(wZ&lQt5HpylaFtTU?-M^GM-+Mq@9@9!QdpR&ALQ7SIANk*{~v)ztskz;D}S81;3p^p9qwqT3lg9s>VuvI z07-6a!OmkOBFhzh19;G0Zal)xpXYl1Hr;uLVgfhzAIzO5$&>5LFV1&fdd8rdoe#fQ zq8M)e*PFx)4Z26;4MoHwmVx1<>%ku40$(2+vp-MbKKfz*%jNk<_6rq1zC*&@=DPT? z;7rk;aU%II*C-}{CIF3gtqtkvGdQ`j=M0cW0K<9u zI*IB=du(QW-}&0E+U|D~Xd#9`^r^}QMC<*nApMSuC&exz8JQ3&2G8ZR5?gkm_0EJmh(a$p>Q*r6I0kq!-RU$KU$`I&itM_p_P zGb<1lRrbnCeyn(!VoEG)6-0Cq>~y&vWA}z|9Tb)wY1)eO`|f>KVrgI5<8^D(Xkn?2+!f zFh+4+-vwWIJz-Yn8x2IluMw13+jGW4=|E)DQJ(6&-_gCD`Ch*_<4geK*MvYwWc_*+ zuQ!!n-r9;jTsyUDzKEIg(iSex|$L5DX zMXIPH5&8nKC09~_@MDri{D0&HfIu1tmA$|L1Wr%8J7WU)dZ|=+Y0(+xJD0vCO8?70QI}R*Os??a1X&?d#;Fenkz&!(!1qP~-gsb9D!= zdrXZZ<}%vtTF9i>vE(KV_!P#3N3(wdv0kMAp8<+h!KJjbFXk`Cyi^JWu9bI*1nh+kl3^^@d4gUAAg`D_$Ga~?(}Swd|3=n zq4bp{Jy*#w0@|G5C6_bFy<}V8cHWt6XN*Vbe|bgVN5g4R{N?8Re>#=~q=arOeCvjT zP)>MCWv_kvJaSIDTaO%O7Uzi zEP#5+PzdNPwx1k_Ci;ELj2Edg%gxTaD|FT2`Oci2^y2OIN9Y^*?DhZs+t=!HUH$(F zxM)Lv`s>!;?k(%$x+hgTKTuXZg!+X42ecx#XN6yzm=G}d&%3^Ng+H(Yod^me2QqC? zzdvK|LJ#vM79a$>j8OI-!)=(QKad5#N=^bOBXPtl7Mko0WU|ETxlTe6C<=yT2G=Xl z#N^c9Q&=`H_T>a@@k?+Y4!xDpZc6|G>PBr{0i!|A(@lP%&-Bj!8Cf)7s)mi5!~$tH z2XQS}j!j32Hrf}Rgsq!Q7VfTU?u2&%IYw=<@hYkd5En=Ps(;nac`?%hkB1PE;ZF@! z?eh^>;QU+^oL_l2Wcd-|g#EiTwBH4x`KQVXLLWN%-jhUTF`tu&{!1;I&dv?6zxuy1 zi=H4ayU3h_nv&v^yT|@DY5TO0;UkTv}?|4Y*AD%LG&!5@@q%7}naYmOxh-%M} zPvju}RuFxg@}B#R6oM%lZE;&&24XP6M;`rJb2)?E3yPf-wIa+kP~z*_A=)$G=185o z4V0eqk13|j-iA#hUE|@3cAvv;bnxEeONo%`LUULCBE_*Ewzg&GjuT|l6V0c6Z0WZ+ zo^V4Y>U6S#3P@;Y&a3P;#{N8kdTo&UR-u_(j)H^f zi(52%E;M^3fcPOKc-|L@^M7fmSJVW4k2^leIKtoeaOcx0#}Y~pWYVMWlc zR6v`W#92=4Uh;c$#n-1CGn;YkO(om-Zjd1r2O$T|^NirY9XQ?_Hz*_-8DQj5{FhHN z2xx-M^|y_@T>gVA8UvdataT*P{)t2N8e{Ey%_osr|DH={#c!~YiRFFo&!;t)4vveL zx0>+~0NOn5ncMpOf4^7w@76rd=mKY~LtY0Ab4vCr#q&R?I6C}YmGV|C`IJJU6LV7Z z`}^ZN@I(`?Z8C)^hlx=@SNf&_5>h-EemkGlEA!4&lmzY8_~&+U0yD3XeuPbg zmF=9Gsx_Pq)5m;XWh(wfn~aKZuXC7oyk!pa3YKt9G5YYUqobn-n~^6XYI;n{koWwq zld!1ngQUZ!#ZD4I)0CnCOC$l0{pfNsU3laSi24O4R8U-g8urgU$+nR7)guhgWbn&Q z&WYZTg-<#&zvk&9(go0-zPo|%-+LaArHX&ts9>Z0do*$3A`V0?`fBcMC8^&IfBIA` z`?k+f<7f})I2tejlw0t^3gjjj?HjCF}U0Q@8|U7 zLlFxt&MoepQ;~DmgOTZo3sAPsU~-&UoBd{)0Y7M)Of~vmqHQVm-k}v^Ijos5Sxh@S zNRx-Zj{A5uFoT}<((0`=kDbcSb!Wt3A>5wJ;Uk{NioOq1&;6Mqy5Wu%V^J!a4kl;2 zyLiOf(+Mvz31hbUrTem<>sJU3!-7lIjr6tlW$)4=7{a06WXk8@>0aat4?D$tri-w% zB$D6!$QMt6{uF3ROD$~;>rKD)Wov33qMr5+;U43=u)3gbvp4)99oF}^ z!K+({yR%7sB+>jOd}IA8bk$GC#o%8v4d3NaI~?Iyfz*d6krwNv%N{xtDBvG<)RPtm z>0-?J2bpbg-^k9TJ@_oRCzGg|*q1I8AR1jd~@gO>uX6&oX&`K5`OSCzrrvddp z#e=cnLw#rZOAmc$y_=|T_2cW%FH${e)J>%PJ31+7QVE#9C|-->}TP!WwhC_u*+9? zDF!VM`=tK7fug2eCg1jMD1C#aY>ZJX@^kq&7y?ayC{nu}TsWnhNIBnP5PtNoOgonv zA(;-hltneMoHeh>a0GitZH=BB|5^9m+cXTdYnP6juhf%Gq_>qmkc~B?5Na!=Rzy9P z$a<@72I~bkKFq68@A#*+ygvNq3@Ub=)b@UxwwTfEp#_q=YmfRs_D3kAP>Sy4RcKcQ zvR^f9Vn^PXEKT*GM)l9HT<5i^K(9t5>>Iwivm#KZR^&9B_ftNf zYvB=F1zxBlc-AvV?mE?7iUH^OBX=?=k^VT00UbZCXe%Fs-qcuOhrRmkCu<}$_{pU7 zXnAPO&&{oyo`#?Hv7jmoJ&+$ZKrZ^tNL$X8wuddMGz^i8?9Uz!TKZ(-)@~t^Im5T% ze)P1Qs6ViSoBWa)a1@7dRh#>U_-smb8}B3sPD^QvaI^7xs$AWB#qR2#r#)!cgZUOx z+#cn~#^&Z;!{JdaetqO@q1X(LT5a|e*|4?w=(Ik=VAvc&PFvweEA@R~GFnzVXK}ne z1d>;L>eL=F+D@x7LV>Qd4o5b{ zN40?p#vc~cBGZ~b7u}Szz$u zo_oA7t+h&Synf>S8ei|VlS0zv_qE`-gyge=9w(VOAQ#);jCsd$TDE8XdE zpDmxW`MHTQB^Li`q?)1<161}6`=DTb)sA`b$6#Df$+u9^9+`7|sK#XM__4wIC4^nR zjj;<26!p12d?&NInXyrMjD<-2E+l^=zCLXNrfBzzcgF4ubm@q-SJ})%9BOTQH&V2c zE3Tg3e`~E~Z#!H$^!j|$Pp;mOha$-5#yorcTbCS--bnvm?`}iue_<4d21Gd7-1Vnl z@Mmma>~7g3j6I*P<(wJxV#USv%Fmj@+r9MobM~1Vno?p{2I#$hTN2XyO{AUe?&icZ zsPnfk@pk1Ls5vZSJd(z*R)%#1%EKDhCibIq1w3AWpMXc-j?D2Z9-}f6T z)=@TqezPBDadhn@Q53a0*W!$2KUhVMteL`~605CDSqMVNY>VTwk!VS~#BN9vdXU0W zUkgkM?|e2q`%I2cYBIYkC$Q*|H(_EX<>$AdtZDXkw#Bo<(qTK`RgABu#H{J3292+&;Qe}d^yJqTa z2SutFC$@(vD<#oSx;nfSWW{F9^r1ig!kQQ!ir{MsX0AXvtl@pGeNP-KJ)Q`0GpbAH zl!Yw?CHA8}(Mx}(=K>TtV;4d_)rii@BI@lQ8jE3j*qH47sy3N8Nl&>9c$1?mIYsnjIU+CC2I8 zep>U+MmQOG@y3F!<*QEFa{g(dZ|lzs;_cr9$iv!<0=v2_L8|uStg!5eT(G7Q53*)) z#~g*O5W1yzET9ChqaAB+PqM!oeo7hKX9j0W&)h1#cQyFz@tlWjm0-|F&U){D5_bJg z1UZ|Pk>HEvnls! zD!c*l^3}C{g)k07QP9$zNas(nG*5?_=hBlE>&Du5=l3$<78X9lCH>h@eLU`@SI+gP z7lA-0t=jte)a_;*-9+F>d($WuEIKD$zkTqePx1tEozfbk8qDz$a(P8<_h!Y%9-{)9 z9oB@oUSE1%dAET6~x(FxP@h2FXnJl%qoNUK$9S5Jlm;^^D=A&shO zGKRuvUBvz&@e9O%`j~hn<%k#t*W0yc8U!u}j7Kio^mTsV$J#VMQzPj7p_2YisN~2akBfXgu!~+Ow#_{lFhN^&WesD#-@-m z&c6q}viWEhb%OV6yS5X`?$jnwGT_1nA+y)x5fXKGn?}FB6!O=cPg(3%x!UYqcMGh5 zTz{dH?d{V?(MMzXm0|Q19|tD~b(;2Wx)@J9*AzObNr;=Lx1xHv5;@0^hAg+dM<(5q zom=`^K91^?Wt&GS{zk(%3-=dIva5rZHSF>&sD59{xN_?n)YG5~VAY4&v8NiQz1BNYTye4mg5I3hYff&O?nq(B6TG?LSE;G;;G(xWGz76>(V}Wnu^2fv)$lo z4y50O+K+vxz+C1)ELuQeyKj(y3POUVSSTCiCjQ}liiQcH_+PgZf2=GL+JMgZje{4@ z_d*p8{FuRF%dD-CTkoZD4;M@W58`pVT@*=5&9+2d_#A%ErX zQIPVWWv>&-m}#hk@4&`0WDSr_4m9n0li+XFQjJu&4I2j7QR#x%&a@>_nDB*OGgwYx z=xmFwn>iJ8ld_lCPKx!~G~M|}z6eB|i?+$juhXct%`iQ-Lpq4<6p;_|4ON8?%u;_Q zt5dC-MZ%#xAD)tm{Sk9!^}>mK0EMR*TkY-;kN9?E8t&aX<$|z2p5!m)6-3o-*o4o5 zL@4QY>B%PnT+>zvloOkZw+9|80I*xHpE-IPdhjol_D&~NZO0c+(j=-L9o!+GVc#ZJa zR4#|}hW(0@&KyI$K>r)t&#FJvj3C5O=<5coS413nM<*e&^Y~RcO5dB7Zo8M$;z* z$sD=;*G{Bd`2Bjzqi*2T%rNq3WT+aCH75;F--wP)Yc%kVHsx{9jxd$nJ2rW4^Jb75ZPf9jU)fLq(Q;zNAz)_GE}f8 zZ6hs@ksq2UvS50Hrz3+fJUe8eMNaaasa@F5O(5!TYgVg)waOxXK|2UV`I^_^LooIE?-6I*O<&O$7v%kkSsoVdh!kbQxsIT3a|iSu?1I3XaMY-AY?$1=DXsu-COD1EF?1knKl(Hn;0Z_~Q4|LOvgT zdjyOnFgFXwwp{*vkE-7Y5h%5ZrI;OD46}U#L3OPQ zpyj?!9@i5ywoa(#TMoXe9k1DYd(52F_3Oc$YrF#KT_(%4wbrR{>@Q1ck=nM}_dzY7 zC1@kvk~skGSmWl=c6xb@J5|4%u~qMIaee7@W3rK}+c`cC7qKdfqHBkv&t}f{xytnN zG6f7BFnc^*^q_?kyjSb<+-6&#qHf^XF`wYQ-@BhyAoSMv0n2Q zde6zIT9DMBiyCVi9&ZUVJyg66IVp+`Q-t5qsrz080w1b%=1e#fxNzg9*IzaJ;d7T4T>lZqHG27!6W(_qxVInO$1`? zM|=n?R7a+ftM(e<)S!&IoQ9J1cC4Kr(aAv}l>6#@CL%cT&sf+Bl17->YO+AD1vLyB z^!f!qy2cv*C7i2@I|Mh0N?rAZ+>GP2_O+7339^|MxA$H)hCG^oIh(oJK!;mD)rTvk z759W3`UIfW+y#!b;g%u?lsTTbnN^?DY}kg^XUBgBs#6f}(`tB0jEv7@+ZaS5t$`8Y zISiZFoZqs*jU64s9p^0qU{PM)gaSF^6#54ZT~$4~<2Yk+8&JRGZBCV_vgL@nWi#_; zvb}Hn$qE|Is6Rre4~0WLpN@8*h)83_H2VDPztXktRl)0Koey;S&L!GXp&6Rgj5yHN z)cK(3I9&0a#F+8LZHo}3&kZh(AQQwUwr{?@HaIC?{Nqn&Oyz@kRCL@4a%oO|4jHwe z@bA7uy8gBoTa%$t2cAzZMx2YAcP=1t(Eo{b+$F~E4TaXF}z^~ zQY_19ab$Dqit;{U?&US`IYsY?tE3sjh8B9GwkDib?Sr;nHXM4WWWD6cngbRClGCJ@ zd%&XJ`RHZeCDhwV^4((9`Y4fNE)?;A^tQm%ojIhCByLKf$P|hC@p|Rx<1ElIlY=;p zdfLbO68_+xk}4Lr(jf*Jfsvzr_n^hWN)A%=Ee#*?H{T{U7KS||tYk+5>_23g~GesPPpDxXv9Za4b&2gP=a1Ate&}4Q&X`gM~DD-?Y zwYye1**CR3@mkD4ro$FKadE)<`}_o)IEDl?2Xi1K54d;Yd|Kdcjw;n3$hN1 zi#lu88=o(3{46VvC|qF19d4}&p*Qsw-Yg9HNaP&p&CZ%7)3=|M!q>oyuZYZut%D#@ zA061)5&)^r?MzntI}#BqLP?l6xo= zC-&lMvXFcMa+t=o9SZ5-m3>{tg%z7&hl`h~fX;~#aF>qLTLlJy6$C;kir)H^TUlEm z8?!CwOL^xAfBJch;H{VglB%N|`hBP^<^V_hi9;fy9l+%jkem8OW3bExq!6t6vs5bB zX=Vh^bVY=F{yMlnd7b5b!<1K z7=PwgGZ&vvJbgf*&)J@j&q49oVR4e{`lLCB1=18AZG#Ew5!!d_qw5S=c|!Vi!nuV^ zp}a^J7u6+;Tu0Itez}VzhW zO%S6e^5b83{?t?^2s{Bt$#Hp0X1V39tFz#MU*T30`9o291lD^jk=l5$OIYhZ^QbWf z&4e@M-m=7U^w2s78pd1}QoL>wcDe;=1zrW74?k2ZT6KyDKN^@}eMZq<_%FgXZ0IUT zjZ9a_)_X5krQXrB(`{(zH5;3b+!0W$qJee^KPazw2WsANBvo4{GKKNB{6W?qh4GhnOIj+U z=xxckcdoq-@m8Bu*Ka>7a7?!ctlRy)q%%x;nEhmZK5@YgVKu1_%vP_2!y_z@IvQ=tS{BtR~>L zGmjnKGKI(7x%l}~TYVG@V*D8!Z~z?&dveXNK*`x7er2dR(=yz94K4#H;{|^+`6XFuFtR1%%kj)H~Ip z8U_hGDRIW=Z$WXp&jc^l1=E*+HHa#bktlg;n6jytE60icc5jCW3*<&+=*rR0KBm( zQK}1wgh#(VqskfS!;&GyKK+m%VX8Foi(^ZGdf(hy+KSvNWkL3Tz3nXNcJR}bQx$~f z7$G@7%3m7Mn(W2iM-S@!Au=1;eJkuT`>L{gBle3>+6r?_`Y9En;P|G#XFU47I5&J_ zJ`ED(T0HQk=Os&%vaNQ7B1g@Tg5Wu3Sl(a&au!xU!86+Q$Cz%A2G8>5$t_lniYkTp5;4up#Fn-b`@O zcBN$SL|EmUggs4-w&@#>j(MuFt_QZzPKe3g*tQqq}H_=W`jjs4^*Xf#=;2Yefg>xE=@KI0)Sn|-?{M|dQU1JHUY3Vl`W&r)sF(N z*f;wGo__};zulWDS^fLwJ6so&wpPjTbCip)pt&@#8(3d0Dp`7-4o_)(sU#ixvrIcm zEC+{di8>FugRUT7ibR&yp=Xbxuk3|6W7-}1ySc75a~4*N;>JkVZBeXcVg55{ygk5n zBn=b18MZ4sg4zQF5x7~{;&EZ{4Rl@SI4k=2E8v0005jjh$N01_k~DisEC4;T1B4y9 zw^;6SGN?7BMsnO3c`*C>x!5^#=26uAFPgok(!9F}_uqgxbJ3yCDPGi7k|myBGI7_T zS^0(f@Y~VekgetkLj|Rq<0y<)X|oIBn9r8cSu(`>`H%^Fj>5%Jmls_lKiZT>gw^H+ zlD=w|lXQo}>B={DIh6ddC6diA&Y?4RzHT=Nzn$}K&pqmCD~WG7_>@4JNI$ai-Va!3 z$=763me2{L%^}KUMCNoaVTyO=FSMo`X|R zZ=|#I>Rf?MUnGI&N32n5@<7q29-pAYbrzle{9AyijLvS-7q%APd3~o&5~xqG`3wZH z-Phtf!m;tfkn~?IFIH7aZmEe&E5Bk(gOKCx^F(&)KAh8AAUNptLrMKH&KvSVzc~rW zg`p(fYCH4Vb@5@iTwnJi7|mN-?W4Ljblhry5e?3fk!$YP7RBgv&Y)6F>}3zQ7r@Vq zneyduV8b zVV&E~yodC5`9*dYdUff|6t8EA>KhES=$>O|WQs-dB#sAl`&wB3%bkg`MHS?Jfa;ZN zr)3o;Hx10ntM+@6_(en+1s+jNzzCwvq24sj6*PO|GWqDc7W%c(>(~@~5>c6OxW(>( zM2 zUHYr$II%Ly3@BcbILNaGSk1UBWFFc{r3zO#g1v}Gug-RXBX<%faRj6!rdtHjQ}ax4 zuhvUEjI63C%e7l}3dPnXm_cR&WfrgOy;4_SkVQyi<7Elr{gh>?G#NRLQc$#mX_&2k zRv(}KLQ5u_K}P2|+dPt z^ss0extEw<{7yfH5OOnpY?Kh0AXniNG8g}Sy02~T1$xjv`)kMn<#7EMrb7O)>B32c z*+r*v#V7eWQQWF@#PuoN>KyB_3a(o=afNNj1d!OQvob1-x00dVs?JD~JNmuQvY*sX zQXg|=?`|17VWtrlYW5uF{QFV_VO$P+rH$#2wp{{@(MuF$frWYts+@u@F~AxucIj+F?qSE&rRd>Y1$&`0u{}KBIGLa_q(P zjtc5HK}5@tRTsX}&%$uMmqpc1qDjq&0zeH4*fUf>bNON?rP~bSHFcn{f|Mhj0=j$o zM-`uRXsW$2x?q%0G|Q4sAMHPJHIg(|e-r3&bj9p?E|-(Sax0R8-(qNKcB@pQ{l@sa z3ktmEwNG)nxM`$Zz2!0$D7#E_mJFkosCF*6JC{~)Yer|Ksi}N+>K!gCRHnGmL*pu! z^((nTocAH8)3TE!M^kb|RXowDjgH7S?px2W+9ZiT>JQh0XCzD`a)1c8*NM;2Ob2&Y zW1q*CQ3}5%6DFe`N%F}Vj7Ie23vRqc+;21V=pgHX-G(V;Ky68x2^RnnMGop)_g# z>rZ_L1v|GFsj6kV0jOO6>$mmMwcj~k8|3}_W$;ewZWgG6_vpg*r8i6i$Mb-52j!rD zhYu@h;2(f47Z9wE9y?cZQasS&H81!Y9DzO&Hi%`*e_h}pTMWa`z|3WZT^%?Vz#eH_ z%$d#RN|~eq42@>`;o?wasUO!5R-ePI5OG^;4NuBY0hR0!FWvlL6b+Gi*QKN$%)jRl zgp_QR8d#!nKykptJ%xb@VYE;Kb$O)ZKkY2j?jH?%q_)z#mjTK-%F&_byFYbK1&og? z;Hak%3@dajqLSm7l7fuK$Cj-G zqx;}ttMdTup>DMa|3Z>O4tDoj(yd}s{y&MsLO$c0jN#S^8lxsI7*`He>rW`tkjcAs zeVp5{oeQ6n{vvJB@_+2RJex;|T$c~;u>Fo;c6Mv)AQ(jid2yV+_-f33_Yr-a zaD6dW?&`McwygB9tku5camGXabX$~d!oz&he^De^nJ7%nNMAtlAGvdoOd8hfGW%>= z_dUhhZDTp1Fmc@Ktn{G$)wc8fiJImZ@M@e76i-l?Y0$W@?sq;^XsnnW18YX?$0t1+ zB|AWl`^G>==a^Le<$LGQFfMD3B;0S015xnJulX&2s&Peq6qq`46=fz@d!fe}{-|7E zFRm3jqFLdV##pe0O_(_7)Af7NxIQuF`<+-~R?_U^y}{vjPapUXrj0sDs%O1=+* zd=5?@V7EWA1be5DOiJ@9j&r*^a`F3r#8@4cufY!|gVe43r+fmcjsT$cMbS+36 z)S8VHacE0B9No!At8$2&5G>gD1tsh~*J*%S+BDQf1;;@FLdJ+uzL}E+8_I{6L`8=& zCX-G?!&bhVX8ip2j>d+BM~%gUO0!Fhp~vseY{fF_i$qPgLVU z1K9KyY+;beLegUH5|jUb=`o*idT@{!5bA=u^Zo7DxKOgWhpbq?6*qnH>A{N8x(_l= zP9&UQ?$oAnWm}<&cVqczjRQ;W*!07YV3pb;J~UjwL?YM&0$umogyD|@QE1QvfGS`p z<6#G~@dC?7@V40JO=<>}+O2yrp0`w&69ZX(w2GxY{P8-q?N;(naIt;axtq^cs!`}N zb$Xi@;GFGw%R+D~=_g0M4&9AyUrouhx!OnpXDfaGc~ zX&o9@A|@qXBqGu2AxHbjtAgCY>D{jjm8{^R;}eR9{7BKC-c1F@s1A8K_CsC~wqIy; zJ+ph0VIu`T7#$%}`YlKBQCNT9UHyeY1Y+`q!ORs4qSFue*$>ihJzyJs2(VvgXXLP% zi@)OfO2@p&EF(QY903a>z@Dn6N>+@1Uo>g!Bz+U=FaCM}UxV-L5!C$heVNlqe2)M?aK?s(t;zn=SE>W3T!m`zf^`wMjW3mM=X+B~KvYDI%N{*)V=(k4-k`ummvt zH&O&los~wI7$cFJ7Y=wEK5n0K(t5zECK>ekcTr@}oOobur*#<^bVC#*FBi7y5eCic z4d5z>f>~s6q1)yQu;>i;y@=kKjdGY~dmDVD4I%O~_UOTBl9K{9&>y8|h3jGX1cm!K zqe|@JY`uUm48mnA!oWAjw!mwfoU8-bF?48*66U3tk=R;#4p6d;rO(Vt2hdkHVSytE zY&72C)Zuv;Tjt9z&?0T^Xm0xlf16$)lI`_C2x)I@2v zA>G=pb=pkiJ;zy~_zjm20uyuV-E|j!(YQJ|ykAp-SO7y@L-wg6rIKU1A-`>cRe<_b zX2tRYCbA?K4D-c3>mBO^O`Di;#eKqizPyv-p<+e=%bi2|j7*3PLC3M5_o!0p0V<{f z*~LP9?}2+i)5<2>ch$mPs8tPp^%g>fcSaIF0~fY_@-K4-Tkasbe?3vt0Yj@Z?fCmdCLCEdKtbOb7i4q_3v>aMy(@o}WWkJYZ?IG_I}ABw&258~@d@cTaeD z!y@u&3_y?aM2bq$2#&nB^vqa=S)`l|4BEx7Ews4LU2%os=RQ{?tgXwSdx3=I%R=_8 zAK)2HPS`@f4z(0VzWiDCx;46gsgXeQH2v6fR4M@4sr(r{5I->Mcp`exi;y+x%{Bka#>q#IQHwU zw2}Z#9_s{wyrbMRREZy`UFNH4=9)?`d!@6D-`DrvWoK#Mr~ zJEsEHRgqfeRKU{d_&!7ILHS-`aLgwlu+6@;b1&HhF~Vf~=LRBN4U9ThdV<{w8Pfao zQoU;EJr^U+iR#3GL`w9G*avVlxDz`-R~GDo1Un>%sumB4;(ec=k`hRVz?#hXk~LF) z&{=<8cpD#jlT)t!u*ydOK z5TOADKd}#@^|Z7)Y2oof=DFk;rOt1)Zikj znsinpufBq6EryNLLeDnFK}lR?8dg%)>x_|5i3F0+N4HZ(mY$zH>Ga0+FMaP!e#8JB zQ<~ESH1Y5$W=q`WkW}DS^=!OI_Q1xy1_;PfmP%jf=v)$pCm8RdxJ#i8bGCo)wmT$t zvgzn=li#63w-UV7(Gi#?It0gw1{xiSY2w7a_r+%;{)sc%%%LUm#_yA_>cBfowqI#< zIq^KFsL%Fig(_m8`uudn`T`S!@rBt=Hl>K+135pib+POQ^^na?DCHe7@_XT`s&KNF zBqbPrJwIMV>+fAl8ZDM2hbo2TjsE@WCt?WX2xe>$E?|4IiVPfs<*Tu#2+XWPckSVO~14N8mTms zPAumxN~DFUFKJ2GKuOw+7D}XpQt|s3<|1<=fd3xxsInv6X+)EGC`)#iOi(>i( zv!qhWXIQfeOF|+zXHuAlm>!`^$NeW-mD!>KfMqAisTx@Bwf<_BCdG~C{l!1{ACwqS z%~-kX@u8~e!&MKM_kS9Iz5xKByreh5}U<6omUB!{NK${N2ig}F%*ELE?mXF>~ z9&mHo4ZOas%EE_!>H*9YuBl*sk#Y7<{CV8rR~)%+26`RtRIb)i)oari^kGe{7o|H1 zvKWh7zpTF1B6u?bs4dF9!mYlAw;{EyEVOTZiu32eU)giR4HHhAaaFWdGuIAp+4Rt4 zoA&Pe#N;K>eyXh1G!M`HG|kZdNFr)Xi`DGjZg}VM^pgbe=NJ}Spo(!K64!?}KSjjz zx|zbWs1n<5aknNo{E#nTyV2e6<}AlPirsZ3=N<;jV`B(8q<2)_K8N@av3zAp_tlTq z40P?Kc#bHy?g=_RSmS4?H3%I<-I*~ZhZdzMU}l0cof}83s2@0J=qGRxF%~)vT zz$z=Im(M|N`)BuKQ(zpAwb7TF@CrMRmakZ_h6Y!b;Th0@I;*WxqnyI`(b5mw!aA&H zbT<>q$tP}+ohwJ)TGkfY_|T6BtkDIeH1?*&)IV9cCuq*NYX8{dhm3}=%jwRal_UvT zdr14Xs{Yt1PZ{`^%X73EwlDPOKy+Hd8hGP#u5TAb$Yyx6!mps4z|ehL%JfT55d(%R zBMF>v!O6Cd+ZU{lB6^OkVl+sH8>AEIIA;5N@zExVqnRsv9;I|rO%+3IASCybEcpJl{17 z@;@ZhO#Nn!%_>=Th5rcCqOwFiz&V-_pP*XhW zc|>_@j6cm2Z4K6PZ8gAzDZ3nS?@icja7`&-!dUz*p^((R&x~c^;x$jUsD7-}bS3+0 z)__-hSFk{7`$JY`#DGd!ir1DVQ<1RR*kSTZSiKH$Ju6jD2v z#KeJ+`S$GGih+=G4ve1wnS)9W_CT&Zb?F68S`Xl7M=GLD(6Hk716uWwW(de67LJ&q z>jB$PpSh?Tp&$dJO|hF;`~8LX#@!qofhI?f`6626;k-+U8t=f=73g>?UMKg?R|DO8 z{nc4O=1mPP%yW+yO@k=y)YjMJD986`Lwb}CI5cTo$42ogPf!{SfY9G}C~e-0G+_ zx-L2NccsN^d~jggyVgh%OlcFNGc%iX&VacHc&Q&QL|89NI7T4B^1FguILns=FOcET z8uP?2OL5-{VB*@Kp;Ig=Y8z);Y{vaOVivjeD=4tE`51@gSyFwZ)7 zegx3l{=56mG?W@GlGZ3|)MFG%vhX}W5o|P-FjBncV$~`PJZKE?KMa`2`{lGeMp;FB z8T9F(R6a9m2Qoeac_xY|jH*fhR`R{(P?Ko|_A^32=76{?0f{TyR3b5MfbEG#$3cjt zKB>v-VnZab+)2<(xZRQ(IVPrUy?A#bFf+pik}1Zi)8Y9i0#pEx;@Z0gE!0ACs&h( zp|`oOSB#E*ccAA%&+1mwK*&9Q69z4%4T6v8SU_nQ5bSVV70k*U;7G`{^2nMWx|1S# zW-(p*fZ_78gyr-8CrT0CYZr0kdn*@t%_ZUZ3|N(+SiXSda-;)O@X>pPE+fPr`-%z} zSh^MgBX=2y*M0=Wq0vz@NdbJigiI|Pkq=UhcUVw5C-afkqXDjOF&}{B%-#V*{>VDN z9hutcc|pNClC7L(kN$>GYt;DkRTY)b0DJHHc*2x(ChgL*?>m2?2bkCplD!l!{qR|k z5BJs3#sR~p08lTEv(L3*U3&BMbBa4u9&q3Z8q;#6tT>lRZ}r?jEK3Nd0S>$jWH$3;<#zec%Il+81j2P-P}?xy zf#TZwAwkEvu&eI-71w2n)KJ__X3BHQ3q3)Qxw4B;|Mf@5c91g#r&ATC_R^pj&P)6< zJIpy}VC~AG)m0|&NR%Ufdx(Jwu#LQ3qaeh9E3OebYLrTCE|QT?x%iq@vXcvxowNi* z+C%Smf;4$PD-ou^zWcopBBj+;vgXaNpr%P~^$ONpD`o^wgs_HPjv=|j-}jxN^N3H#9gr z1k({&kKnn58bUt97Qn8(YERJ8wuQ6FNP)tj~XkDy(b1W5L3pnbW068QiM- z{$gh1h-s=WiSc_<2%>n>U`7v=Qjwn+gFR9;-l|O`$0KoQwDtIK<`a*!cLkR0swD!l z8*gWRc8+&HOKD7M7WbS40gK&MzwY?H0?-|FYE_}e1F>cUlDis`&3_^Z>F|}#SM9R? zus){dvD3Ezit!AVl?nZ}_4by-dkQJI`OFbovMFKNl<@1H&TosxZM${J@H@amP(DQIXsTgn{u&C2(7 z9PsonQGPXM8aM7vs$<<>1{nb z3H1QyBGi~0!1KSfcINR={(rx(>?P7X9ew_X?C9Z4cx<1$E{eHh*&sV&}Q#O6^ zwXi4lVdFWpj?j&H+m?>ZY?aS)iG@rNd=zsj1O?iRfjH#~9-4yZqf$){QZ$eYH4XZdm)NNb`XAG1rOmiZfzMUYjq%4CL-9|Ww*_U0`a$yuB4G2-9OMYKFE~9&TH}fIMidd8fck!B=jW&a~mzKi8S z00+xNQal|-a;E0AyEmxkk#RtIShDPS=JaRihDj$mVyxNDu>MxK#|U#N%zI3^xEW`) z3Z4GuA?hdh=z!#0``duZHvTZW1>HLZCqDmd`yeh>djl-$F39d@-2$yz7c5*$rKc}~ zwE(&3z4J*_4rJ{BSz>be@+jZYMX6iH`P)zV5RBl~%K@~N=P|7|%oN>F68G_TD=CkQ z2IiO<2==Hm`m)6Xt_wTDOdE@@W#{Iqx35ZDV7vH2hAOm?-;^-6aIG=5xYcETd z3+U>VmN(N`UbTkxlgz17$H6w(xgxpVU^JCgim6R)KSjG^*O44*f2+;ilnG4dN~h*K4}VC`pGSV3re<8F>sT=mqpI%!6{929UU8T60*|d2~ow3 zl91r4T1EGOzOkR%57C`^+i2j$<%`2BgH~fnJ=F6a$BPQpR=;k?WUsO7NsnKb3 zw=QO+HFgGm;ixV8@TNQ4{tTxIp1ECK2J%MBWpCV9f|2YQ75h`5Xf4_&Edi0B z7%{g5YOv}*Px&MOy;&Yaud;a`xjqNQ(m`v2aOihCpVP~NW;xENSTzQC)5;OY+v80L zjS(wo5Y|zJdBCocK%vqB?NI+ct$&Ad=d<`~tfipPLHr+E>b6FwPuiEUD?jK$MX9l= zHCe0?bLh>7pWnf=^E>cx*A@nc73atH4pL1>JpwY)PlhHhM0Vi&*NZMw9t2J&J^X5aQ#9JHElHhCA$vAWZzx8|k2% zSbDOgJl96zZVJHXSOlGCaEQ4S&8g?RK9_#pJ!6Wvf*Wu97jflVXnsYQGLoARAnN?? zD(6HR#va@ zsOMU|Q+rv6g58wwF$0?k^uZU;v&qV^<)BF}PhM~SIs==$;&aZ23jM0m5(#hEntuL@ z5S1~1 z(U`+%_Y1Is%K*j8?ZP*f4QUYSM#TRhCfQrx)%!yW9O{uCpCLWwFmxkRn-9iQEfv_D z1YuXVOSTsYe&mdNhut^da?G^5dtN|_+~^H4NeZqnQN0`G34t1lMeRtM zs7%ur?am9ELu`rysY7!# z2>iuW`!`h-e+v!${TMl+_X@Q(XfU6Sm2fhjW;_bVcX-+)y4&!>##{LlISW#`3!F^0Q4^bz#v34S zOrAVBnI_j7B-4iO-~Q~W0Xbm^Qo;A`Eghk-MM_ptLLE9?d^9+QZZ6&VahFWhy2dG( zV`orXdAUW%n0u@5_GV(wXZN2EWw7I+6AM#vh~g4pK-E0>Y=4}7Dq7#S^-nZR!?-JyH(X^%1T!R5>r^pd?z;$-V=Sx-O=L49km()LeqlH9>M=0Vk`!>-Kp z+#b&8MzNpo=GMpOj?gxizeekYysbycx95{JNtCSnSMQpRc zN%uIv*M_+rJ~@)iPfEkNFjyy}K`Nl#P91>x^}LIn?IKEl(ze;+bhKKkLK)QHBS)xVdbSZ7ZoZn?CQUDlIaQV9ImOes0saCUrkzoDl^JjT~35E~@&ns;?M^kx7CqV!i(QCP_X_|Kj=a++sBgs_AXe>VY$710BP1XZ`Hxqf4*}$q5y? z6NBSZ??SsCwlQV&$`N~G_6GZ2U!}NP-ll~VFb3}iZv{!^U;7A|4Y3Id>sQH@ji{$LK}~6yn^D!n-3xFajikF^1a*ZGwBwk3qWI7kN?!o+IocB_K<_Q7*ExB zR#sJ|ZAJrgRyj|0Shrc&m~SJTM;k@Oc^eh&nA}Jw7H2dnE28@wPNK0 z`qa6Dmv6fJDrt@+wDXm`K;O6~Uua8uXtZ?p8UyYm=c#cA)EPvS&k2KLQs z&);l)jlOfgCFr~EpO~B7SL)j6rf7Z#xwr;fR2^33Z|uGb6?X{aDc~k#08Qy0+tj{! zF&Ir{RjS*u=AY-9zE_pBaz|<3ze&>fl=Q;t=sL(*?)nj%Apz~Ydo@sU(CyCKa~q>7 z99|c^1b8~t7M*4fsqYJga^dC@{M;NS`y|f!JQEKXi4x&ej zcPHDFvD?R~_vahmlmM@^yXD2h)8b-U1U|1;Cgg!FJmd6id&)=~0^p-(*dwE_xZA2H zsv@~Z8a5>QrgwzNk}(jj^DZL>-;rd)C%lVkM9GJ5D%S!-3;Mn`3e|ZarP|PC+Ep$` zv0RF38A1Mt$}nDBso)D{hKfDx5x%5Dwf5DELbjmsdaSUd>)V^O#3NSc=?|FG%B#a1pC8m zci$EVXQ;~BQhC$D!8z6#=Ol*Oy^-B5Nqzxo#<-&1c`Pz4>kparPB{O~ z!{9pX#S6v0_0Bu+I2sSOuR%XOdTW{%q22OR4-fZ_H236KRSuqLHDR%1{2N zj;`PBOjtf*HN5}9{FYQeUFJN+ihaO>NN0{qHU!%ai-D;B{*_XlDbNTnI50&1u~}@o zNM9YN(&|$#WcXSt%h)bHHaF5nK1(F`UEhEf?3+c4@6+yd3x4nyji_rSZbIPb85dTo z+^p)u{S2lwj{~OD=K%rk*Flz}aU<*ZfJNbPnwW{(c(Za9L_5oK9#-Sf;8iOi>er6Z zB{j29yO!x_by8uq-lUyV3DWBv)SQmW*jl!~mzjf#PDU5yeA{-w!aX_v z2I0dS_Z%0BL(R&;aG%`yHZs&B#lkT4anU`=Rax)IG2w@&?4%p_w=#;sPo2Dy06V4h zcNc(jV(i6XS~Z}p2%7)dUevHZ(YsGnvF|17YLlxFr4PH}Vq3IP9~8fxI117$!Vf61 z2Ark_vD%KJ4yiSDULjF8>|I2DXPo@=ZYMk|?A6l@@R$Kg5&`CM7)kbnWX7v-&mGAg zTgfNDjvJr_t9DcGDLa9t+$dM}8rn5)z*SDUKU^+UESE0(AlWI0i^{xxs1c``t|7^w>npcUs_Px$bhc=Cp`s%nKfqCKF}=$%@kx zNaq#Y4-u+-2DVN(o+AT8&asYwO>PV1Ie!V=b!fRbzz%!2xGy_)JzNz)G(&6yh1OzijHx+#la^z;=~M9s6SATY)NtRMIu zmF07P@F+oQ-(jW>3=3?+`7!`ZN#^p`pke3P@S8}Z>p*{E$4WZ&cV;Dc=HAhJRRN+T zeUyqU(8`Nu;?LqoRy)Ce)~eFCm9`ttsqI$4RY%G(wgh>M)a4dp&%wHBj@gWP%R%yr zLuy#&e4J(O3)}#0D_W~AfbPe->;pHG_jx5|z|qjeTR2I1Ee4Xn@fF;0)p z-AuZ1zj>LYx4RrieuP&1u|{ zHkgGQsiNmRo%;n$NRW=prn7>ViZm{3REzzRwEU#A%uut>C)>51+jw}V^DLhn#UdsYKxNIWFd1dTpMqF%} z?s{jkB1fQv1~v6r^zQChGZWt7PTia=2nA*k!6;(gdO)%Yfc`5#xjuW(EyY$MReTl0 z(t3NWeS*G4t%Y0vJqRrIXN@rB;hIk*XfM6-Z@N<^732J*$5F*~@#m#4D(id>KaGG% zBq(&dn{>Gi^E2vDql~=bsrNIq#*wk=%b|vC5Da~%98M(V-AXVSJhza3x@16)i?ntd zx?w3-?JV&za!ffsFXX6;7CDj(C-!N&t^2hw0bkALP=)0FS|Lz-jmTtjPMz2uu0r)__>`k3Q~Fpv%|Uju!;x3O{C9hR1$?C>0sE zJ;DizJsKMpS9)h&DiO6^5BTr(f!bNOmeDO`zV0+mYU+hwl`PQvMVhH`*Pqe~AujVC zHZz24PUk^4kXev+gSvSqkmSiJbN+-)0ze)7fVB?=%B5RMOPwPP267BTFl%Ij+uEiMT9Y%uF=^Jm{dF1BY0Mwn{~E z$KJ=WoU*b#8!ASxF0H6p4bc{`Njb2k^8`edsR1$gJ5fyiysp`)L@n>&doPm#8LgsGwY^< z9VG}i9t$13mkLX1$!tH}`D(%s zgpV`f2!z#cUeyqs7*YzmxFdl(_MorKUjZqP0NYdn8U8#a@~{=I{{G+4B8+?67RsH* z;POm2a^xebjC2@`f~2)XH|fTU+82dEdPl{kJ?j&=`n2^FFw`~0jSEx$q{Iht!zu!K z#HfB!-pRdti(9$E!q4qn=sDauK6VjQp;q1#dyACI067AnA_-re*UfH|-qF@n)OQqB z5LnoA;H_{e^x!G-e1(}p*yDUS# z3*CSh7H(~W48masvgGGPoRoz8<_~v2HvqM{W7B5~pbAWbJKU9lDhz<31^^;HI9jem8Z5sGXqz8x2NTXLIprEyX%}@lr?{oDkvl|=WO6(tMe7s)AN5IETjos^KFBvPT1zwUh9aU;2Pi?#eT* zt;!t-aE&|dUSmiL^g$H&1m|V1cQ?+8w5J_~4|H!#%M#N6;_;#NLpR5ghF} zfKH>Q>PM+-#q`Sbr_-JL&c}b!S$kejSFoKrR^^)*C<(_+-{F{OAx%!hVSoBSjpS|SgrsQ|zybH)0 zGRhV9Z|8q7%5n!w^5Wi<_nh+#d{#LCAoc!y)O~so0 ztr%Kz^v;UlCUoeFY@!B!(>)7iAH2iAQ~a zz=0B@X+0fmC5e_S1ic9s*)h{oQL^sQ8kOMK+`_?VSpHcM=UeMo?T$4Jcn_xZ5`9`o z+&0`C6P}>*26L)m68Col9F77-KQrgKBe9pjB?eaL2ahXnhO}O^xc1)KUy;5t5U??P z3Jejf>ZZ!H`(R1K8$H#+3!acS%qqH9{@gTIH&w^0>i>(oQJx;fEkfxj^4QeP~x-Ki)R;#|nJ zF)w=`Gvm^yn-NtEMmuV@%wx@@QwVVLGDY4j3o0FCX@z%YX1_-G$+hne)~wCn8~>3R z6}M{oeO}6972b=74>y16%#iHFFNv#!&fnANQIOWih`Lcjr$Y~uV{l39xQSX@&FPC- zZRZ#}66p&RUYlLh80wyWzaFijJx&Wi)1r>;Cw?WM>^OJy^OT3i+uEes7jb!{40smu z({qu&#XPN!r{GzZ$Hb;yhMQz77?K#G4HmHKo_w)R4;Gg_8I6!R5fEPIhX4({jQnqt z-TC(_+&%{LC*bP`Ed9S-FYP;B*S=m(61`yxF0d%wz*2?D zwVV5W*D?;?&!RWmCHFBO35k5fO+=#+f_rhKrM;H12Q2i7k?+n+v~0=}pGYjeXAIcp zV_bxwfO{?{8z|X~H%!d_e)FuV;1adqCK$aK&>4^AQYPiKps$Wxj|WG<{42+w4*?!B z6i4Aw?+~3t0O|}K;zcU7EMm~sciCwWql~e}e{?+5ER(8P+m3AS-(;rmbXlS{wXVII z(?AP*`;2nMxGIu290(HJoHc2u=a7Chv+4*UBf61$g_ew&2nMi$LV%iL+OS4O1p8ts z%Ys1cNtr_fpM@)8gp-$181)dI+djrx+F<&@lkQQpGk^=5nQ;>(aS8mUz2c|u1NPI* zoDDw_)#Z>b+V>L(d+t^F*J$EAwR^cIS`V;>?7s75$EPo(4OWLh0OxFPK_kn^vDeCY zw&~VK+laKl*8ZD@qY|+5;Sy|hL)m!uS3LQ7J)q<;`NMWZy8tZYTz#?anc0H5E4Fhs zkKqW*nFq%fiPlm{k*(<2&jEr!0BWw}P3kC`{YP)>Zo|VbdIY9*P7X0gqpjTCwS;5( z?t{)`I8wgV-)<4Qk>uB-r z#)R9Oh5hFtJCM{xU$Y9)lf{+S^4%Ig=4&b^3ES_kjnf~2K4PWDHV!HAHr8x={BmCX ztxq|eA^{x}zUf;k9o6@@nARY}MeR03xs@GPePiw8Vb{^Nc-J;c(~CS*(Mz1 z{M=2IbaYm!OVDu56i>@Y1x@6`4LUJ0j8g z8o0sGY!;~R4oE7RTu_p=-q#NyD13_KqKQ1F1Owiwhrq1M$;3T>kAaMI)M1qat{jvkj9(X}(T#r;7oOc!nMBN)dQ0}e3N$B}2jABQa!>%r ztoXX=wT$Z`I%qJR1ew*P!dz3Le#a9&Ge3?qS?dW}D^;TSIyaa5M$DwiWf>|a92=JK zq?u_WviN7G1fa_GfDAF_i~DE?RK^0tpg_Cf**RFtFV|XND}{k<%0R-z7M-8NHqlwi zm!A@2>W{1k6roM=FD%Th#8B7H&J~E-=9!8|B|YoOU{Wx-U1Fy8Uvpu!vLYQS z(i(826Z?|b$5tEQ#s{Q=ikC*;K0ul;Vt5&42VL-nqWhReYV|B_KDX}aD4LqD%`QMu zns84=8Ei;gB5(4j05KmAHmek5(~HAw-pM9To^pN5o`s7%6|oSj0s!1E899zRAVNA5Rvu*Ee(8We9v;9((h1*RA!<7npU< z)X8Tpfdt!skV8X{Oc#QnL@4I?c-jN7Dedu`T+E#Y$_~yp5`kbJ(kEtY0esY$R9j&) z_!OqsR0)=^MafE~F#@U=XCS2d-SLV;8bdb(77>z7UES9pKn*gFEy#Y>-EQWN{A$j{ z*9RQsK#>rcK9=L8f@x#{D>^%F`V8aY4LEUKeaI47#$I8<56fze13niT4S%!jCr5$+ zKA7)RWA+fRb&ZnW?)wY_RZXBdf;MBosXsRr!SO%A4t-kuqW_Et^k{+InD zQhP(vp<1>Qp_qO)2E2<99^R@5`dLd7L|Mab?nh0Jn~TD(0j|`D8sJt_-mb~lvP~qY znZe6+Uj#WnW$ujg;IU+_W2<|0pFRuOoN2p7kNiG>9fGuy>=3zAD1>&Ee{Jv+^3h%z z{Fv8jk0kbYVn zF0?aqNEPRhWJg&V#Mjx+6TkC)C~!AUm56&~jx?w-ZJfjZE=}u2KBC75P#^1=qke=6n2?yd-;^xOKiy?6z~HG|La~1|-Fn_3BwjT- zXwS{3$69i~gIDI8qHqPj5p4mnFK5sucC4=*Ry?t`C7IV`Ooa9S(TnCp-N3HR&N=sS z@*X(>m?CI6q*Lv#5eiXeA&}YgqxEEnO)<0D5{qCk0$?O3>-cHJexVt&%W}V=K2Kv` zqVBCwx*kM!%p!^bDxN7WP;>e_QiS~Bp~ydOt&Ni~Om$B%es_kd8s73mwEbM=BKzW9Id$OG+p?dVe)o{qSzQWJqgi^h%fWXBUt^Irra}CL;jRlVkndz|d_`{d)_#p_5Zfp2i&dedZVr^|89%Vm~hYMD4_uC|!K# zt)6d+k>d;Yi8CK07B!Q#7+(KU^weS62o*^?IR#U0U;No?RNI}&I^13D$5)RGEEQ8a zu62vG0CPpQjRX~EO#c=36IIM;UH7>hwJ8ete{fXv57NejRepnPW}McN=|75O;ZE_!<}_sFZ_q3vTl3%=x4=xDk%NP3H*Ll9VBk5L)2X3>}^(y9tzaf|})%EKw ztJd7s^|8fWq7?F8oQ1NQxX>|D!-SwBiPx}^a`qBGHIU$q5fw{-Ay8|F(k>Ksq ztk?OWWFf0EU*u#@x5N&b;3DE)fiJGW9LpJAM+7XU{~Jq%4GBIuu@qH>V3I6@E|BjZ zb-CtlCFq`3@3!F{?{ZGQ0w60vtqVt zhXIjckOd9>K9;lZ7J`6{($qk4i^7T>fJa)?tXa|%2s0>(9e5224N<(qm;}z&Ck-Ky z{5kr$aqqo5mtcqDxFXPw}<8Hx8(hS1?1yQNJbOKTN zNbvY$Vf}sXfvan8VOi8u8DR@Fpgh83Y!da67}F5BL^kA#Bj8VPX-KueTht=njA9r8CmkPaDFYM%S85zeUr@Woafov%fcv=x zpzSmEKhIx5=^(pfGsWf3X4pS}YZJCcVae$AL-j zYDM-Ege*<}y!%?1rF=~t|LeVn-hCl+5km!!O9tR>plSU$DdogG{vuc6={$Vo-Jq;9 zeYs%|p?YI!zDIEvA@K)rn(VJMDx4Lyn1>ftw%+}($th&580E{0!ra|5X7#qZV^DPE z6p;qsEHwqC{s~oCM^BB3*-?y|mX6KH&v`-^$S>_U&yCh?{Bk#CC?l&1`9v$Rc_q_v z5ZZ}&Ig2oFyWAl?p$)$zP3We~V*RItf#pzl9*NHnAwKoPsyfFDHqC3df4ZkSRV1HA zgO4eN7xnNOjgit*5g-Azq96AArC8g?mDxQEVJA&0Hh!vDq2Y>nBk}Z1r-75~L3Q2_ z34eSEDTcM3z0&}?(JG^n*r2#{g2-TBIlaB|!dAJZp;S#Ma%1!am2x_Ll(YfXivj#q zsYzeG2y2jWiPO#cB-A%l39bri^^8qk?T^QfHzmAUAOYE1_I!S&d|i=fBl zTpTj@l<-vV3cSv&M{(iJ*@Y6zO%M?H-(jdMqG16iK$Z7EFn`G+)DzQ+z8MN;Db>G= zhl~7bfOC0@g(RjAxrzU!i^KIEIdRc!F_0Cn{{f@p9f!Zv5x5#>3F<*MJAlL1hFe+r z9qnsqXFalNV}Xh1sIbKf%S*Dl{6kK0Gb5cCGEW-^=iOiFDhpN5$p0Aq98%DHG5EYSXS>s`7O$4!Zr8R?p zDacwb@#G8`%}W+ch~TU2520|jnsp9<%{W{1_y_U7&rHc4U}|k3b(i_hzgPGb`4#T} z0LQvt_8I91-SCDyrm&pH2VyIRA2)BERC(^z!(#Ux-T~H9)zf#t>xkf;N7qeAj$HY7 zY6`F1EpBj3Z+h2F*8%u!|JDb9@W50AMGh2h@-PRhQvqWYA2FXW@voQ7n0ovY0&#r! z=drg*AZtb0D10x$`DUoE7g0(0i~8ORThW{maez>%xFmkD8tkQhjUA`a_56MqD?xlT z<}JR-b2HSZfz6KIq)Ne%oRB+QM3b9%S%t~AlWC){{grfi81pY#%V13)_xAl9psR0W zrHF|q)GYnL!#6rZ-uJ6x6qPc8F_vLHx-!{Q ze+3^s;P9(*<5D;|?puZ#BO@~`HsM}kxtF&3y^gCzhTx@V_b^Iowv?qBHbSxiLec~t9cn+-0nEHlxp)% zdwh!oXiP4fzczDiQ3T0}Q&Ry1qv_6J&_#@NT}KxNUVhFP{JfbtYZKnqe74KmRuu;T z0ez#7q-dm1M_vt9@D(!W2wbSY=z!XT_asbcNzwT7ibZR+l%`N?V6gR6qka$)kl?gD zo5canF@Ps< z^JJIzAJi0Yq%cPmYr2MZpI8CqAiZM&5U_LMl}s`|UGGKwKY>#&En>%x<}ejxIs zwC2sCy#h%8Ct^w-X8ZN;Cw#k z@W2u%v%f|{&Rk#z3hGz-NE|CbUo6>*%RQ_3N#AW6lyl7M?ShQI^<4X5;Q-x#7nwqf zMEGJ(Z9L&5850(Dlvv=eu6vd$=WQ&Fr8Y7lxp|f5StBN=W}h>Hg2gnbSrH)iqHcg8 zbAw&H?7|Q8T%7*RK~xB&3s_ z>FR87LEhuuW&=CI2YjEj*U~~bLKd(1Rn4Jak2k}Sh9Nsq;PI6!Dql$p^tZ%o9OCiL zeFK>Hkv4r8&={ken11eebaXZ2q10j)RF{YkdMAivpEW~9$Z*;}S{YIiX#o>+o%K}J zFvs=zdz3YBB9BnULj@Y>@^+_`6_ApU*zaB`wavYQNCx@V*^3av`yM-c1=yEP?H94B_7o2{A>LYP+Wt0*q$c zd<(0kCs36}gNt(sU-}?$rypNd=ji7EHVy1eP5r9)SsD#Q%_ESo=y9v}6ksr@N8NTa zF8}@r;lKu4ajgIXwg{eoxAAW}b1Batu=fJ*t=znU!Hr_jl|$;YoaUe@T+$LM;OwAh z`G3Nw?AagIhDa8+usg}(xB0R@ILeklEBRZBK5!xg8WXwHN2H>k59+ZoGr&nM?@RS< zipOJJ*?^n5>y*LxF&(HidyQ*&juIACX@4S@SE&%+kPzQyff!Ix;|{(fw9I3F~g+UL5e88!T|l zdN`7r$KB*zny^{D8s2i?%-GQoLG?Qc?6XG3@4U}`bj9rRoxweliqbXE+vU$;MS9;6*o3 zYxe0GvFM?s09VBW2`6Jw(XD8ReuQ#22xseeDLY}OP;~>6mWL}*&-S@FH4ZoC3aEDZ zV~rhfV6?7=MQwQqF0Eew5d9bou3ct8(s=(&Wwa)|Bj8Wd;rkN^7IPH+!!Um0mcw<> z%s6qtrvnZfU)oh6B)rfEZ6xD_a}Jw146Q&R<``2T|An&kW5^K#!eH z3b~&9VH-Tt8KiN8`w}@HZg3Fhe{{oBtthctz3(|m+&zFo_?KsW`%mOmzP8F!;E$Rz L@?OE6XYc+8F_?7_ diff --git a/spec/proto/extension/v1/oss.proto b/spec/proto/extension/v1/oss.proto index 3c3c55335b..4edc4fef32 100644 --- a/spec/proto/extension/v1/oss.proto +++ b/spec/proto/extension/v1/oss.proto @@ -47,6 +47,10 @@ service ObjectStorageService{ rpc GetObjectTagging(GetObjectTaggingInput) returns(GetObjectTaggingOutput){} //Object ACL Operation API + //Because different manufacturers have different definitions for ACL types, at the same time, + //the actual permissions corresponding to ACLs with the same name may be different between different manufacturers. + //Therefore, applications using this interface will greatly increase the complexity of transplantation. + //In general, this interface is not recommended, especially if your application has portability requirements. //Returns object canned acl. //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL rpc GetObjectCannedAcl(GetObjectCannedAclInput) returns(GetObjectCannedAclOutput){} diff --git a/spec/proto/extension/v1/oss_grpc.pb.go b/spec/proto/extension/v1/oss_grpc.pb.go index e85c362a6d..325c6d6677 100644 --- a/spec/proto/extension/v1/oss_grpc.pb.go +++ b/spec/proto/extension/v1/oss_grpc.pb.go @@ -59,6 +59,10 @@ type ObjectStorageServiceClient interface { //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObjectTagging.html GetObjectTagging(ctx context.Context, in *GetObjectTaggingInput, opts ...grpc.CallOption) (*GetObjectTaggingOutput, error) //Object ACL Operation API + //Because different manufacturers have different definitions for ACL types, at the same time, + //the actual permissions corresponding to ACLs with the same name may be different between different manufacturers. + //Therefore, applications using this interface will greatly increase the complexity of transplantation. + //In general, this interface is not recommended, especially if your application has portability requirements. //Returns object canned acl. //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL GetObjectCannedAcl(ctx context.Context, in *GetObjectCannedAclInput, opts ...grpc.CallOption) (*GetObjectCannedAclOutput, error) @@ -486,6 +490,10 @@ type ObjectStorageServiceServer interface { //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObjectTagging.html GetObjectTagging(context.Context, *GetObjectTaggingInput) (*GetObjectTaggingOutput, error) //Object ACL Operation API + //Because different manufacturers have different definitions for ACL types, at the same time, + //the actual permissions corresponding to ACLs with the same name may be different between different manufacturers. + //Therefore, applications using this interface will greatly increase the complexity of transplantation. + //In general, this interface is not recommended, especially if your application has portability requirements. //Returns object canned acl. //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL GetObjectCannedAcl(context.Context, *GetObjectCannedAclInput) (*GetObjectCannedAclOutput, error) From d7f9d1ed14dfa6039c7a6a9e4251157572574d04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Thu, 21 Jul 2022 14:33:10 +0800 Subject: [PATCH 109/126] fix comments --- components/file/types.go | 1 - components/oss/aliyun/oss.go | 1 - components/oss/aws/oss.go | 1 - components/oss/oss.go | 25 - demo/{file/s3 => oss}/client.go | 0 docs/zh/start/oss/oss.md | 6 +- spec/proto/extension/v1/oss.pb.go | 2464 +++++++++++------------- spec/proto/extension/v1/oss.proto | 73 +- spec/proto/extension/v1/oss_grpc.pb.go | 10 - 9 files changed, 1122 insertions(+), 1459 deletions(-) rename demo/{file/s3 => oss}/client.go (100%) diff --git a/components/file/types.go b/components/file/types.go index 8e378375c6..d9d20ae6cb 100644 --- a/components/file/types.go +++ b/components/file/types.go @@ -23,7 +23,6 @@ import ( // FileConfig wraps configuration for a file implementation type FileConfig struct { - Method string `json:"method"` Metadata json.RawMessage `json:"metadata"` Type string `json:"type"` } diff --git a/components/oss/aliyun/oss.go b/components/oss/aliyun/oss.go index b5dd7f9ae5..2e859b8d6f 100644 --- a/components/oss/aliyun/oss.go +++ b/components/oss/aliyun/oss.go @@ -28,7 +28,6 @@ import ( "github.com/aliyun/aliyun-oss-go-sdk/oss" ) -// AliyunOSS is a binding for an aliyun OSS storage bucketKey type AliyunOSS struct { client *oss.Client rawData json.RawMessage diff --git a/components/oss/aws/oss.go b/components/oss/aws/oss.go index 909fd88638..62bd963a26 100644 --- a/components/oss/aws/oss.go +++ b/components/oss/aws/oss.go @@ -41,7 +41,6 @@ import ( "mosn.io/pkg/log" ) -// AwsOss is a binding for aws oss storage. type AwsOss struct { client *s3.Client rawData json.RawMessage diff --git a/components/oss/oss.go b/components/oss/oss.go index e069956b64..6743286ff8 100644 --- a/components/oss/oss.go +++ b/components/oss/oss.go @@ -63,7 +63,6 @@ type InitRequest struct { } type GetObjectInput struct { - Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` ExpectedBucketOwner string `json:"expected_bucket_owner,omitempty"` IfMatch string `json:"if_match,omitempty"` @@ -112,7 +111,6 @@ type GetObjectOutput struct { type PutObjectInput struct { DataStream io.Reader - Uid string `json:"uid,omitempty"` ACL string `json:"acl,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` @@ -133,7 +131,6 @@ type PutObjectOutput struct { } type DeleteObjectInput struct { - Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` RequestPayer string `json:"request_payer,omitempty"` @@ -146,7 +143,6 @@ type DeleteObjectOutput struct { } type PutObjectTaggingInput struct { - Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` Tags map[string]string `json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` @@ -156,7 +152,6 @@ type PutObjectTaggingOutput struct { } type DeleteObjectTaggingInput struct { - Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` VersionId string `json:"version_id,omitempty"` @@ -167,7 +162,6 @@ type DeleteObjectTaggingOutput struct { } type GetObjectTaggingInput struct { - Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` VersionId string ` json:"version_id,omitempty"` @@ -187,7 +181,6 @@ type CopySource struct { } type CopyObjectInput struct { - Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` CopySource *CopySource `json:"copy_source,omitempty"` @@ -207,7 +200,6 @@ type CopyObjectResult struct { } type DeleteObjectsInput struct { - Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Delete *Delete `json:"delete,omitempty"` } @@ -232,7 +224,6 @@ type DeletedObject struct { } type ListObjectsInput struct { - Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Delimiter string `json:"delimiter,omitempty"` EncodingType string `json:"encoding_type,omitempty"` @@ -268,7 +259,6 @@ type Owner struct { } type GetObjectCannedAclInput struct { - Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` VersionId string `json:"version_id,omitempty"` @@ -280,7 +270,6 @@ type GetObjectCannedAclOutput struct { } type PutObjectCannedAclInput struct { - Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` Acl string `json:"acl,omitempty"` @@ -291,7 +280,6 @@ type PutObjectCannedAclOutput struct { } type RestoreObjectInput struct { - Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` VersionId string `json:"version_id,omitempty"` @@ -302,7 +290,6 @@ type RestoreObjectOutput struct { } type CreateMultipartUploadInput struct { - Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` ACL string `json:"acl,omitempty"` @@ -350,7 +337,6 @@ type CreateMultipartUploadOutput struct { type UploadPartInput struct { DataStream io.Reader - Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` //Body []byte `json:"body,omitempty"` @@ -375,7 +361,6 @@ type UploadPartOutput struct { } type UploadPartCopyInput struct { - Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` CopySource *CopySource `json:"copy_source,omitempty"` @@ -400,7 +385,6 @@ type CopyPartResult struct { } type CompleteMultipartUploadInput struct { - Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` UploadId string `json:"upload_id,omitempty"` @@ -429,7 +413,6 @@ type CompleteMultipartUploadOutput struct { } type AbortMultipartUploadInput struct { - Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` ExpectedBucketOwner string `json:"expected_bucket_owner,omitempty"` @@ -441,7 +424,6 @@ type AbortMultipartUploadOutput struct { } type ListMultipartUploadsInput struct { - Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Delimiter string `json:"delimiter,omitempty"` EncodingType string `json:"encoding_type,omitempty"` @@ -479,7 +461,6 @@ type Initiator struct { } type ListObjectVersionsInput struct { - Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Delimiter string `json:"delimiter,omitempty"` EncodingType string `json:"encoding_type,omitempty"` @@ -523,7 +504,6 @@ type ObjectVersion struct { } type HeadObjectInput struct { - Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` ChecksumMode string `json:"checksum_mode,omitempty"` @@ -546,7 +526,6 @@ type HeadObjectOutput struct { } type IsObjectExistInput struct { - Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` } @@ -555,7 +534,6 @@ type IsObjectExistOutput struct { } type SignURLInput struct { - Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` Method string `json:"method,omitempty"` @@ -566,7 +544,6 @@ type SignURLOutput struct { } type UpdateBandwidthRateLimitInput struct { - Uid string `json:"uid,omitempty"` // The average upload/download bandwidth rate limit in bits per second. AverageRateLimitInBitsPerSec int64 `json:"average_rate_limit_in_bits_per_sec,omitempty"` //Resource name of gateway @@ -574,7 +551,6 @@ type UpdateBandwidthRateLimitInput struct { } type AppendObjectInput struct { - Uid string `json:"uid,omitempty"` DataStream io.Reader Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` @@ -595,7 +571,6 @@ type AppendObjectOutput struct { } type ListPartsInput struct { - Uid string `json:"uid,omitempty"` Bucket string `json:"bucket,omitempty"` Key string `json:"key,omitempty"` ExpectedBucketOwner string `json:"expected_bucket_owner,omitempty"` diff --git a/demo/file/s3/client.go b/demo/oss/client.go similarity index 100% rename from demo/file/s3/client.go rename to demo/oss/client.go diff --git a/docs/zh/start/oss/oss.md b/docs/zh/start/oss/oss.md index 131e621676..fb6928c64a 100644 --- a/docs/zh/start/oss/oss.md +++ b/docs/zh/start/oss/oss.md @@ -3,7 +3,7 @@ ## 快速开始 Layotto提供了访问OSS的示例 [demo](https://github.com/mosn/layotto/blob/main/demo/file/client.go) ,该示例基于S3协议实现了对象的一系列操作,当前 -已支持25个接口。可以做到在不同的OSS实例之间进行无感迁移。 +已支持部分接口。可以做到在不同的OSS实例之间进行无感迁移。 ### step 1. 启动layotto @@ -27,8 +27,8 @@ layotto提供了aws的配置文件`configs/oss.json`,配置文件内容如下 } ``` -配置主要包含四个字段,需要替换成自己的OSS账号的配置。type当前支持aliyun.oss和aws.oss两种类型,分别对应阿里云的OSS服务和亚马逊云的OSS服务。用户可以根据自己的实际场景 -进行配置。 +配置中对应的字段,需要替换成自己的OSS账号的配置。type当前支持aliyun.oss和aws.oss两种类型,分别对应阿里云的OSS服务和亚马逊云的OSS服务。 +用户可以根据自己的实际场景进行配置。 配置好后,切换目录: diff --git a/spec/proto/extension/v1/oss.pb.go b/spec/proto/extension/v1/oss.pb.go index 166b88ffc5..6cdb086e9a 100644 --- a/spec/proto/extension/v1/oss.pb.go +++ b/spec/proto/extension/v1/oss.pb.go @@ -147,8 +147,6 @@ type GetObjectInput struct { AcceptEncoding string `protobuf:"bytes,23,opt,name=accept_encoding,json=acceptEncoding,proto3" json:"accept_encoding,omitempty"` // Specify the signed url of object, user can get object with signed url without ak、sk SignedUrl string `protobuf:"bytes,24,opt,name=signed_url,json=signedUrl,proto3" json:"signed_url,omitempty"` - // Specify the client used for request - Uid string `protobuf:"bytes,25,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *GetObjectInput) Reset() { @@ -351,13 +349,6 @@ func (x *GetObjectInput) GetSignedUrl() string { return "" } -func (x *GetObjectInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type GetObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -614,10 +605,8 @@ type PutObjectInput struct { SignedUrl string `protobuf:"bytes,12,opt,name=signed_url,json=signedUrl,proto3" json:"signed_url,omitempty"` // A map of metadata to store with the object in S3. 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"` - // Specify the client used for request - Uid string `protobuf:"bytes,14,opt,name=uid,proto3" json:"uid,omitempty"` // The tag-set for the object. The tag-set must be encoded as URL Query parameters. - Tagging map[string]string `protobuf:"bytes,15,rep,name=tagging,proto3" json:"tagging,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + 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"` } func (x *PutObjectInput) Reset() { @@ -743,13 +732,6 @@ func (x *PutObjectInput) GetMeta() map[string]string { return nil } -func (x *PutObjectInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - func (x *PutObjectInput) GetTagging() map[string]string { if x != nil { return x.Tagging @@ -863,8 +845,6 @@ type DeleteObjectInput struct { RequestPayer string `protobuf:"bytes,4,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,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"` - // Specify the client used for request - Uid string `protobuf:"bytes,6,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *DeleteObjectInput) Reset() { @@ -934,13 +914,6 @@ func (x *DeleteObjectInput) GetVersionId() string { return "" } -func (x *DeleteObjectInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type DeleteObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1026,8 +999,6 @@ type PutObjectTaggingInput struct { Tags map[string]string `protobuf:"bytes,4,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // The versionId of the object that the tag-set will be added to. VersionId string `protobuf:"bytes,5,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` - // Specify the client used for request - Uid string `protobuf:"bytes,6,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *PutObjectTaggingInput) Reset() { @@ -1097,13 +1068,6 @@ func (x *PutObjectTaggingInput) GetVersionId() string { return "" } -func (x *PutObjectTaggingInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type PutObjectTaggingOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1178,8 +1142,6 @@ type DeleteObjectTaggingInput struct { // different account, the request fails with the HTTP status code 403 Forbidden // (access denied). ExpectedBucketOwner string `protobuf:"bytes,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - // Specify the client used for request - Uid string `protobuf:"bytes,6,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *DeleteObjectTaggingInput) Reset() { @@ -1249,13 +1211,6 @@ func (x *DeleteObjectTaggingInput) GetExpectedBucketOwner() string { return "" } -func (x *DeleteObjectTaggingInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type DeleteObjectTaggingOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1333,8 +1288,6 @@ type GetObjectTaggingInput struct { ExpectedBucketOwner string `protobuf:"bytes,5,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,6,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - // Specify the client used for request - Uid string `protobuf:"bytes,7,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *GetObjectTaggingInput) Reset() { @@ -1411,13 +1364,6 @@ func (x *GetObjectTaggingInput) GetRequestPayer() string { return "" } -func (x *GetObjectTaggingInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type GetObjectTaggingOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1574,8 +1520,6 @@ type CopyObjectInput struct { MetadataDirective string `protobuf:"bytes,7,opt,name=metadata_directive,json=metadataDirective,proto3" json:"metadata_directive,omitempty"` // A map of metadata to store with the object in S3. Metadata map[string]string `protobuf:"bytes,8,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // Specify the client used for request - Uid string `protobuf:"bytes,9,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *CopyObjectInput) Reset() { @@ -1666,13 +1610,6 @@ func (x *CopyObjectInput) GetMetadata() map[string]string { return nil } -func (x *CopyObjectInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type CopyObjectResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1921,8 +1858,6 @@ type DeleteObjectsInput struct { Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` Delete *Delete `protobuf:"bytes,3,opt,name=delete,proto3" json:"delete,omitempty"` RequestPayer string `protobuf:"bytes,4,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - // Specify the client used for request - Uid string `protobuf:"bytes,5,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *DeleteObjectsInput) Reset() { @@ -1985,13 +1920,6 @@ func (x *DeleteObjectsInput) GetRequestPayer() string { return "" } -func (x *DeleteObjectsInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type DeletedObject struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2151,8 +2079,6 @@ type ListObjectsInput struct { // objects request. Bucket owners need not specify this parameter in their // requests. RequestPayer string `protobuf:"bytes,9,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - // Specify the client used for request - Uid string `protobuf:"bytes,10,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *ListObjectsInput) Reset() { @@ -2250,13 +2176,6 @@ func (x *ListObjectsInput) GetRequestPayer() string { return "" } -func (x *ListObjectsInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type ListObjectsOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2551,8 +2470,6 @@ type GetObjectCannedAclInput struct { 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,4,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` - // Specify the client used for request - Uid string `protobuf:"bytes,5,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *GetObjectCannedAclInput) Reset() { @@ -2615,13 +2532,6 @@ func (x *GetObjectCannedAclInput) GetVersionId() string { return "" } -func (x *GetObjectCannedAclInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type GetObjectCannedAclOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2699,8 +2609,6 @@ type PutObjectCannedAclInput struct { Acl string `protobuf:"bytes,4,opt,name=acl,proto3" json:"acl,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"` - // Specify the client used for request - Uid string `protobuf:"bytes,6,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *PutObjectCannedAclInput) Reset() { @@ -2770,13 +2678,6 @@ func (x *PutObjectCannedAclInput) GetVersionId() string { return "" } -func (x *PutObjectCannedAclInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type PutObjectCannedAclOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2834,8 +2735,6 @@ type RestoreObjectInput struct { 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"` - // Specify the client used for request - Uid string `protobuf:"bytes,6,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *RestoreObjectInput) Reset() { @@ -2898,13 +2797,6 @@ func (x *RestoreObjectInput) GetVersionId() string { return "" } -func (x *RestoreObjectInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type RestoreObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3005,8 +2897,6 @@ type CreateMultipartUploadInput struct { // 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"` WebsiteRedirectLocation string `protobuf:"bytes,30,opt,name=website_redirect_location,json=websiteRedirectLocation,proto3" json:"website_redirect_location,omitempty"` - // Specify the client used for request - Uid string `protobuf:"bytes,31,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *CreateMultipartUploadInput) Reset() { @@ -3251,13 +3141,6 @@ func (x *CreateMultipartUploadInput) GetWebsiteRedirectLocation() string { return "" } -func (x *CreateMultipartUploadInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type CreateMultipartUploadOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3420,8 +3303,6 @@ type UploadPartInput struct { // 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"` - // Specify the client used for request - Uid string `protobuf:"bytes,14,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *UploadPartInput) Reset() { @@ -3547,13 +3428,6 @@ func (x *UploadPartInput) GetUploadId() string { return "" } -func (x *UploadPartInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type UploadPartOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3669,8 +3543,6 @@ type UploadPartCopyInput struct { // 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"` PartSize int64 `protobuf:"varint,8,opt,name=part_size,json=partSize,proto3" json:"part_size,omitempty"` - // Specify the client used for request - Uid string `protobuf:"bytes,9,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *UploadPartCopyInput) Reset() { @@ -3761,13 +3633,6 @@ func (x *UploadPartCopyInput) GetPartSize() int64 { return 0 } -func (x *UploadPartCopyInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type CopyPartResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4045,8 +3910,6 @@ type CompleteMultipartUploadInput struct { 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"` - // Specify the client used for request - Uid string `protobuf:"bytes,8,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *CompleteMultipartUploadInput) Reset() { @@ -4130,13 +3993,6 @@ func (x *CompleteMultipartUploadInput) GetMultipartUpload() *CompletedMultipartU return nil } -func (x *CompleteMultipartUploadInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type CompleteMultipartUploadOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4276,8 +4132,6 @@ type AbortMultipartUploadInput struct { // 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"` - // Specify the client used for request - Uid string `protobuf:"bytes,7,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *AbortMultipartUploadInput) Reset() { @@ -4354,13 +4208,6 @@ func (x *AbortMultipartUploadInput) GetUploadId() string { return "" } -func (x *AbortMultipartUploadInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type AbortMultipartUploadOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4448,8 +4295,6 @@ type ListMultipartUploadsInput struct { // 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"` - // Specify the client used for request - Uid string `protobuf:"bytes,10,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *ListMultipartUploadsInput) Reset() { @@ -4547,13 +4392,6 @@ func (x *ListMultipartUploadsInput) GetUploadIdMarker() string { return "" } -func (x *ListMultipartUploadsInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type Initiator struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4878,8 +4716,6 @@ type ListObjectVersionsInput struct { 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"` - // Specify the client used for request - Uid string `protobuf:"bytes,10,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *ListObjectVersionsInput) Reset() { @@ -4977,13 +4813,6 @@ func (x *ListObjectVersionsInput) GetVersionIdMarker() string { return "" } -func (x *ListObjectVersionsInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type DeleteMarkerEntry struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5342,8 +5171,6 @@ type HeadObjectInput struct { 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"` - // Specify the client used for request - Uid string `protobuf:"bytes,17,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *HeadObjectInput) Reset() { @@ -5490,13 +5317,6 @@ func (x *HeadObjectInput) GetWithDetails() bool { return false } -func (x *HeadObjectInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type HeadObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5554,8 +5374,6 @@ type IsObjectExistInput struct { Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` VersionId string `protobuf:"bytes,4,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` - // Specify the client used for request - Uid string `protobuf:"bytes,5,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *IsObjectExistInput) Reset() { @@ -5618,13 +5436,6 @@ func (x *IsObjectExistInput) GetVersionId() string { return "" } -func (x *IsObjectExistInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type IsObjectExistOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5684,8 +5495,6 @@ type SignURLInput struct { 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"` - // Specify the client used for request - Uid string `protobuf:"bytes,6,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *SignURLInput) Reset() { @@ -5755,13 +5564,6 @@ func (x *SignURLInput) GetExpiredInSec() int64 { return 0 } -func (x *SignURLInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type SignURLOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5819,8 +5621,6 @@ type UpdateBandwidthRateLimitInput struct { 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"` - // Specify the client used for request - Uid string `protobuf:"bytes,4,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *UpdateBandwidthRateLimitInput) Reset() { @@ -5876,13 +5676,6 @@ func (x *UpdateBandwidthRateLimitInput) GetGatewayResourceName() string { return "" } -func (x *UpdateBandwidthRateLimitInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type AppendObjectInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5903,8 +5696,6 @@ type AppendObjectInput struct { ServerSideEncryption string `protobuf:"bytes,13,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` Meta string `protobuf:"bytes,14,opt,name=meta,proto3" json:"meta,omitempty"` 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"` - // Specify the client used for request - Uid string `protobuf:"bytes,16,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *AppendObjectInput) Reset() { @@ -6044,13 +5835,6 @@ func (x *AppendObjectInput) GetTags() map[string]string { return nil } -func (x *AppendObjectInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type AppendObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6111,8 +5895,6 @@ type ListPartsInput struct { PartNumberMarker int64 `protobuf:"varint,6,opt,name=part_number_marker,json=partNumberMarker,proto3" json:"part_number_marker,omitempty"` RequestPayer string `protobuf:"bytes,7,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` UploadId string `protobuf:"bytes,8,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` - // Specify the client used for request - Uid string `protobuf:"bytes,9,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *ListPartsInput) Reset() { @@ -6203,13 +5985,6 @@ func (x *ListPartsInput) GetUploadId() string { return "" } -func (x *ListPartsInput) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - type Part struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6404,7 +6179,7 @@ var file_oss_proto_rawDesc = []byte{ 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, 0xef, 0x07, 0x0a, 0x0e, 0x47, 0x65, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 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, @@ -6466,310 +6241,301 @@ var file_oss_proto_rawDesc = []byte{ 0x64, 0x69, 0x6e, 0x67, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x55, 0x72, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, - 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xeb, 0x05, 0x0a, 0x0f, - 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, - 0x6f, 0x64, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x02, 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, - 0x03, 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, 0x04, 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, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, - 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, - 0x0a, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x0a, 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, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, - 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, - 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, - 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, - 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, - 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x67, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x74, 0x61, 0x67, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x73, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, - 0x72, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x52, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, - 0x74, 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, 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, 0xbb, 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, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, - 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, - 0x18, 0x05, 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, 0x06, 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, 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, 0x45, 0x0a, 0x04, 0x6d, 0x65, 0x74, - 0x61, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 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, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, - 0x69, 0x64, 0x12, 0x4e, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x0f, 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, 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, + 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x55, 0x72, 0x6c, 0x22, 0xeb, 0x05, 0x0a, 0x0f, 0x47, 0x65, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, + 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x18, 0x02, 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, 0x03, 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, 0x04, 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, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x25, 0x0a, + 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x72, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x0a, 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, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x12, + 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x67, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x74, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, + 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x52, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 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, 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, 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, 0xb2, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0x98, - 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, 0x4c, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 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, 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, 0x12, 0x10, - 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0xe8, 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, 0x6c, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 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, 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, 0xc8, 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, 0x12, 0x10, 0x0a, - 0x03, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, - 0xee, 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, 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, - 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, 0xea, 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, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa9, 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, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, - 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xf0, 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, 0x4d, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, - 0x18, 0x01, 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, 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, 0x6c, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 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, 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, 0x99, 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, 0x44, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 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, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4f, 0x0a, - 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x16, 0x0a, + 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x05, + 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, + 0x06, 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, 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, 0x45, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, + 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, + 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, 0x4e, + 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x0e, 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, 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, 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, 0x52, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x73, 0x70, 0x65, 0x63, + 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, 0x86, 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, 0x4c, 0x0a, 0x04, 0x74, + 0x61, 0x67, 0x73, 0x18, 0x04, 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, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, - 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 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, + 0x2e, 0x76, 0x31, 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, 0xe8, 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, 0x6c, 0x0a, 0x0f, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, + 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, 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, 0xee, 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, 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, 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, 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, 0xaa, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x57, 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, 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, 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, 0x63, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x07, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 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, 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, + 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, 0xf0, 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, 0x4d, 0x0a, 0x04, + 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 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, 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, 0x22, 0xbb, 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, 0x37, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 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, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0x9e, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x6c, + 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x6c, 0x0a, 0x0f, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 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, 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, 0x87, + 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, 0x44, 0x0a, 0x0b, 0x63, + 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 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, 0x43, 0x6f, 0x70, 0x79, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x4f, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 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, 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, 0x52, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 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, 0xaa, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x57, 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, 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, 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, 0x63, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x07, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 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, 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, 0xa9, 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, 0x37, 0x0a, 0x06, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 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, 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, @@ -6785,7 +6551,7 @@ var file_oss_proto_rawDesc = []byte{ 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x64, 0x22, 0xc1, 0x02, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 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, @@ -6804,649 +6570,632 @@ var file_oss_proto_rawDesc = []byte{ 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xdf, 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, 0x3b, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x61, 0x79, 0x65, 0x72, 0x22, 0xdf, 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, 0x3b, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 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, + 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, 0xc2, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0xc2, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, - 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0x93, 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, 0x12, 0x10, 0x0a, - 0x03, 0x75, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, - 0x98, 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, 0x34, 0x0a, 0x05, 0x6f, - 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0xa5, 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, - 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, - 0x69, 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, 0x8e, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, + 0x31, 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, 0x98, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 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, + 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, + 0xef, 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, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0x81, 0x0c, 0x0a, 0x1a, 0x43, 0x72, 0x65, + 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, + 0x5e, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x11, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x41, 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, 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, 0x5e, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 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, 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, + 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, 0x5a, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x1d, 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, 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, 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, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x73, 0x65, 0x43, 0x75, + 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, 0x19, 0x20, 0x01, 0x28, 0x09, + 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, 0x1a, 0x20, 0x01, 0x28, + 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, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, + 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, 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, 0x5a, 0x0a, 0x07, 0x74, 0x61, 0x67, - 0x67, 0x69, 0x6e, 0x67, 0x18, 0x1d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x73, 0x70, 0x65, + 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, 0xa6, 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, 0x44, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 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, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x75, 0x69, 0x64, 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, 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, + 0x6e, 0x2e, 0x76, 0x31, 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, 0xb7, 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, + 0x51, 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, 0x27, 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, 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, 0x07, 0x20, 0x01, 0x28, 0x09, + 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, 0x08, + 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, 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, 0xf0, 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, 0x12, 0x10, 0x0a, - 0x03, 0x75, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0xb8, 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, 0x44, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 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, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, - 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 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, 0xb7, 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, 0x51, - 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, 0x27, 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, 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, 0x58, 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, 0x3c, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, - 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, 0x43, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, - 0x73, 0x22, 0xcd, 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, 0x5c, 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, 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, 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, 0x12, - 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, - 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, 0xec, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, - 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0xdd, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x75, 0x69, 0x64, 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, 0xfb, 0x01, 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, 0x40, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, - 0x6f, 0x72, 0x18, 0x02, 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, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, - 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0xe4, 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, 0x42, 0x0a, 0x07, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, - 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, - 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, 0xd7, 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, + 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, 0x58, 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, 0x3c, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 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, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, + 0x74, 0x73, 0x22, 0xbb, 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, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 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, 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, - 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, - 0x69, 0x64, 0x22, 0xbc, 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, 0x34, 0x0a, 0x05, - 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0x85, 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, 0x34, 0x0a, 0x05, 0x6f, - 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0xaf, 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, - 0x51, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, - 0x73, 0x18, 0x02, 0x20, 0x03, 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, 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, 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, 0x42, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 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, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xf9, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x11, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xbd, 0x01, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x64, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x66, 0x0a, 0x0f, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 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, - 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, 0x8e, 0x01, 0x0a, 0x12, 0x49, 0x73, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, + 0x65, 0x72, 0x12, 0x5c, 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, 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, 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, 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, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0xa7, - 0x01, 0x0a, 0x0c, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, + 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, 0xfb, + 0x01, 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, 0x40, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 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, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0xe4, 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, + 0x42, 0x0a, 0x07, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, + 0x32, 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, 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, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 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, 0xce, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xde, 0x04, 0x0a, 0x11, 0x41, 0x70, + 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, 0xbc, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0x85, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0xaf, 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, 0x51, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 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, 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, 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, 0x42, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, + 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, 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, 0xbd, + 0x01, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x12, 0x66, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 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, 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, 0xcc, 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, @@ -7479,250 +7228,247 @@ var file_oss_proto_rawDesc = []byte{ 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, 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, 0x12, - 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, - 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, 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, 0xac, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 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, 0x84, - 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, 0x33, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1d, 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, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, - 0x70, 0x61, 0x72, 0x74, 0x73, 0x32, 0xb3, 0x17, 0x0a, 0x14, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x62, - 0x0a, 0x09, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x2e, 0x73, 0x70, + 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, 0x84, 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, 0x33, 0x0a, 0x05, + 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, + 0x73, 0x32, 0xb3, 0x17, 0x0a, 0x14, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x62, 0x0a, 0x09, 0x50, 0x75, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x1a, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x62, + 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x50, - 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, - 0x28, 0x01, 0x12, 0x62, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, - 0x27, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x69, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, + 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x69, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, - 0x00, 0x12, 0x63, 0x0a, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 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, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 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, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x12, 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, 0x4c, 0x69, - 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, + 0x65, 0x74, 0x65, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x0a, - 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x48, - 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, - 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, - 0x73, 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, 0x49, 0x73, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, - 0x75, 0x0a, 0x10, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, - 0x69, 0x6e, 0x67, 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, 0x50, 0x75, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 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, 0x7e, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 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, 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, 0x32, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x63, 0x0a, + 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 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, + 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x73, 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, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 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, 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, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, - 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2f, 0x2e, 0x73, 0x70, 0x65, + 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, + 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, + 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 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, 0x7b, 0x0a, - 0x12, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, - 0x41, 0x63, 0x6c, 0x12, 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, 0x47, 0x65, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, - 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, 0x7b, 0x0a, 0x12, 0x50, 0x75, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, - 0x12, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x1a, 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, 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, 0x84, 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, 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, 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, 0x34, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 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, 0x65, - 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x12, 0x28, 0x2e, 0x73, + 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, + 0x0d, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, + 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x10, 0x50, + 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 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, 0x7e, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, 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, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, - 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 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, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, + 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x0e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, + 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, + 0x67, 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, 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, 0x7b, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, + 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x1a, 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, 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, 0x7b, 0x0a, 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 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, 0x84, 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, 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, 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, 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, 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, 0x65, 0x0a, 0x0a, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 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, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, + 0x01, 0x12, 0x6f, 0x0a, 0x0e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, + 0x6f, 0x70, 0x79, 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, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x12, 0x8a, 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, 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, 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, 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, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x8a, 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, 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, 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, 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, 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, 0x81, 0x01, 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, - 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x32, 0x2e, 0x73, + 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, + 0x81, 0x01, 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, + 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 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, 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, 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, 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, + 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x22, 0x00, 0x12, 0x81, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 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, 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, 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, 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, 0x81, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, - 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, - 0x12, 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, 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, 0x33, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x50, + 0x61, 0x72, 0x74, 0x73, 0x12, 0x27, 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, 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, 0x60, 0x0a, 0x09, 0x4c, - 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x12, 0x27, 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, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x1a, 0x28, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, + 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, + 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x12, 0x4c, 0x69, 0x73, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, - 0x50, 0x61, 0x72, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7b, 0x0a, - 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 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, 0x4c, 0x69, - 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, - 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, 0x5a, 0x0a, 0x07, 0x53, 0x69, - 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x12, 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, - 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x07, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, + 0x4c, 0x12, 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, 0x53, 0x69, 0x67, 0x6e, + 0x55, 0x52, 0x4c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x12, 0x74, 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, 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, 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, 0x72, 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, 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, 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, 0x72, 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, 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, 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, 0x6b, 0x0a, 0x0c, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 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, 0x41, 0x70, 0x70, 0x65, 0x6e, - 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2b, 0x2e, 0x73, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x0c, + 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 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, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6c, 0x0a, - 0x0d, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, - 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, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 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, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6c, 0x0a, 0x0d, 0x52, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/spec/proto/extension/v1/oss.proto b/spec/proto/extension/v1/oss.proto index 4edc4fef32..36a5060dd0 100644 --- a/spec/proto/extension/v1/oss.proto +++ b/spec/proto/extension/v1/oss.proto @@ -51,6 +51,11 @@ service ObjectStorageService{ //the actual permissions corresponding to ACLs with the same name may be different between different manufacturers. //Therefore, applications using this interface will greatly increase the complexity of transplantation. //In general, this interface is not recommended, especially if your application has portability requirements. + //For the types and permission definitions supported by ACL, please refer to the specific manufacturer's definition,eg: + //AWS: https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL + //tenantcloud: https://intl.cloud.tencent.com/document/product/436/30583 + //aliyun: https://www.alibabacloud.com/help/en/object-storage-service/latest/access-and-control-acl + //Returns object canned acl. //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL rpc GetObjectCannedAcl(GetObjectCannedAclInput) returns(GetObjectCannedAclOutput){} @@ -172,8 +177,6 @@ message GetObjectInput { string accept_encoding = 23; // Specify the signed url of object, user can get object with signed url without ak、sk string signed_url = 24; - // Specify the client used for request - string uid = 25; } message GetObjectOutput { // Object data. @@ -244,9 +247,9 @@ message PutObjectInput{ bool bucket_key_enabled = 6; // Can be used to specify caching behavior along the request/reply chain. string cache_control = 7; - // Specifies presentational information for the object. For more information, see - // http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.5.1 - // (http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.5.1). + // Specifies presentational information for the object. For more information, see + // http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.5.1 + // (http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.5.1). string content_disposition = 8; // 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 @@ -254,9 +257,9 @@ message PutObjectInput{ // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11 // (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11). string content_encoding = 9; - // The date and time at which the object is no longer cacheable. For more - // information, see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 - // (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21). + // The date and time at which the object is no longer cacheable. For more + // information, see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 + // (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21). int64 expires = 10; // The server-side encryption algorithm used when storing this object in Amazon S3 // (for example, AES256, aws:kms). @@ -265,10 +268,8 @@ message PutObjectInput{ string signed_url = 12; // A map of metadata to store with the object in S3. map meta = 13; - // Specify the client used for request - string uid = 14; // The tag-set for the object. The tag-set must be encoded as URL Query parameters. - map tagging = 15; + map tagging = 14; } message PutObjectOutput{ // Indicates whether the uploaded object uses an S3 Bucket Key for server-side @@ -301,12 +302,10 @@ message DeleteObjectInput{ string request_payer = 4; // VersionId used to reference a specific version of the object. string version_id = 5; - // Specify the client used for request - string uid = 6; } message DeleteObjectOutput{ - // Specifies whether the versioned object that was permanently deleted was (true) - // or was not (false) a delete marker. + // Specifies whether the versioned object that was permanently deleted was (true) + // or was not (false) a delete marker. bool delete_marker = 1; // If present, indicates that the requester was successfully charged for the // request. @@ -328,8 +327,6 @@ message PutObjectTaggingInput{ map tags = 4; // The versionId of the object that the tag-set will be added to. string version_id = 5; - // Specify the client used for request - string uid = 6; } message PutObjectTaggingOutput{ // The versionId of the object the tag-set was added to. @@ -351,8 +348,6 @@ message DeleteObjectTaggingInput{ // different account, the request fails with the HTTP status code 403 Forbidden // (access denied). string expected_bucket_owner = 5; - // Specify the client used for request - string uid = 6; } message DeleteObjectTaggingOutput{ // The versionId of the object the tag-set was removed from. @@ -377,8 +372,6 @@ message GetObjectTaggingInput{ string expected_bucket_owner = 5; // Confirms that the requester knows that they will be charged for the request. string request_payer = 6; - // Specify the client used for request - string uid = 7; } message GetObjectTaggingOutput{ // Contains the tag set. @@ -417,8 +410,6 @@ message CopyObjectInput{ string metadata_directive = 7; // A map of metadata to store with the object in S3. map metadata = 8; - // Specify the client used for request - string uid = 9; } message CopyObjectResult{ // Returns the ETag of the new object. The ETag reflects only changes to the @@ -455,8 +446,6 @@ message DeleteObjectsInput{ string bucket = 2; Delete delete = 3; string request_payer = 4; - // Specify the client used for request - string uid = 5; } message DeletedObject{ // Specifies whether the versioned object that was permanently deleted was (true) @@ -505,8 +494,6 @@ message ListObjectsInput{ // objects request. Bucket owners need not specify this parameter in their // requests. string request_payer = 9; - // Specify the client used for request - string uid = 10; } message ListObjectsOutput{ repeated string common_prefixes = 1; @@ -562,8 +549,6 @@ message GetObjectCannedAclInput{ string key = 3; // VersionId used to reference a specific version of the object string version_id = 4; - // Specify the client used for request - string uid = 5; } message GetObjectCannedAclOutput{ string canned_acl = 1; @@ -581,8 +566,6 @@ message PutObjectCannedAclInput{ string acl = 4; // VersionId used to reference a specific version of the object. string version_id = 5; - // Specify the client used for request - string uid = 6; } message PutObjectCannedAclOutput{ string request_charged = 1; @@ -594,8 +577,6 @@ message RestoreObjectInput{ string key = 3; // VersionId used to reference a specific version of the object. string version_id = 5; - // Specify the client used for request - string uid = 6; } message RestoreObjectOutput{ // If present, indicates that the requester was successfully charged for the @@ -643,8 +624,6 @@ message CreateMultipartUploadInput{ // The tag-set for the object. The tag-set must be encoded as URL Query parameters. map tagging = 29; string website_redirect_location = 30; - // Specify the client used for request - string uid = 31; } message CreateMultipartUploadOutput{ string bucket = 1; @@ -684,8 +663,6 @@ message UploadPartInput{ // Upload ID identifying the multipart upload whose part is being uploaded. // This member is required. string upload_id = 13; - // Specify the client used for request - string uid = 14; } message UploadPartOutput{ bool bucket_key_enabled = 1; @@ -713,8 +690,6 @@ message UploadPartCopyInput{ // The range of bytes to copy from the source object.bytes=start_position-part_size int64 start_position = 7; int64 part_size = 8; - // Specify the client used for request - string uid = 9; } message CopyPartResult{ @@ -752,8 +727,6 @@ message CompleteMultipartUploadInput{ string expected_bucket_owner = 6; // The container for the multipart upload request information. CompletedMultipartUpload multipart_upload = 7; - // Specify the client used for request - string uid = 8; } message CompleteMultipartUploadOutput{ string bucket = 1; @@ -784,8 +757,6 @@ message AbortMultipartUploadInput{ // Upload ID that identifies the multipart upload. // This member is required. string upload_id = 6; - // Specify the client used for request - string uid = 7; } message AbortMultipartUploadOutput{ // If present, indicates that the requester was successfully charged for the @@ -827,8 +798,6 @@ message ListMultipartUploadsInput{ // might be included in the list only if they have an upload ID lexicographically // greater than the specified upload-id-marker. string upload_id_marker = 9; - // Specify the client used for request - string uid = 10; } message Initiator{ string display_name = 1; @@ -900,8 +869,6 @@ message ListObjectVersionsInput{ string prefix = 8; // Specifies the object version you want to start listing from. string version_id_marker = 9; - // Specify the client used for request - string uid = 10; } message DeleteMarkerEntry{ // Specifies whether the object is (true) or is not (false) the latest version of @@ -965,8 +932,6 @@ message HeadObjectInput{ string version_id = 15; // Return object details meta bool with_details = 16; - // Specify the client used for request - string uid = 17; } message HeadObjectOutput{ // Metadata pertaining to the operation's result. @@ -978,8 +943,6 @@ message IsObjectExistInput{ string bucket = 2; string key = 3; string version_id = 4; - // Specify the client used for request - string uid = 5; } message IsObjectExistOutput{ bool file_exist = 1; @@ -993,8 +956,6 @@ message SignURLInput{ string method = 4; // expire time of the sign url int64 expired_in_sec = 5; - // Specify the client used for request - string uid = 6; } message SignURLOutput{ string signed_url = 1; @@ -1006,8 +967,6 @@ message UpdateBandwidthRateLimitInput{ int64 average_rate_limit_in_bits_per_sec = 2; //Resource name of gateway string gateway_resource_name = 3; - // Specify the client used for request - string uid = 4; } message AppendObjectInput{ @@ -1026,8 +985,6 @@ message AppendObjectInput{ string server_side_encryption = 13; string meta = 14; map tags = 15; - // Specify the client used for request - string uid = 16; } message AppendObjectOutput{ @@ -1043,8 +1000,6 @@ message ListPartsInput{ int64 part_number_marker = 6; string request_payer = 7; string upload_id = 8; - // Specify the client used for request - string uid = 9; } message Part{ string etag = 1; diff --git a/spec/proto/extension/v1/oss_grpc.pb.go b/spec/proto/extension/v1/oss_grpc.pb.go index 325c6d6677..4e523bf305 100644 --- a/spec/proto/extension/v1/oss_grpc.pb.go +++ b/spec/proto/extension/v1/oss_grpc.pb.go @@ -58,11 +58,6 @@ type ObjectStorageServiceClient interface { //Returns the tag-set of an object. //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObjectTagging.html GetObjectTagging(ctx context.Context, in *GetObjectTaggingInput, opts ...grpc.CallOption) (*GetObjectTaggingOutput, error) - //Object ACL Operation API - //Because different manufacturers have different definitions for ACL types, at the same time, - //the actual permissions corresponding to ACLs with the same name may be different between different manufacturers. - //Therefore, applications using this interface will greatly increase the complexity of transplantation. - //In general, this interface is not recommended, especially if your application has portability requirements. //Returns object canned acl. //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL GetObjectCannedAcl(ctx context.Context, in *GetObjectCannedAclInput, opts ...grpc.CallOption) (*GetObjectCannedAclOutput, error) @@ -489,11 +484,6 @@ type ObjectStorageServiceServer interface { //Returns the tag-set of an object. //Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObjectTagging.html GetObjectTagging(context.Context, *GetObjectTaggingInput) (*GetObjectTaggingOutput, error) - //Object ACL Operation API - //Because different manufacturers have different definitions for ACL types, at the same time, - //the actual permissions corresponding to ACLs with the same name may be different between different manufacturers. - //Therefore, applications using this interface will greatly increase the complexity of transplantation. - //In general, this interface is not recommended, especially if your application has portability requirements. //Returns object canned acl. //Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL GetObjectCannedAcl(context.Context, *GetObjectCannedAclInput) (*GetObjectCannedAclOutput, error) From 84f86a29709936e6ee896ed4db71466049706186 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Thu, 21 Jul 2022 14:58:00 +0800 Subject: [PATCH 110/126] format pb file --- spec/proto/extension/v1/oss.pb.go | 9 +-- spec/proto/extension/v1/oss.proto | 101 +++++++++++++++--------------- 2 files changed, 52 insertions(+), 58 deletions(-) diff --git a/spec/proto/extension/v1/oss.pb.go b/spec/proto/extension/v1/oss.pb.go index 6cdb086e9a..d399143479 100644 --- a/spec/proto/extension/v1/oss.pb.go +++ b/spec/proto/extension/v1/oss.pb.go @@ -3292,8 +3292,7 @@ type UploadPartInput struct { ContentLength int64 `protobuf:"varint,5,opt,name=content_length,json=contentLength,proto3" json:"content_length,omitempty"` ContentMd5 string `protobuf:"bytes,6,opt,name=content_md5,json=contentMd5,proto3" json:"content_md5,omitempty"` 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. + // 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"` RequestPayer string `protobuf:"bytes,9,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` @@ -3533,8 +3532,7 @@ type UploadPartCopyInput struct { Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` 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. + // 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. @@ -4213,8 +4211,7 @@ type AbortMultipartUploadOutput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // If present, indicates that the requester was successfully charged for the - // request. + // 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"` } diff --git a/spec/proto/extension/v1/oss.proto b/spec/proto/extension/v1/oss.proto index 36a5060dd0..f54a65f7d5 100644 --- a/spec/proto/extension/v1/oss.proto +++ b/spec/proto/extension/v1/oss.proto @@ -268,12 +268,12 @@ message PutObjectInput{ string signed_url = 12; // A map of metadata to store with the object in S3. map meta = 13; - // The tag-set for the object. The tag-set must be encoded as URL Query parameters. + // The tag-set for the object. The tag-set must be encoded as URL Query parameters. map tagging = 14; } message PutObjectOutput{ - // Indicates whether the uploaded object uses an S3 Bucket Key for server-side - // encryption with Amazon Web Services KMS (SSE-KMS). + // Indicates whether the uploaded object uses an S3 Bucket Key for server-side + // encryption with Amazon Web Services KMS (SSE-KMS). bool bucket_key_enabled = 1; // Entity tag for the uploaded object. string etag = 2; @@ -329,7 +329,7 @@ message PutObjectTaggingInput{ string version_id = 5; } message PutObjectTaggingOutput{ - // The versionId of the object the tag-set was added to. + // The versionId of the object the tag-set was added to. string version_id = 1; // Metadata pertaining to the operation's result. map result_metadata = 2; @@ -350,7 +350,7 @@ message DeleteObjectTaggingInput{ string expected_bucket_owner = 5; } message DeleteObjectTaggingOutput{ - // The versionId of the object the tag-set was removed from. + // The versionId of the object the tag-set was removed from. string version_id = 1; // Metadata pertaining to the operation's result. map result_metadata = 2; @@ -374,8 +374,8 @@ message GetObjectTaggingInput{ string request_payer = 6; } message GetObjectTaggingOutput{ - // Contains the tag set. - // This member is required. + // Contains the tag set. + // This member is required. map tags = 1; // The versionId of the object for which you got the tagging information. string version_id = 2; @@ -406,20 +406,20 @@ message CopyObjectInput{ map tagging = 5; // The date and time at which the object is no longer cacheable. int64 expires = 6; - // Specifies whether the metadata is copied from the source object or replaced with metadata provided in the request. + // Specifies whether the metadata is copied from the source object or replaced with metadata provided in the request. string metadata_directive = 7; // A map of metadata to store with the object in S3. map metadata = 8; } message CopyObjectResult{ - // Returns the ETag of the new object. The ETag reflects only changes to the - // contents of an object, not its metadata. - string etag = 1; + // Returns the ETag of the new object. The ETag reflects only changes to the + // contents of an object, not its metadata. + string etag = 1; // Creation date of the object. - int64 last_modified = 2; + int64 last_modified = 2; } message CopyObjectOutput{ - // Container for all response elements. + // Container for all response elements. CopyObjectResult copy_object_result = 1; // Version ID of the newly created copy. string version_id = 2; @@ -435,11 +435,11 @@ message Delete{ bool quiet = 2; } message ObjectIdentifier{ - // Key name of the object. - // This member is required. - string key = 1; + // Key name of the object. + // This member is required. + string key = 1; // VersionId for the specific version of the object to delete. - string version_id = 2; + string version_id = 2; } message DeleteObjectsInput{ string store_name = 1; @@ -448,21 +448,21 @@ message DeleteObjectsInput{ string request_payer = 4; } message DeletedObject{ - // Specifies whether the versioned object that was permanently deleted was (true) - // or was not (false) a delete marker. In a simple DELETE, this header indicates - // whether (true) or not (false) a delete marker was created. - bool delete_marker = 1; + // Specifies whether the versioned object that was permanently deleted was (true) + // or was not (false) a delete marker. In a simple DELETE, this header indicates + // whether (true) or not (false) a delete marker was created. + bool delete_marker = 1; // The version ID of the delete marker created as a result of the DELETE operation. // If you delete a specific object version, the value returned by this header is // the version ID of the object version deleted. - string delete_marker_version_id = 2; + string delete_marker_version_id = 2; // The name of the deleted object. - string key = 3; + string key = 3; // The version ID of the deleted object. - string version_id = 4; + string version_id = 4; } message DeleteObjectsOutput{ - repeated DeletedObject deleted = 1; + repeated DeletedObject deleted = 1; } message ListObjectsInput{ @@ -490,9 +490,9 @@ message ListObjectsInput{ int32 maxKeys = 7; // Limits the response to keys that begin with the specified prefix. string prefix = 8; - // Confirms that the requester knows that she or he will be charged for the list - // objects request. Bucket owners need not specify this parameter in their - // requests. + // Confirms that the requester knows that she or he will be charged for the list + // objects request. Bucket owners need not specify this parameter in their + // requests. string request_payer = 9; } message ListObjectsOutput{ @@ -512,7 +512,7 @@ message ListObjectsOutput{ // Indicates where in the bucket listing begins. Marker is included in the response // if it was sent with the request. string marker = 6; - // The maximum number of keys returned in the response body. + // The maximum number of keys returned in the response body. int32 max_keys = 7; // The bucket name. string name = 8; @@ -579,8 +579,8 @@ message RestoreObjectInput{ string version_id = 5; } message RestoreObjectOutput{ - // If present, indicates that the requester was successfully charged for the - // request. + // If present, indicates that the requester was successfully charged for the + // request. string request_charged = 1; // Indicates the path in the provided S3 output location where Select results will // be restored to. @@ -652,8 +652,7 @@ message UploadPartInput{ int64 content_length = 5; string content_md5 = 6; string expected_bucket_owner = 7; - // Part number of part being uploaded. This is a positive integer between 1 and - // 10,000. + // Part number of part being uploaded. This is a positive integer between 1 and 10,000. // This member is required. int32 part_number = 8; string request_payer = 9; @@ -680,9 +679,8 @@ message UploadPartCopyInput{ string bucket = 2; string key = 3; CopySource copy_source = 4; - // Part number of part being copied. This is a positive integer between 1 and - // 10,000. - // This member is required. + // Part number of part being copied. This is a positive integer between 1 and 10,000. + // This member is required. int32 part_number = 5; // Upload ID identifying the multipart upload whose part is being copied. // This member is required. @@ -693,7 +691,7 @@ message UploadPartCopyInput{ } message CopyPartResult{ - // Entity tag of the object. + // Entity tag of the object. string etag = 1; int64 last_modified = 2; } @@ -713,7 +711,7 @@ message CompletedPart{ int32 part_number = 2; } message CompletedMultipartUpload{ - // Array of CompletedPart data types. + // Array of CompletedPart data types. repeated CompletedPart parts = 1; } message CompleteMultipartUploadInput{ @@ -759,8 +757,7 @@ message AbortMultipartUploadInput{ string upload_id = 6; } message AbortMultipartUploadOutput{ - // If present, indicates that the requester was successfully charged for the - // request. + // If present, indicates that the requester was successfully charged for the request. string request_charged = 1; } @@ -871,8 +868,8 @@ message ListObjectVersionsInput{ string version_id_marker = 9; } message DeleteMarkerEntry{ - // Specifies whether the object is (true) or is not (false) the latest version of - // an object. + // Specifies whether the object is (true) or is not (false) the latest version of + // an object. bool is_latest = 1; string key = 2; // Date and time the object was last modified. @@ -934,8 +931,8 @@ message HeadObjectInput{ bool with_details = 16; } message HeadObjectOutput{ - // Metadata pertaining to the operation's result. - map result_metadata = 1; + // Metadata pertaining to the operation's result. + map result_metadata = 1; } message IsObjectExistInput{ @@ -963,7 +960,7 @@ message SignURLOutput{ message UpdateBandwidthRateLimitInput{ string store_name = 1; - // The average upload/download bandwidth rate limit in bits per second. + // The average upload/download bandwidth rate limit in bits per second. int64 average_rate_limit_in_bits_per_sec = 2; //Resource name of gateway string gateway_resource_name = 3; @@ -1008,21 +1005,21 @@ message Part{ int64 size = 4; } message ListPartsOutput{ - string bucket = 1; - string key = 2; + string bucket = 1; + string key = 2; // Upload ID identifying the multipart upload whose parts are being listed. - string upload_id = 3; + string upload_id = 3; // 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. - string next_part_number_marker = 4; + string next_part_number_marker = 4; // Maximum number of parts that were allowed in the response. - int64 max_parts = 5; + int64 max_parts = 5; // 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. - bool is_truncated = 6; + bool is_truncated = 6; // Container for elements related to a particular part. A response can contain zero // or more Part elements. - repeated Part parts = 7; + repeated Part parts = 7; } \ No newline at end of file From 4e47006ed393140fd4aed109ee532e132c6f6bb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Thu, 21 Jul 2022 15:05:58 +0800 Subject: [PATCH 111/126] fix md wrong path --- docs/zh/start/oss/oss.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/zh/start/oss/oss.md b/docs/zh/start/oss/oss.md index fb6928c64a..e8163a5cdb 100644 --- a/docs/zh/start/oss/oss.md +++ b/docs/zh/start/oss/oss.md @@ -46,12 +46,12 @@ go build -o layotto 启动 Layotto: ```shell @background -./layotto start -c ../../configs/oss.json +./layotto start -c ../../configs/config_oss.json ``` ### step 2. 启动测试demo -Layotto提供了访问文件的示例 [demo](../../../../demo/file/s3/client.go) +Layotto提供了访问文件的示例 [demo](../../../../demo/oss/client.go) ```shell cd ${project_path}/demo/file/s3/ From b15085e6af965ec0bf932eaf6db4d64989aa0225 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Thu, 21 Jul 2022 19:53:30 +0800 Subject: [PATCH 112/126] add ut for deepcopy and runtime --- components/oss/aws/oss.go | 107 ++++----------------------------- components/oss/aws/oss_test.go | 24 ++++++++ pkg/runtime/runtime.go | 2 +- pkg/runtime/runtime_test.go | 35 +++++++++++ 4 files changed, 73 insertions(+), 95 deletions(-) diff --git a/components/oss/aws/oss.go b/components/oss/aws/oss.go index 62bd963a26..988c5c8bbb 100644 --- a/components/oss/aws/oss.go +++ b/components/oss/aws/oss.go @@ -212,11 +212,7 @@ func (a *AwsOss) CopyObject(ctx context.Context, req *oss.CopyObjectInput) (*oss copySource += "?versionId=" + req.CopySource.CopySourceVersionId } copySourceUrlEncode := url.QueryEscape(copySource) - input := &s3.CopyObjectInput{ - Bucket: &req.Bucket, - Key: &req.Key, - CopySource: ©SourceUrlEncode, - } + input := &s3.CopyObjectInput{Bucket: &req.Bucket, Key: &req.Key, CopySource: ©SourceUrlEncode} resp, err := client.CopyObject(ctx, input) if err != nil { return nil, err @@ -257,15 +253,7 @@ func (a *AwsOss) ListObjects(ctx context.Context, req *oss.ListObjectsInput) (*o } input := &s3.ListObjectsInput{} - err = copier.CopyWithOption( - input, - req, - copier.Option{ - IgnoreEmpty: true, - DeepCopy: true, - Converters: []copier.TypeConverter{}, - }, - ) + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) if err != nil { return nil, err } @@ -274,22 +262,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{ - { - SrcType: &time.Time{}, - DstType: int64(0), - Fn: func(src interface{}) (interface{}, error) { - s, ok := src.(*time.Time) - if !ok { - return nil, errors.New("src type not matching") - } - return s.Unix(), nil - }, - }, - }}) + 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 @@ -305,11 +278,7 @@ func (a *AwsOss) PutObjectCannedAcl(ctx context.Context, req *oss.PutObjectCanne if err != nil { return nil, err } - input := &s3.PutObjectAclInput{ - Bucket: &req.Bucket, - Key: &req.Key, - ACL: types.ObjectCannedACL(req.Acl), - } + 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 @@ -337,15 +306,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{int642time}}) if err != nil { log.DefaultLogger.Errorf("copy CreateMultipartUploadInput fail, err: %+v", err) return nil, err @@ -355,15 +316,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{time2int64}}) return output, err } func (a *AwsOss) UploadPart(ctx context.Context, req *oss.UploadPartInput) (*oss.UploadPartOutput, error) { @@ -377,13 +330,7 @@ func (a *AwsOss) UploadPart(ctx context.Context, req *oss.UploadPartInput) (*oss return nil, err } input.Body = req.DataStream - resp, err := client.UploadPart( - ctx, - input, - s3.WithAPIOptions( - v4.SwapComputePayloadSHA256ForUnsignedPayloadMiddleware, - ), - ) + resp, err := client.UploadPart(ctx, input, s3.WithAPIOptions(v4.SwapComputePayloadSHA256ForUnsignedPayloadMiddleware)) if err != nil { return nil, err } @@ -425,15 +372,7 @@ func (a *AwsOss) CompleteMultipartUpload(ctx context.Context, req *oss.CompleteM return nil, err } input := &s3.CompleteMultipartUploadInput{MultipartUpload: &types.CompletedMultipartUpload{}} - err = copier.CopyWithOption( - input, - req, - copier.Option{ - IgnoreEmpty: true, - DeepCopy: true, - Converters: []copier.TypeConverter{}, - }, - ) + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) if err != nil { return nil, err } @@ -489,14 +428,8 @@ func (a *AwsOss) ListMultipartUploads(ctx context.Context, req *oss.ListMultipar output.CommonPrefixes = append(output.CommonPrefixes, *v.Prefix) } for _, v := range resp.Uploads { - upload := &oss.MultipartUpload{ - //Initiated: timestamppb.New(*v.Initiated), - Initiator: &oss.Initiator{DisplayName: *v.Initiator.DisplayName, ID: *v.Initiator.ID}, - Key: *v.Key, - Owner: &oss.Owner{ID: *v.Owner.ID, DisplayName: *v.Owner.DisplayName}, - StorageClass: string(v.StorageClass), - UploadId: *v.UploadId, - } + upload := &oss.MultipartUpload{} + copier.CopyWithOption(upload, v, copier.Option{IgnoreEmpty: true, DeepCopy: true}) output.Uploads = append(output.Uploads, upload) } return output, err @@ -524,26 +457,12 @@ func (a *AwsOss) ListObjectVersions(ctx context.Context, req *oss.ListObjectVers output.CommonPrefixes = append(output.CommonPrefixes, *v.Prefix) } for _, v := range resp.DeleteMarkers { - entry := &oss.DeleteMarkerEntry{ - IsLatest: v.IsLatest, - Key: *v.Key, - //LastModified: timestamppb.New(*v.LastModified), - Owner: &oss.Owner{DisplayName: *v.Owner.DisplayName, ID: *v.Owner.ID}, - VersionId: *v.VersionId, - } + 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{ - ETag: *v.ETag, - IsLatest: v.IsLatest, - Key: *v.Key, - LastModified: v.LastModified.Unix(), - Owner: &oss.Owner{DisplayName: *v.Owner.DisplayName, ID: *v.Owner.ID}, - Size: v.Size, - StorageClass: string(v.StorageClass), - VersionId: *v.VersionId, - } + 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 diff --git a/components/oss/aws/oss_test.go b/components/oss/aws/oss_test.go index 7aace10a94..8ddc37a165 100644 --- a/components/oss/aws/oss_test.go +++ b/components/oss/aws/oss_test.go @@ -20,6 +20,11 @@ import ( "context" "errors" "testing" + "time" + + "github.com/jinzhu/copier" + + "github.com/aws/aws-sdk-go-v2/service/s3/types" "mosn.io/layotto/components/oss" @@ -131,3 +136,22 @@ func TestAwsOss(t *testing.T) { err = instance.UpdateUploadBandwidthRateLimit(context.TODO(), &oss.UpdateBandwidthRateLimitInput{}) assert.NotNil(t, err) } + +func TestDeepCopy(t *testing.T) { + value := "hello" + t1 := time.Now() + fromValue := &types.ObjectVersion{ + ETag: &value, + IsLatest: true, + Key: &value, + LastModified: &t1, + Owner: &types.Owner{DisplayName: &value, ID: &value}, + Size: 10, + StorageClass: "hello", + VersionId: &value, + } + tovalue := &oss.ObjectVersion{} + err := copier.CopyWithOption(tovalue, fromValue, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{time2int64}}) + assert.Nil(t, err) + assert.Equal(t, tovalue.Owner.DisplayName, value) +} diff --git a/pkg/runtime/runtime.go b/pkg/runtime/runtime.go index 0b7ab81248..030ba5a090 100644 --- a/pkg/runtime/runtime.go +++ b/pkg/runtime/runtime.go @@ -412,7 +412,7 @@ func (m *MosnRuntime) initStates(factorys ...*runtime_state.Factory) error { } func (m *MosnRuntime) initOss(oss ...*oss.OssFactory) error { - log.DefaultLogger.Infof("[runtime] init file service") + log.DefaultLogger.Infof("[runtime] init oss service") // register all oss store services implementation m.ossRegistry.Register(oss...) diff --git a/pkg/runtime/runtime_test.go b/pkg/runtime/runtime_test.go index a9e5f93de5..3e1b78190e 100644 --- a/pkg/runtime/runtime_test.go +++ b/pkg/runtime/runtime_test.go @@ -24,6 +24,12 @@ import ( "net" "testing" + aws2 "mosn.io/layotto/components/oss/aws" + + s3ext "mosn.io/layotto/pkg/grpc/extension/s3" + + "mosn.io/layotto/components/oss" + "github.com/dapr/components-contrib/bindings" "google.golang.org/grpc/test/bufconn" @@ -829,3 +835,32 @@ func runtimeWithCallbackConnection(t *testing.T) (*MosnRuntime, *mock_appcallbac rt.AppCallbackConn = callbackClient return rt, mockAppCallbackServer } + +func TestMosnRuntimeWithOssConfig(t *testing.T) { + t.Run("normal", func(t *testing.T) { + // 1. construct config + cfg := &MosnRuntimeConfig{ + Oss: map[string]oss.OssConfig{ + "awsdemo": {Type: "aws.oss"}, + }, + } + // 2. construct runtime + rt := NewMosnRuntime(cfg) + // 3. Run + server, err := rt.Run( + // register your grpc API here + WithGrpcAPI( + default_api.NewGrpcAPI, + s3ext.NewS3Server, + ), + WithOssFactory( + oss.NewOssFactory("aws.oss", aws2.NewAwsOss), + ), + ) + // 4. assert + assert.Equal(t, "invalid argument", err.Error()) + assert.Nil(t, server) + // 5. stop + rt.Stop() + }) +} From 55d42038c463f6d90c52232c51b537b47547b96a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Thu, 21 Jul 2022 20:20:42 +0800 Subject: [PATCH 113/126] remove unused option for aws --- components/file/aws/file.go | 28 ++-------------------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/components/file/aws/file.go b/components/file/aws/file.go index e058eb3dcc..db2d34c5e7 100644 --- a/components/file/aws/file.go +++ b/components/file/aws/file.go @@ -79,19 +79,6 @@ func (a *AwsOss) isAwsMetaValid(v *utils.OssMetadata) bool { // createOssClient by input meta info. func (a *AwsOss) createOssClient(meta *utils.OssMetadata) (*s3.Client, error) { - customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) { - if region == meta.Region { - return aws.Endpoint{ - PartitionID: "awsoss", - URL: "https://" + meta.Endpoint, - SigningRegion: meta.Region, - HostnameImmutable: true, - }, nil - } - // returning EndpointNotFoundError will allow the service to fallback to it's default resolution - return aws.Endpoint{}, &aws.EndpointNotFoundError{} - }) - optFunc := []func(options *aws_config.LoadOptions) error{ aws_config.WithRegion(meta.Region), aws_config.WithCredentialsProvider(credentials.StaticCredentialsProvider{ @@ -100,9 +87,7 @@ func (a *AwsOss) createOssClient(meta *utils.OssMetadata) (*s3.Client, error) { Source: defaultCredentialsSource, }, }), - aws_config.WithEndpointResolverWithOptions(customResolver), } - cfg, err := aws_config.LoadDefaultConfig(context.TODO(), optFunc...) if err != nil { return nil, err @@ -126,11 +111,7 @@ func (a *AwsOss) Put(ctx context.Context, st *file.PutFileStu) error { return err } uploader := manager.NewUploader(client) - _, err = uploader.Upload(context.TODO(), &s3.PutObjectInput{ - Bucket: &bucket, - Key: &key, - Body: st.DataStream, - }) + _, err = uploader.Upload(context.TODO(), &s3.PutObjectInput{Bucket: &bucket, Key: &key, Body: st.DataStream}) if err != nil { return err @@ -177,12 +158,7 @@ func (a *AwsOss) List(ctx context.Context, st *file.ListRequest) (*file.ListResp return nil, fmt.Errorf("list bucket[%s] fail, err: %s", st.DirectoryName, err.Error()) } prefix := util.GetFilePrefixName(st.DirectoryName) - input := &s3.ListObjectsInput{ - Bucket: &bucket, - MaxKeys: st.PageSize, - Marker: &st.Marker, - Prefix: &prefix, - } + input := &s3.ListObjectsInput{Bucket: &bucket, MaxKeys: st.PageSize, Marker: &st.Marker, Prefix: &prefix} client, err := a.selectClient() if err != nil { return nil, fmt.Errorf("list bucket[%s] fail, err: %s", st.DirectoryName, err.Error()) From a023a0285f4b52cb11ecc889200987cf788e19b0 Mon Sep 17 00:00:00 2001 From: wenxuwan Date: Fri, 22 Jul 2022 10:00:47 +0800 Subject: [PATCH 114/126] Update docs/zh/start/oss/oss.md Co-authored-by: seeflood --- docs/zh/start/oss/oss.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/start/oss/oss.md b/docs/zh/start/oss/oss.md index e8163a5cdb..3aaf9d0e95 100644 --- a/docs/zh/start/oss/oss.md +++ b/docs/zh/start/oss/oss.md @@ -51,7 +51,7 @@ go build -o layotto ### step 2. 启动测试demo -Layotto提供了访问文件的示例 [demo](../../../../demo/oss/client.go) +Layotto提供了访问文件的示例 [demo](https://github.com/mosn/layotto/blob/main/demo/oss/client.go) ```shell cd ${project_path}/demo/file/s3/ From c5948f52e1dc220c8c6da770d3000a02eb55e4d4 Mon Sep 17 00:00:00 2001 From: wenxuwan Date: Fri, 22 Jul 2022 10:00:55 +0800 Subject: [PATCH 115/126] Update docs/zh/start/oss/oss.md Co-authored-by: seeflood --- docs/zh/start/oss/oss.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/start/oss/oss.md b/docs/zh/start/oss/oss.md index 3aaf9d0e95..02af538e3d 100644 --- a/docs/zh/start/oss/oss.md +++ b/docs/zh/start/oss/oss.md @@ -27,7 +27,7 @@ layotto提供了aws的配置文件`configs/oss.json`,配置文件内容如下 } ``` -配置中对应的字段,需要替换成自己的OSS账号的配置。type当前支持aliyun.oss和aws.oss两种类型,分别对应阿里云的OSS服务和亚马逊云的OSS服务。 +配置中对应的字段,需要替换成自己的OSS账号的配置。type 支持多种类型,例如 `aliyun.oss`对应阿里云的OSS服务, `aws.oss` 对应亚马逊云的 S3 服务。 用户可以根据自己的实际场景进行配置。 配置好后,切换目录: From 50498e8cd4ccab3870f574989a0cd83d0f3fc98c Mon Sep 17 00:00:00 2001 From: wenxuwan Date: Fri, 22 Jul 2022 10:01:02 +0800 Subject: [PATCH 116/126] Update docs/zh/start/oss/oss.md Co-authored-by: seeflood --- docs/zh/start/oss/oss.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/start/oss/oss.md b/docs/zh/start/oss/oss.md index 02af538e3d..5e64c1bdb0 100644 --- a/docs/zh/start/oss/oss.md +++ b/docs/zh/start/oss/oss.md @@ -2,7 +2,7 @@ ## 快速开始 -Layotto提供了访问OSS的示例 [demo](https://github.com/mosn/layotto/blob/main/demo/file/client.go) ,该示例基于S3协议实现了对象的一系列操作,当前 +Layotto提供了访问OSS的示例 [demo](https://github.com/mosn/layotto/blob/main/demo/oss/client.go) ,该示例基于S3协议实现了对象的一系列操作,当前 已支持部分接口。可以做到在不同的OSS实例之间进行无感迁移。 ### step 1. 启动layotto From 634930863de1e132d9e43720e44daf9a19f4869d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Fri, 22 Jul 2022 10:10:18 +0800 Subject: [PATCH 117/126] fix package name --- cmd/layotto/main.go | 12 ++++++------ cmd/layotto_multiple_api/main.go | 16 ++++++++-------- cmd/layotto_without_xds/main.go | 12 ++++++------ 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/cmd/layotto/main.go b/cmd/layotto/main.go index 0b55f25c24..d100ec1ea1 100644 --- a/cmd/layotto/main.go +++ b/cmd/layotto/main.go @@ -24,13 +24,13 @@ import ( "mosn.io/layotto/components/oss" - aws2 "mosn.io/layotto/components/oss/aws" + aws_oss "mosn.io/layotto/components/oss/aws" - aliyun2 "mosn.io/layotto/components/oss/aliyun" + aliyun_oss "mosn.io/layotto/components/oss/aliyun" "mosn.io/mosn/pkg/istio" - "mosn.io/layotto/components/file/aliyun" + aliyun_file "mosn.io/layotto/components/file/aliyun" "github.com/dapr/components-contrib/secretstores" "github.com/dapr/components-contrib/secretstores/aws/parameterstore" @@ -277,7 +277,7 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp // File runtime.WithFileFactory( - file.NewFileFactory("aliyunOSS", aliyun.NewAliyunFile), + file.NewFileFactory("aliOSS", aliyun_file.NewAliyunFile), file.NewFileFactory("minioOSS", minio.NewMinioOss), file.NewFileFactory("awsOSS", aws.NewAwsFile), file.NewFileFactory("tencentCloudOSS", tencentcloud.NewTencentCloudOSS), @@ -285,8 +285,8 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp file.NewFileFactory("qiniuOSS", qiniu.NewQiniuOSS), ), runtime.WithOssFactory( - oss.NewOssFactory("aws.oss", aws2.NewAwsOss), - oss.NewOssFactory("aliyun.oss", aliyun2.NewAliyunOss), + oss.NewOssFactory("aws.oss", aws_oss.NewAwsOss), + oss.NewOssFactory("aliyun.oss", aliyun_oss.NewAliyunOss), ), // PubSub runtime.WithPubSubFactory( diff --git a/cmd/layotto_multiple_api/main.go b/cmd/layotto_multiple_api/main.go index c2fbc2343b..f0504c5ba4 100644 --- a/cmd/layotto_multiple_api/main.go +++ b/cmd/layotto_multiple_api/main.go @@ -24,11 +24,11 @@ import ( "mosn.io/layotto/components/oss" - aws2 "mosn.io/layotto/components/oss/aws" + aws_oss "mosn.io/layotto/components/oss/aws" - aliyun2 "mosn.io/layotto/components/oss/aliyun" + aliyun_oss "mosn.io/layotto/components/oss/aliyun" - "mosn.io/layotto/components/file/aliyun" + aliyun_file "mosn.io/layotto/components/file/aliyun" "mosn.io/layotto/components/file/local" "mosn.io/mosn/pkg/istio" @@ -60,7 +60,7 @@ import ( "mosn.io/layotto/cmd/layotto_multiple_api/helloworld/component" "mosn.io/layotto/components/custom" - "mosn.io/layotto/components/file/aws" + aws_file "mosn.io/layotto/components/file/aws" "mosn.io/layotto/components/file/minio" "mosn.io/layotto/components/file/qiniu" "mosn.io/layotto/components/file/tencentcloud" @@ -287,9 +287,9 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp // File runtime.WithFileFactory( - file.NewFileFactory("aliyunOSS", aliyun.NewAliyunFile), + file.NewFileFactory("aliOSS", aliyun_file.NewAliyunFile), file.NewFileFactory("minioOSS", minio.NewMinioOss), - file.NewFileFactory("awsOSS", aws.NewAwsFile), + file.NewFileFactory("awsOSS", aws_file.NewAwsFile), file.NewFileFactory("tencentCloudOSS", tencentcloud.NewTencentCloudOSS), file.NewFileFactory("local", local.NewLocalStore), file.NewFileFactory("qiniuOSS", qiniu.NewQiniuOSS), @@ -297,8 +297,8 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp //OSS runtime.WithOssFactory( - oss.NewOssFactory("aws.oss", aws2.NewAwsOss), - oss.NewOssFactory("aliyun.oss", aliyun2.NewAliyunOss), + oss.NewOssFactory("aws.oss", aws_oss.NewAwsOss), + oss.NewOssFactory("aliyun.oss", aliyun_oss.NewAliyunOss), ), // PubSub diff --git a/cmd/layotto_without_xds/main.go b/cmd/layotto_without_xds/main.go index 417796f3b1..ba1f94a925 100644 --- a/cmd/layotto_without_xds/main.go +++ b/cmd/layotto_without_xds/main.go @@ -24,12 +24,12 @@ import ( "mosn.io/layotto/components/oss" - aws2 "mosn.io/layotto/components/oss/aws" + aws_oss "mosn.io/layotto/components/oss/aws" - aliyun2 "mosn.io/layotto/components/oss/aliyun" + aliyun_oss "mosn.io/layotto/components/oss/aliyun" "mosn.io/layotto/components/file/aliyun" - "mosn.io/layotto/components/file/aws" + aws_file "mosn.io/layotto/components/file/aws" "mosn.io/layotto/components/file/minio" "mosn.io/layotto/components/file/qiniu" "mosn.io/layotto/components/file/tencentcloud" @@ -261,7 +261,7 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp runtime.WithFileFactory( file.NewFileFactory("aliOSS", aliyun.NewAliyunFile), file.NewFileFactory("minioOSS", minio.NewMinioOss), - file.NewFileFactory("awsOSS", aws.NewAwsFile), + file.NewFileFactory("awsOSS", aws_file.NewAwsFile), file.NewFileFactory("tencentCloudOSS", tencentcloud.NewTencentCloudOSS), file.NewFileFactory("local", local.NewLocalStore), file.NewFileFactory("qiniuOSS", qiniu.NewQiniuOSS), @@ -401,8 +401,8 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp //OSS runtime.WithOssFactory( - oss.NewOssFactory("aws.oss", aws2.NewAwsOss), - oss.NewOssFactory("aliyun.oss", aliyun2.NewAliyunOss), + oss.NewOssFactory("aws.oss", aws_oss.NewAwsOss), + oss.NewOssFactory("aliyun.oss", aliyun_oss.NewAliyunOss), ), // Sequencer From 5a86f3d5976e17aaac7d8b16427685d2308b0c75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Fri, 22 Jul 2022 15:58:25 +0800 Subject: [PATCH 118/126] fix comments and remove unused code --- components/oss/aliyun/oss.go | 22 +- components/oss/aliyun/oss_test.go | 11 +- components/oss/aws/oss.go | 42 +- components/oss/aws/oss_test.go | 9 +- components/oss/oss.go | 9 +- components/oss/registry.go | 38 +- components/oss/types.go | 12 +- configs/config_oss.json | 13 +- docs/zh/start/oss/oss.md | 30 +- pkg/mock/components/oss/oss.go | 2 +- pkg/runtime/config.go | 2 +- pkg/runtime/options.go | 4 +- pkg/runtime/runtime.go | 6 +- pkg/runtime/runtime_test.go | 2 +- spec/proto/extension/v1/oss.pb.go | 3419 ++++++++++++++--------------- spec/proto/extension/v1/oss.proto | 5 - 16 files changed, 1768 insertions(+), 1858 deletions(-) diff --git a/components/oss/aliyun/oss.go b/components/oss/aliyun/oss.go index 2e859b8d6f..fabb24af28 100644 --- a/components/oss/aliyun/oss.go +++ b/components/oss/aliyun/oss.go @@ -29,28 +29,26 @@ import ( ) type AliyunOSS struct { - client *oss.Client - rawData json.RawMessage + client *oss.Client + basicConf json.RawMessage } func NewAliyunOss() l8oss.Oss { return &AliyunOSS{} } -func (a *AliyunOSS) Init(ctx context.Context, config *l8oss.OssConfig) error { - a.rawData = config.Metadata - m := make([]*utils.OssMetadata, 0) - err := json.Unmarshal(config.Metadata, &m) +func (a *AliyunOSS) Init(ctx context.Context, config *l8oss.Config) error { + a.basicConf = config.Metadata[l8oss.BasicConfiguration] + m := &utils.OssMetadata{} + err := json.Unmarshal(a.basicConf, &m) if err != nil { return l8oss.ErrInvalid } - for _, v := range m { - client, err := oss.New(v.Endpoint, v.AccessKeyID, v.AccessKeySecret) - if err != nil { - return err - } - a.client = client + client, err := oss.New(m.Endpoint, m.AccessKeyID, m.AccessKeySecret) + if err != nil { + return err } + a.client = client return nil } diff --git a/components/oss/aliyun/oss_test.go b/components/oss/aliyun/oss_test.go index 9de0f1c6a0..5bc679d072 100644 --- a/components/oss/aliyun/oss_test.go +++ b/components/oss/aliyun/oss_test.go @@ -18,6 +18,7 @@ package aliyun import ( "context" + "encoding/json" "testing" "mosn.io/layotto/components/pkg/utils" @@ -32,13 +33,13 @@ import ( ) const ( - confWithoutUidAndBucket = `[ + confWithoutUidAndBucket = ` { "endpoint": "endpoint_address", "accessKeyID": "accessKey", "accessKeySecret": "secret" } - ]` + ` ) func TestInitAliyunOss(t *testing.T) { @@ -46,9 +47,9 @@ func TestInitAliyunOss(t *testing.T) { client, err := a.getClient() assert.Equal(t, err, utils.ErrNotInitClient) assert.Nil(t, client) - err = a.Init(context.TODO(), &l8oss.OssConfig{Metadata: []byte("hello")}) + err = a.Init(context.TODO(), &l8oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte("hello")}}) assert.Equal(t, err, l8oss.ErrInvalid) - err = a.Init(context.TODO(), &l8oss.OssConfig{Metadata: []byte(confWithoutUidAndBucket)}) + err = a.Init(context.TODO(), &l8oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) assert.NotEqual(t, l8oss.ErrInvalid, err) assert.NotNil(t, a.client) @@ -56,7 +57,7 @@ func TestInitAliyunOss(t *testing.T) { func TestAliyunOss(t *testing.T) { instance := NewAliyunOss() - instance.Init(context.TODO(), &l8oss.OssConfig{Metadata: []byte(confWithoutUidAndBucket)}) + instance.Init(context.TODO(), &l8oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) appendObjectResp, err := instance.AppendObject(context.TODO(), &oss.AppendObjectInput{}) assert.NotNil(t, err) assert.Nil(t, appendObjectResp) diff --git a/components/oss/aws/oss.go b/components/oss/aws/oss.go index 988c5c8bbb..7573e3bd7c 100644 --- a/components/oss/aws/oss.go +++ b/components/oss/aws/oss.go @@ -42,38 +42,36 @@ import ( ) type AwsOss struct { - client *s3.Client - rawData json.RawMessage + client *s3.Client + basicConf json.RawMessage } func NewAwsOss() oss.Oss { return &AwsOss{} } -func (a *AwsOss) Init(ctx context.Context, config *oss.OssConfig) error { - a.rawData = config.Metadata - m := make([]*utils.OssMetadata, 0) - err := json.Unmarshal(config.Metadata, &m) +func (a *AwsOss) Init(ctx context.Context, config *oss.Config) error { + a.basicConf = config.Metadata[oss.BasicConfiguration] + m := &utils.OssMetadata{} + err := json.Unmarshal(a.basicConf, &m) if err != nil { return oss.ErrInvalid } - for _, data := range m { - optFunc := []func(options *aws_config.LoadOptions) error{ - aws_config.WithRegion(data.Region), - aws_config.WithCredentialsProvider(credentials.StaticCredentialsProvider{ - Value: aws.Credentials{ - AccessKeyID: data.AccessKeyID, SecretAccessKey: data.AccessKeySecret, - Source: "provider", - }, - }), - } - cfg, err := aws_config.LoadDefaultConfig(context.TODO(), optFunc...) - if err != nil { - return err - } - client := s3.NewFromConfig(cfg) - a.client = client + 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", + }, + }), + } + cfg, err := aws_config.LoadDefaultConfig(context.TODO(), optFunc...) + if err != nil { + return err } + client := s3.NewFromConfig(cfg) + a.client = client return nil } diff --git a/components/oss/aws/oss_test.go b/components/oss/aws/oss_test.go index 8ddc37a165..9745173f4b 100644 --- a/components/oss/aws/oss_test.go +++ b/components/oss/aws/oss_test.go @@ -18,6 +18,7 @@ package aws import ( "context" + "encoding/json" "errors" "testing" "time" @@ -34,18 +35,18 @@ import ( ) const ( - confWithoutUidAndBucket = `[ + confWithoutUidAndBucket = ` { "endpoint": "endpoint_address", "accessKeyID": "accessKey", "accessKeySecret": "secret" } - ]` + ` ) func TestAwsDefaultInitFunc(t *testing.T) { a := &AwsOss{} - err := a.Init(context.TODO(), &oss.OssConfig{Metadata: []byte("hello")}) + 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) @@ -53,7 +54,7 @@ func TestAwsDefaultInitFunc(t *testing.T) { func TestAwsOss(t *testing.T) { instance := &AwsOss{} - err := instance.Init(context.TODO(), &oss.OssConfig{Metadata: []byte(confWithoutUidAndBucket)}) + 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{}) diff --git a/components/oss/oss.go b/components/oss/oss.go index 6743286ff8..952b60867a 100644 --- a/components/oss/oss.go +++ b/components/oss/oss.go @@ -26,7 +26,7 @@ const ( ) type Oss interface { - Init(context.Context, *OssConfig) error + Init(context.Context, *Config) error GetObject(context.Context, *GetObjectInput) (*GetObjectOutput, error) PutObject(context.Context, *PutObjectInput) (*PutObjectOutput, error) DeleteObject(context.Context, *DeleteObjectInput) (*DeleteObjectOutput, error) @@ -55,13 +55,6 @@ type Oss interface { ListParts(context.Context, *ListPartsInput) (*ListPartsOutput, error) } -type BaseConfig struct { -} -type InitRequest struct { - App string - Metadata map[string]string -} - type GetObjectInput struct { Bucket string `json:"bucket,omitempty"` ExpectedBucketOwner string `json:"expected_bucket_owner,omitempty"` diff --git a/components/oss/registry.go b/components/oss/registry.go index 711319e4e8..5c337ad81c 100644 --- a/components/oss/registry.go +++ b/components/oss/registry.go @@ -22,45 +22,45 @@ import ( "mosn.io/layotto/components/pkg/info" ) -type OssRegistry interface { - Register(fs ...*OssFactory) +type Registry interface { + Register(fs ...*Factory) Create(name string) (Oss, error) } -type OssFactory struct { - Name string +type Factory struct { + CompType string FactoryMethod func() Oss } -func NewOssFactory(name string, f func() Oss) *OssFactory { - return &OssFactory{ - Name: name, +func NewOssFactory(compType string, f func() Oss) *Factory { + return &Factory{ + CompType: compType, FactoryMethod: f, } } -type OssStoreRegistry struct { - files map[string]func() Oss - info *info.RuntimeInfo +type registry struct { + oss map[string]func() Oss + info *info.RuntimeInfo } -func NewOssRegistry(info *info.RuntimeInfo) OssRegistry { +func NewRegistry(info *info.RuntimeInfo) Registry { info.AddService(ServiceName) - return &OssStoreRegistry{ - files: make(map[string]func() Oss), - info: info, + return ®istry{ + oss: make(map[string]func() Oss), + info: info, } } -func (r *OssStoreRegistry) Register(fs ...*OssFactory) { +func (r *registry) Register(fs ...*Factory) { for _, f := range fs { - r.files[f.Name] = f.FactoryMethod - r.info.RegisterComponent(ServiceName, f.Name) + r.oss[f.CompType] = f.FactoryMethod + r.info.RegisterComponent(ServiceName, f.CompType) } } -func (r *OssStoreRegistry) Create(compType string) (Oss, error) { - if f, ok := r.files[compType]; ok { +func (r *registry) Create(compType string) (Oss, error) { + if f, ok := r.oss[compType]; ok { r.info.LoadComponent(ServiceName, compType) return f(), nil } diff --git a/components/oss/types.go b/components/oss/types.go index 08f985cae2..f70149b0b6 100644 --- a/components/oss/types.go +++ b/components/oss/types.go @@ -21,12 +21,16 @@ import ( "errors" ) +const ( + BasicConfiguration = "basic_config" +) + var ( ErrInvalid = errors.New("invalid argument") ) -// OssConfig wraps configuration for a oss implementation -type OssConfig struct { - Metadata json.RawMessage `json:"metadata"` - Type string `json:"type"` +// Config wraps configuration for a oss implementation +type Config struct { + Metadata map[string]json.RawMessage `json:"metadata"` + Type string `json:"type"` } diff --git a/configs/config_oss.json b/configs/config_oss.json index 2d8401920b..702b32ba4f 100644 --- a/configs/config_oss.json +++ b/configs/config_oss.json @@ -19,14 +19,15 @@ "oss": { "oss_demo": { "type": "aws.oss", - "metadata": [ + "metadata": { - "region": "your-oss-resource-region", - "endpoint": "your-oss-resource-endpoint", - "accessKeyID": "your-oss-resource-accessKeyID", - "accessKeySecret": "your-oss-resource-accessKeySecret" + "basic_config":{ + "region": "your-oss-resource-region", + "endpoint": "your-oss-resource-endpoint", + "accessKeyID": "your-oss-resource-accessKeyID", + "accessKeySecret": "your-oss-resource-accessKeySecret" + } } - ] } } } diff --git a/docs/zh/start/oss/oss.md b/docs/zh/start/oss/oss.md index 5e64c1bdb0..c4480fe108 100644 --- a/docs/zh/start/oss/oss.md +++ b/docs/zh/start/oss/oss.md @@ -10,21 +10,21 @@ Layotto提供了访问OSS的示例 [demo](https://github.com/mosn/layotto/blob/m layotto提供了aws的配置文件`configs/oss.json`,配置文件内容如下所示: ```json - "grpc_config": { - "oss": { - "oss_demo": { - "type": "aws.oss", - "metadata": [ - { - "region": "your-oss-resource-region", - "endpoint": "your-oss-resource-endpoint", - "accessKeyID": "your-oss-resource-accessKeyID", - "accessKeySecret": "your-oss-resource-accessKeySecret" - } - ] - } - } - } +"grpc_config": { + "oss": { + "oss_demo": { + "type": "aws.oss", + "metadata": { + "basic_config":{ + "region": "your-oss-resource-region", + "endpoint": "your-oss-resource-endpoint", + "accessKeyID": "your-oss-resource-accessKeyID", + "accessKeySecret": "your-oss-resource-accessKeySecret" + } + } + } + } +} ``` 配置中对应的字段,需要替换成自己的OSS账号的配置。type 支持多种类型,例如 `aliyun.oss`对应阿里云的OSS服务, `aws.oss` 对应亚马逊云的 S3 服务。 diff --git a/pkg/mock/components/oss/oss.go b/pkg/mock/components/oss/oss.go index eb325bb886..8684b7ecd0 100644 --- a/pkg/mock/components/oss/oss.go +++ b/pkg/mock/components/oss/oss.go @@ -217,7 +217,7 @@ func (mr *MockOssMockRecorder) HeadObject(arg0, arg1 interface{}) *gomock.Call { } // Init mocks base method. -func (m *MockOss) Init(arg0 context.Context, arg1 *oss.OssConfig) error { +func (m *MockOss) Init(arg0 context.Context, arg1 *oss.Config) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Init", arg0, arg1) ret0, _ := ret[0].(error) diff --git a/pkg/runtime/config.go b/pkg/runtime/config.go index 03d0c5d047..b0a253ae5b 100644 --- a/pkg/runtime/config.go +++ b/pkg/runtime/config.go @@ -52,7 +52,7 @@ type MosnRuntimeConfig struct { PubSubManagement map[string]pubsub.Config `json:"pub_subs"` StateManagement map[string]state.Config `json:"state"` Files map[string]file.FileConfig `json:"file"` - Oss map[string]oss.OssConfig `json:"oss"` + Oss map[string]oss.Config `json:"oss"` LockManagement map[string]lock.Config `json:"lock"` SequencerManagement map[string]sequencer.Config `json:"sequencer"` Bindings map[string]bindings.Metadata `json:"bindings"` diff --git a/pkg/runtime/options.go b/pkg/runtime/options.go index bdd6c2dd8c..5afca36e25 100644 --- a/pkg/runtime/options.go +++ b/pkg/runtime/options.go @@ -42,7 +42,7 @@ type services struct { configStores []*configstores.StoreFactory rpcs []*rpc.Factory files []*file.FileFactory - oss []*oss.OssFactory + oss []*oss.Factory pubSubs []*pubsub.Factory states []*state.Factory locks []*runtime_lock.Factory @@ -132,7 +132,7 @@ func WithRpcFactory(rpcs ...*rpc.Factory) Option { } } -func WithOssFactory(oss ...*oss.OssFactory) Option { +func WithOssFactory(oss ...*oss.Factory) Option { return func(o *runtimeOptions) { o.services.oss = append(o.services.oss, oss...) } diff --git a/pkg/runtime/runtime.go b/pkg/runtime/runtime.go index 030ba5a090..f823d80f26 100644 --- a/pkg/runtime/runtime.go +++ b/pkg/runtime/runtime.go @@ -71,7 +71,7 @@ type MosnRuntime struct { lockRegistry runtime_lock.Registry sequencerRegistry runtime_sequencer.Registry fileRegistry file.Registry - ossRegistry oss.OssRegistry + ossRegistry oss.Registry bindingsRegistry mbindings.Registry secretStoresRegistry msecretstores.Registry customComponentRegistry custom.Registry @@ -117,7 +117,7 @@ func NewMosnRuntime(runtimeConfig *MosnRuntimeConfig) *MosnRuntime { stateRegistry: runtime_state.NewRegistry(info), bindingsRegistry: mbindings.NewRegistry(info), fileRegistry: file.NewRegistry(info), - ossRegistry: oss.NewOssRegistry(info), + ossRegistry: oss.NewRegistry(info), lockRegistry: runtime_lock.NewRegistry(info), sequencerRegistry: runtime_sequencer.NewRegistry(info), secretStoresRegistry: msecretstores.NewRegistry(info), @@ -411,7 +411,7 @@ func (m *MosnRuntime) initStates(factorys ...*runtime_state.Factory) error { return nil } -func (m *MosnRuntime) initOss(oss ...*oss.OssFactory) error { +func (m *MosnRuntime) initOss(oss ...*oss.Factory) error { log.DefaultLogger.Infof("[runtime] init oss service") // register all oss store services implementation diff --git a/pkg/runtime/runtime_test.go b/pkg/runtime/runtime_test.go index 3e1b78190e..6181ea8e61 100644 --- a/pkg/runtime/runtime_test.go +++ b/pkg/runtime/runtime_test.go @@ -840,7 +840,7 @@ func TestMosnRuntimeWithOssConfig(t *testing.T) { t.Run("normal", func(t *testing.T) { // 1. construct config cfg := &MosnRuntimeConfig{ - Oss: map[string]oss.OssConfig{ + Oss: map[string]oss.Config{ "awsdemo": {Type: "aws.oss"}, }, } diff --git a/spec/proto/extension/v1/oss.pb.go b/spec/proto/extension/v1/oss.pb.go index d399143479..dfe1b7c9d0 100644 --- a/spec/proto/extension/v1/oss.pb.go +++ b/spec/proto/extension/v1/oss.pb.go @@ -26,61 +26,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -type InitInput struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Metadata map[string]string `protobuf:"bytes,2,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` -} - -func (x *InitInput) Reset() { - *x = InitInput{} - if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *InitInput) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*InitInput) ProtoMessage() {} - -func (x *InitInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[0] - 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 InitInput.ProtoReflect.Descriptor instead. -func (*InitInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{0} -} - -func (x *InitInput) GetStoreName() string { - if x != nil { - return x.StoreName - } - return "" -} - -func (x *InitInput) GetMetadata() map[string]string { - if x != nil { - return x.Metadata - } - return nil -} - type GetObjectInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -152,7 +97,7 @@ type GetObjectInput struct { func (x *GetObjectInput) Reset() { *x = GetObjectInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[1] + mi := &file_oss_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -165,7 +110,7 @@ func (x *GetObjectInput) String() string { func (*GetObjectInput) ProtoMessage() {} func (x *GetObjectInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[1] + mi := &file_oss_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -178,7 +123,7 @@ func (x *GetObjectInput) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObjectInput.ProtoReflect.Descriptor instead. func (*GetObjectInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{1} + return file_oss_proto_rawDescGZIP(), []int{0} } func (x *GetObjectInput) GetStoreName() string { @@ -405,7 +350,7 @@ type GetObjectOutput struct { func (x *GetObjectOutput) Reset() { *x = GetObjectOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[2] + mi := &file_oss_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -418,7 +363,7 @@ func (x *GetObjectOutput) String() string { func (*GetObjectOutput) ProtoMessage() {} func (x *GetObjectOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[2] + mi := &file_oss_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -431,7 +376,7 @@ func (x *GetObjectOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObjectOutput.ProtoReflect.Descriptor instead. func (*GetObjectOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{2} + return file_oss_proto_rawDescGZIP(), []int{1} } func (x *GetObjectOutput) GetBody() []byte { @@ -612,7 +557,7 @@ type PutObjectInput struct { func (x *PutObjectInput) Reset() { *x = PutObjectInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[3] + mi := &file_oss_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -625,7 +570,7 @@ func (x *PutObjectInput) String() string { func (*PutObjectInput) ProtoMessage() {} func (x *PutObjectInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[3] + mi := &file_oss_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -638,7 +583,7 @@ func (x *PutObjectInput) ProtoReflect() protoreflect.Message { // Deprecated: Use PutObjectInput.ProtoReflect.Descriptor instead. func (*PutObjectInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{3} + return file_oss_proto_rawDescGZIP(), []int{2} } func (x *PutObjectInput) GetStoreName() string { @@ -760,7 +705,7 @@ type PutObjectOutput struct { func (x *PutObjectOutput) Reset() { *x = PutObjectOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[4] + mi := &file_oss_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -773,7 +718,7 @@ func (x *PutObjectOutput) String() string { func (*PutObjectOutput) ProtoMessage() {} func (x *PutObjectOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[4] + mi := &file_oss_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -786,7 +731,7 @@ func (x *PutObjectOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use PutObjectOutput.ProtoReflect.Descriptor instead. func (*PutObjectOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{4} + return file_oss_proto_rawDescGZIP(), []int{3} } func (x *PutObjectOutput) GetBucketKeyEnabled() bool { @@ -850,7 +795,7 @@ type DeleteObjectInput struct { func (x *DeleteObjectInput) Reset() { *x = DeleteObjectInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[5] + mi := &file_oss_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -863,7 +808,7 @@ func (x *DeleteObjectInput) String() string { func (*DeleteObjectInput) ProtoMessage() {} func (x *DeleteObjectInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[5] + mi := &file_oss_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -876,7 +821,7 @@ func (x *DeleteObjectInput) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteObjectInput.ProtoReflect.Descriptor instead. func (*DeleteObjectInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{5} + return file_oss_proto_rawDescGZIP(), []int{4} } func (x *DeleteObjectInput) GetStoreName() string { @@ -933,7 +878,7 @@ type DeleteObjectOutput struct { func (x *DeleteObjectOutput) Reset() { *x = DeleteObjectOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[6] + mi := &file_oss_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -946,7 +891,7 @@ func (x *DeleteObjectOutput) String() string { func (*DeleteObjectOutput) ProtoMessage() {} func (x *DeleteObjectOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[6] + mi := &file_oss_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -959,7 +904,7 @@ func (x *DeleteObjectOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteObjectOutput.ProtoReflect.Descriptor instead. func (*DeleteObjectOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{6} + return file_oss_proto_rawDescGZIP(), []int{5} } func (x *DeleteObjectOutput) GetDeleteMarker() bool { @@ -1004,7 +949,7 @@ type PutObjectTaggingInput struct { func (x *PutObjectTaggingInput) Reset() { *x = PutObjectTaggingInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[7] + mi := &file_oss_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1017,7 +962,7 @@ func (x *PutObjectTaggingInput) String() string { func (*PutObjectTaggingInput) ProtoMessage() {} func (x *PutObjectTaggingInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[7] + mi := &file_oss_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1030,7 +975,7 @@ func (x *PutObjectTaggingInput) ProtoReflect() protoreflect.Message { // Deprecated: Use PutObjectTaggingInput.ProtoReflect.Descriptor instead. func (*PutObjectTaggingInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{7} + return file_oss_proto_rawDescGZIP(), []int{6} } func (x *PutObjectTaggingInput) GetStoreName() string { @@ -1082,7 +1027,7 @@ type PutObjectTaggingOutput struct { func (x *PutObjectTaggingOutput) Reset() { *x = PutObjectTaggingOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[8] + mi := &file_oss_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1095,7 +1040,7 @@ func (x *PutObjectTaggingOutput) String() string { func (*PutObjectTaggingOutput) ProtoMessage() {} func (x *PutObjectTaggingOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[8] + mi := &file_oss_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1108,7 +1053,7 @@ func (x *PutObjectTaggingOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use PutObjectTaggingOutput.ProtoReflect.Descriptor instead. func (*PutObjectTaggingOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{8} + return file_oss_proto_rawDescGZIP(), []int{7} } func (x *PutObjectTaggingOutput) GetVersionId() string { @@ -1147,7 +1092,7 @@ type DeleteObjectTaggingInput struct { func (x *DeleteObjectTaggingInput) Reset() { *x = DeleteObjectTaggingInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[9] + mi := &file_oss_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1160,7 +1105,7 @@ func (x *DeleteObjectTaggingInput) String() string { func (*DeleteObjectTaggingInput) ProtoMessage() {} func (x *DeleteObjectTaggingInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[9] + mi := &file_oss_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1173,7 +1118,7 @@ func (x *DeleteObjectTaggingInput) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteObjectTaggingInput.ProtoReflect.Descriptor instead. func (*DeleteObjectTaggingInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{9} + return file_oss_proto_rawDescGZIP(), []int{8} } func (x *DeleteObjectTaggingInput) GetStoreName() string { @@ -1225,7 +1170,7 @@ type DeleteObjectTaggingOutput struct { func (x *DeleteObjectTaggingOutput) Reset() { *x = DeleteObjectTaggingOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[10] + mi := &file_oss_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1238,7 +1183,7 @@ func (x *DeleteObjectTaggingOutput) String() string { func (*DeleteObjectTaggingOutput) ProtoMessage() {} func (x *DeleteObjectTaggingOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[10] + mi := &file_oss_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1251,7 +1196,7 @@ func (x *DeleteObjectTaggingOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteObjectTaggingOutput.ProtoReflect.Descriptor instead. func (*DeleteObjectTaggingOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{10} + return file_oss_proto_rawDescGZIP(), []int{9} } func (x *DeleteObjectTaggingOutput) GetVersionId() string { @@ -1293,7 +1238,7 @@ type GetObjectTaggingInput struct { func (x *GetObjectTaggingInput) Reset() { *x = GetObjectTaggingInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[11] + mi := &file_oss_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1306,7 +1251,7 @@ func (x *GetObjectTaggingInput) String() string { func (*GetObjectTaggingInput) ProtoMessage() {} func (x *GetObjectTaggingInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[11] + mi := &file_oss_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1319,7 +1264,7 @@ func (x *GetObjectTaggingInput) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObjectTaggingInput.ProtoReflect.Descriptor instead. func (*GetObjectTaggingInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{11} + return file_oss_proto_rawDescGZIP(), []int{10} } func (x *GetObjectTaggingInput) GetStoreName() string { @@ -1381,7 +1326,7 @@ type GetObjectTaggingOutput struct { func (x *GetObjectTaggingOutput) Reset() { *x = GetObjectTaggingOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[12] + mi := &file_oss_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1394,7 +1339,7 @@ func (x *GetObjectTaggingOutput) String() string { func (*GetObjectTaggingOutput) ProtoMessage() {} func (x *GetObjectTaggingOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[12] + mi := &file_oss_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1407,7 +1352,7 @@ func (x *GetObjectTaggingOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObjectTaggingOutput.ProtoReflect.Descriptor instead. func (*GetObjectTaggingOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{12} + return file_oss_proto_rawDescGZIP(), []int{11} } func (x *GetObjectTaggingOutput) GetTags() map[string]string { @@ -1447,7 +1392,7 @@ type CopySource struct { func (x *CopySource) Reset() { *x = CopySource{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[13] + mi := &file_oss_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1460,7 +1405,7 @@ func (x *CopySource) String() string { func (*CopySource) ProtoMessage() {} func (x *CopySource) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[13] + mi := &file_oss_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1473,7 +1418,7 @@ func (x *CopySource) ProtoReflect() protoreflect.Message { // Deprecated: Use CopySource.ProtoReflect.Descriptor instead. func (*CopySource) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{13} + return file_oss_proto_rawDescGZIP(), []int{12} } func (x *CopySource) GetCopySourceBucket() string { @@ -1525,7 +1470,7 @@ type CopyObjectInput struct { func (x *CopyObjectInput) Reset() { *x = CopyObjectInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[14] + mi := &file_oss_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1538,7 +1483,7 @@ func (x *CopyObjectInput) String() string { func (*CopyObjectInput) ProtoMessage() {} func (x *CopyObjectInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[14] + mi := &file_oss_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1551,7 +1496,7 @@ func (x *CopyObjectInput) ProtoReflect() protoreflect.Message { // Deprecated: Use CopyObjectInput.ProtoReflect.Descriptor instead. func (*CopyObjectInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{14} + return file_oss_proto_rawDescGZIP(), []int{13} } func (x *CopyObjectInput) GetStoreName() string { @@ -1625,7 +1570,7 @@ type CopyObjectResult struct { func (x *CopyObjectResult) Reset() { *x = CopyObjectResult{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[15] + mi := &file_oss_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1638,7 +1583,7 @@ func (x *CopyObjectResult) String() string { func (*CopyObjectResult) ProtoMessage() {} func (x *CopyObjectResult) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[15] + mi := &file_oss_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1651,7 +1596,7 @@ func (x *CopyObjectResult) ProtoReflect() protoreflect.Message { // Deprecated: Use CopyObjectResult.ProtoReflect.Descriptor instead. func (*CopyObjectResult) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{15} + return file_oss_proto_rawDescGZIP(), []int{14} } func (x *CopyObjectResult) GetEtag() string { @@ -1684,7 +1629,7 @@ type CopyObjectOutput struct { func (x *CopyObjectOutput) Reset() { *x = CopyObjectOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[16] + mi := &file_oss_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1697,7 +1642,7 @@ func (x *CopyObjectOutput) String() string { func (*CopyObjectOutput) ProtoMessage() {} func (x *CopyObjectOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[16] + mi := &file_oss_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1710,7 +1655,7 @@ func (x *CopyObjectOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use CopyObjectOutput.ProtoReflect.Descriptor instead. func (*CopyObjectOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{16} + return file_oss_proto_rawDescGZIP(), []int{15} } func (x *CopyObjectOutput) GetCopyObjectResult() *CopyObjectResult { @@ -1748,7 +1693,7 @@ type Delete struct { func (x *Delete) Reset() { *x = Delete{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[17] + mi := &file_oss_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1761,7 +1706,7 @@ func (x *Delete) String() string { func (*Delete) ProtoMessage() {} func (x *Delete) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[17] + mi := &file_oss_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1774,7 +1719,7 @@ func (x *Delete) ProtoReflect() protoreflect.Message { // Deprecated: Use Delete.ProtoReflect.Descriptor instead. func (*Delete) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{17} + return file_oss_proto_rawDescGZIP(), []int{16} } func (x *Delete) GetObjects() []*ObjectIdentifier { @@ -1806,7 +1751,7 @@ type ObjectIdentifier struct { func (x *ObjectIdentifier) Reset() { *x = ObjectIdentifier{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[18] + mi := &file_oss_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1819,7 +1764,7 @@ func (x *ObjectIdentifier) String() string { func (*ObjectIdentifier) ProtoMessage() {} func (x *ObjectIdentifier) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[18] + mi := &file_oss_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1832,7 +1777,7 @@ func (x *ObjectIdentifier) ProtoReflect() protoreflect.Message { // Deprecated: Use ObjectIdentifier.ProtoReflect.Descriptor instead. func (*ObjectIdentifier) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{18} + return file_oss_proto_rawDescGZIP(), []int{17} } func (x *ObjectIdentifier) GetKey() string { @@ -1863,7 +1808,7 @@ type DeleteObjectsInput struct { func (x *DeleteObjectsInput) Reset() { *x = DeleteObjectsInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[19] + mi := &file_oss_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1876,7 +1821,7 @@ func (x *DeleteObjectsInput) String() string { func (*DeleteObjectsInput) ProtoMessage() {} func (x *DeleteObjectsInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[19] + mi := &file_oss_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1889,7 +1834,7 @@ func (x *DeleteObjectsInput) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteObjectsInput.ProtoReflect.Descriptor instead. func (*DeleteObjectsInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{19} + return file_oss_proto_rawDescGZIP(), []int{18} } func (x *DeleteObjectsInput) GetStoreName() string { @@ -1942,7 +1887,7 @@ type DeletedObject struct { func (x *DeletedObject) Reset() { *x = DeletedObject{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[20] + mi := &file_oss_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1955,7 +1900,7 @@ func (x *DeletedObject) String() string { func (*DeletedObject) ProtoMessage() {} func (x *DeletedObject) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[20] + mi := &file_oss_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1968,7 +1913,7 @@ func (x *DeletedObject) ProtoReflect() protoreflect.Message { // Deprecated: Use DeletedObject.ProtoReflect.Descriptor instead. func (*DeletedObject) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{20} + return file_oss_proto_rawDescGZIP(), []int{19} } func (x *DeletedObject) GetDeleteMarker() bool { @@ -2010,7 +1955,7 @@ type DeleteObjectsOutput struct { func (x *DeleteObjectsOutput) Reset() { *x = DeleteObjectsOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[21] + mi := &file_oss_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2023,7 +1968,7 @@ func (x *DeleteObjectsOutput) String() string { func (*DeleteObjectsOutput) ProtoMessage() {} func (x *DeleteObjectsOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[21] + mi := &file_oss_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2036,7 +1981,7 @@ func (x *DeleteObjectsOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteObjectsOutput.ProtoReflect.Descriptor instead. func (*DeleteObjectsOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{21} + return file_oss_proto_rawDescGZIP(), []int{20} } func (x *DeleteObjectsOutput) GetDeleted() []*DeletedObject { @@ -2084,7 +2029,7 @@ type ListObjectsInput struct { func (x *ListObjectsInput) Reset() { *x = ListObjectsInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[22] + mi := &file_oss_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2097,7 +2042,7 @@ func (x *ListObjectsInput) String() string { func (*ListObjectsInput) ProtoMessage() {} func (x *ListObjectsInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[22] + mi := &file_oss_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2110,7 +2055,7 @@ func (x *ListObjectsInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListObjectsInput.ProtoReflect.Descriptor instead. func (*ListObjectsInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{22} + return file_oss_proto_rawDescGZIP(), []int{21} } func (x *ListObjectsInput) GetStoreName() string { @@ -2212,7 +2157,7 @@ type ListObjectsOutput struct { func (x *ListObjectsOutput) Reset() { *x = ListObjectsOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[23] + mi := &file_oss_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2225,7 +2170,7 @@ func (x *ListObjectsOutput) String() string { func (*ListObjectsOutput) ProtoMessage() {} func (x *ListObjectsOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[23] + mi := &file_oss_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2238,7 +2183,7 @@ func (x *ListObjectsOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListObjectsOutput.ProtoReflect.Descriptor instead. func (*ListObjectsOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{23} + return file_oss_proto_rawDescGZIP(), []int{22} } func (x *ListObjectsOutput) GetCommonPrefixes() []string { @@ -2323,7 +2268,7 @@ type Owner struct { func (x *Owner) Reset() { *x = Owner{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[24] + mi := &file_oss_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2336,7 +2281,7 @@ func (x *Owner) String() string { func (*Owner) ProtoMessage() {} func (x *Owner) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[24] + mi := &file_oss_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2349,7 +2294,7 @@ func (x *Owner) ProtoReflect() protoreflect.Message { // Deprecated: Use Owner.ProtoReflect.Descriptor instead. func (*Owner) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{24} + return file_oss_proto_rawDescGZIP(), []int{23} } func (x *Owner) GetDisplayName() string { @@ -2389,7 +2334,7 @@ type Object struct { func (x *Object) Reset() { *x = Object{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[25] + mi := &file_oss_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2402,7 +2347,7 @@ func (x *Object) String() string { func (*Object) ProtoMessage() {} func (x *Object) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[25] + mi := &file_oss_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2415,7 +2360,7 @@ func (x *Object) ProtoReflect() protoreflect.Message { // Deprecated: Use Object.ProtoReflect.Descriptor instead. func (*Object) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{25} + return file_oss_proto_rawDescGZIP(), []int{24} } func (x *Object) GetEtag() string { @@ -2475,7 +2420,7 @@ type GetObjectCannedAclInput struct { func (x *GetObjectCannedAclInput) Reset() { *x = GetObjectCannedAclInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[26] + mi := &file_oss_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2488,7 +2433,7 @@ func (x *GetObjectCannedAclInput) String() string { func (*GetObjectCannedAclInput) ProtoMessage() {} func (x *GetObjectCannedAclInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[26] + mi := &file_oss_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2501,7 +2446,7 @@ func (x *GetObjectCannedAclInput) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObjectCannedAclInput.ProtoReflect.Descriptor instead. func (*GetObjectCannedAclInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{26} + return file_oss_proto_rawDescGZIP(), []int{25} } func (x *GetObjectCannedAclInput) GetStoreName() string { @@ -2547,7 +2492,7 @@ type GetObjectCannedAclOutput struct { func (x *GetObjectCannedAclOutput) Reset() { *x = GetObjectCannedAclOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[27] + mi := &file_oss_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2560,7 +2505,7 @@ func (x *GetObjectCannedAclOutput) String() string { func (*GetObjectCannedAclOutput) ProtoMessage() {} func (x *GetObjectCannedAclOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[27] + mi := &file_oss_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2573,7 +2518,7 @@ func (x *GetObjectCannedAclOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObjectCannedAclOutput.ProtoReflect.Descriptor instead. func (*GetObjectCannedAclOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{27} + return file_oss_proto_rawDescGZIP(), []int{26} } func (x *GetObjectCannedAclOutput) GetCannedAcl() string { @@ -2614,7 +2559,7 @@ type PutObjectCannedAclInput struct { func (x *PutObjectCannedAclInput) Reset() { *x = PutObjectCannedAclInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[28] + mi := &file_oss_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2627,7 +2572,7 @@ func (x *PutObjectCannedAclInput) String() string { func (*PutObjectCannedAclInput) ProtoMessage() {} func (x *PutObjectCannedAclInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[28] + mi := &file_oss_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2640,7 +2585,7 @@ func (x *PutObjectCannedAclInput) ProtoReflect() protoreflect.Message { // Deprecated: Use PutObjectCannedAclInput.ProtoReflect.Descriptor instead. func (*PutObjectCannedAclInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{28} + return file_oss_proto_rawDescGZIP(), []int{27} } func (x *PutObjectCannedAclInput) GetStoreName() string { @@ -2689,7 +2634,7 @@ type PutObjectCannedAclOutput struct { func (x *PutObjectCannedAclOutput) Reset() { *x = PutObjectCannedAclOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[29] + mi := &file_oss_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2702,7 +2647,7 @@ func (x *PutObjectCannedAclOutput) String() string { func (*PutObjectCannedAclOutput) ProtoMessage() {} func (x *PutObjectCannedAclOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[29] + mi := &file_oss_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2715,7 +2660,7 @@ func (x *PutObjectCannedAclOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use PutObjectCannedAclOutput.ProtoReflect.Descriptor instead. func (*PutObjectCannedAclOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{29} + return file_oss_proto_rawDescGZIP(), []int{28} } func (x *PutObjectCannedAclOutput) GetRequestCharged() string { @@ -2740,7 +2685,7 @@ type RestoreObjectInput struct { func (x *RestoreObjectInput) Reset() { *x = RestoreObjectInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[30] + mi := &file_oss_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2753,7 +2698,7 @@ func (x *RestoreObjectInput) String() string { func (*RestoreObjectInput) ProtoMessage() {} func (x *RestoreObjectInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[30] + mi := &file_oss_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2766,7 +2711,7 @@ func (x *RestoreObjectInput) ProtoReflect() protoreflect.Message { // Deprecated: Use RestoreObjectInput.ProtoReflect.Descriptor instead. func (*RestoreObjectInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{30} + return file_oss_proto_rawDescGZIP(), []int{29} } func (x *RestoreObjectInput) GetStoreName() string { @@ -2813,7 +2758,7 @@ type RestoreObjectOutput struct { func (x *RestoreObjectOutput) Reset() { *x = RestoreObjectOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[31] + mi := &file_oss_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2826,7 +2771,7 @@ func (x *RestoreObjectOutput) String() string { func (*RestoreObjectOutput) ProtoMessage() {} func (x *RestoreObjectOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[31] + mi := &file_oss_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2839,7 +2784,7 @@ func (x *RestoreObjectOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use RestoreObjectOutput.ProtoReflect.Descriptor instead. func (*RestoreObjectOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{31} + return file_oss_proto_rawDescGZIP(), []int{30} } func (x *RestoreObjectOutput) GetRequestCharged() string { @@ -2902,7 +2847,7 @@ type CreateMultipartUploadInput struct { func (x *CreateMultipartUploadInput) Reset() { *x = CreateMultipartUploadInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[32] + mi := &file_oss_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2915,7 +2860,7 @@ func (x *CreateMultipartUploadInput) String() string { func (*CreateMultipartUploadInput) ProtoMessage() {} func (x *CreateMultipartUploadInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[32] + mi := &file_oss_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2928,7 +2873,7 @@ func (x *CreateMultipartUploadInput) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateMultipartUploadInput.ProtoReflect.Descriptor instead. func (*CreateMultipartUploadInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{32} + return file_oss_proto_rawDescGZIP(), []int{31} } func (x *CreateMultipartUploadInput) GetStoreName() string { @@ -3164,7 +3109,7 @@ type CreateMultipartUploadOutput struct { func (x *CreateMultipartUploadOutput) Reset() { *x = CreateMultipartUploadOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[33] + mi := &file_oss_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3177,7 +3122,7 @@ func (x *CreateMultipartUploadOutput) String() string { func (*CreateMultipartUploadOutput) ProtoMessage() {} func (x *CreateMultipartUploadOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[33] + mi := &file_oss_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3190,7 +3135,7 @@ func (x *CreateMultipartUploadOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateMultipartUploadOutput.ProtoReflect.Descriptor instead. func (*CreateMultipartUploadOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{33} + return file_oss_proto_rawDescGZIP(), []int{32} } func (x *CreateMultipartUploadOutput) GetBucket() string { @@ -3307,7 +3252,7 @@ type UploadPartInput struct { func (x *UploadPartInput) Reset() { *x = UploadPartInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[34] + mi := &file_oss_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3320,7 +3265,7 @@ func (x *UploadPartInput) String() string { func (*UploadPartInput) ProtoMessage() {} func (x *UploadPartInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[34] + mi := &file_oss_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3333,7 +3278,7 @@ func (x *UploadPartInput) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadPartInput.ProtoReflect.Descriptor instead. func (*UploadPartInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{34} + return file_oss_proto_rawDescGZIP(), []int{33} } func (x *UploadPartInput) GetStoreName() string { @@ -3445,7 +3390,7 @@ type UploadPartOutput struct { func (x *UploadPartOutput) Reset() { *x = UploadPartOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[35] + mi := &file_oss_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3458,7 +3403,7 @@ func (x *UploadPartOutput) String() string { func (*UploadPartOutput) ProtoMessage() {} func (x *UploadPartOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[35] + mi := &file_oss_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3471,7 +3416,7 @@ func (x *UploadPartOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadPartOutput.ProtoReflect.Descriptor instead. func (*UploadPartOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{35} + return file_oss_proto_rawDescGZIP(), []int{34} } func (x *UploadPartOutput) GetBucketKeyEnabled() bool { @@ -3546,7 +3491,7 @@ type UploadPartCopyInput struct { func (x *UploadPartCopyInput) Reset() { *x = UploadPartCopyInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[36] + mi := &file_oss_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3559,7 +3504,7 @@ func (x *UploadPartCopyInput) String() string { func (*UploadPartCopyInput) ProtoMessage() {} func (x *UploadPartCopyInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[36] + mi := &file_oss_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3572,7 +3517,7 @@ func (x *UploadPartCopyInput) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadPartCopyInput.ProtoReflect.Descriptor instead. func (*UploadPartCopyInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{36} + return file_oss_proto_rawDescGZIP(), []int{35} } func (x *UploadPartCopyInput) GetStoreName() string { @@ -3644,7 +3589,7 @@ type CopyPartResult struct { func (x *CopyPartResult) Reset() { *x = CopyPartResult{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[37] + mi := &file_oss_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3657,7 +3602,7 @@ func (x *CopyPartResult) String() string { func (*CopyPartResult) ProtoMessage() {} func (x *CopyPartResult) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[37] + mi := &file_oss_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3670,7 +3615,7 @@ func (x *CopyPartResult) ProtoReflect() protoreflect.Message { // Deprecated: Use CopyPartResult.ProtoReflect.Descriptor instead. func (*CopyPartResult) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{37} + return file_oss_proto_rawDescGZIP(), []int{36} } func (x *CopyPartResult) GetEtag() string { @@ -3705,7 +3650,7 @@ type UploadPartCopyOutput struct { func (x *UploadPartCopyOutput) Reset() { *x = UploadPartCopyOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[38] + mi := &file_oss_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3718,7 +3663,7 @@ func (x *UploadPartCopyOutput) String() string { func (*UploadPartCopyOutput) ProtoMessage() {} func (x *UploadPartCopyOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[38] + mi := &file_oss_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3731,7 +3676,7 @@ func (x *UploadPartCopyOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadPartCopyOutput.ProtoReflect.Descriptor instead. func (*UploadPartCopyOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{38} + return file_oss_proto_rawDescGZIP(), []int{37} } func (x *UploadPartCopyOutput) GetBucketKeyEnabled() bool { @@ -3802,7 +3747,7 @@ type CompletedPart struct { func (x *CompletedPart) Reset() { *x = CompletedPart{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[39] + mi := &file_oss_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3815,7 +3760,7 @@ func (x *CompletedPart) String() string { func (*CompletedPart) ProtoMessage() {} func (x *CompletedPart) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[39] + mi := &file_oss_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3828,7 +3773,7 @@ func (x *CompletedPart) ProtoReflect() protoreflect.Message { // Deprecated: Use CompletedPart.ProtoReflect.Descriptor instead. func (*CompletedPart) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{39} + return file_oss_proto_rawDescGZIP(), []int{38} } func (x *CompletedPart) GetEtag() string { @@ -3857,7 +3802,7 @@ type CompletedMultipartUpload struct { func (x *CompletedMultipartUpload) Reset() { *x = CompletedMultipartUpload{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[40] + mi := &file_oss_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3870,7 +3815,7 @@ func (x *CompletedMultipartUpload) String() string { func (*CompletedMultipartUpload) ProtoMessage() {} func (x *CompletedMultipartUpload) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[40] + mi := &file_oss_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3883,7 +3828,7 @@ func (x *CompletedMultipartUpload) ProtoReflect() protoreflect.Message { // Deprecated: Use CompletedMultipartUpload.ProtoReflect.Descriptor instead. func (*CompletedMultipartUpload) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{40} + return file_oss_proto_rawDescGZIP(), []int{39} } func (x *CompletedMultipartUpload) GetParts() []*CompletedPart { @@ -3913,7 +3858,7 @@ type CompleteMultipartUploadInput struct { func (x *CompleteMultipartUploadInput) Reset() { *x = CompleteMultipartUploadInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[41] + mi := &file_oss_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3926,7 +3871,7 @@ func (x *CompleteMultipartUploadInput) String() string { func (*CompleteMultipartUploadInput) ProtoMessage() {} func (x *CompleteMultipartUploadInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[41] + mi := &file_oss_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3939,7 +3884,7 @@ func (x *CompleteMultipartUploadInput) ProtoReflect() protoreflect.Message { // Deprecated: Use CompleteMultipartUploadInput.ProtoReflect.Descriptor instead. func (*CompleteMultipartUploadInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{41} + return file_oss_proto_rawDescGZIP(), []int{40} } func (x *CompleteMultipartUploadInput) GetStoreName() string { @@ -4018,7 +3963,7 @@ type CompleteMultipartUploadOutput struct { func (x *CompleteMultipartUploadOutput) Reset() { *x = CompleteMultipartUploadOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[42] + mi := &file_oss_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4031,7 +3976,7 @@ func (x *CompleteMultipartUploadOutput) String() string { func (*CompleteMultipartUploadOutput) ProtoMessage() {} func (x *CompleteMultipartUploadOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[42] + mi := &file_oss_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4044,7 +3989,7 @@ func (x *CompleteMultipartUploadOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use CompleteMultipartUploadOutput.ProtoReflect.Descriptor instead. func (*CompleteMultipartUploadOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{42} + return file_oss_proto_rawDescGZIP(), []int{41} } func (x *CompleteMultipartUploadOutput) GetBucket() string { @@ -4135,7 +4080,7 @@ type AbortMultipartUploadInput struct { func (x *AbortMultipartUploadInput) Reset() { *x = AbortMultipartUploadInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[43] + mi := &file_oss_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4148,7 +4093,7 @@ func (x *AbortMultipartUploadInput) String() string { func (*AbortMultipartUploadInput) ProtoMessage() {} func (x *AbortMultipartUploadInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[43] + mi := &file_oss_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4161,7 +4106,7 @@ func (x *AbortMultipartUploadInput) ProtoReflect() protoreflect.Message { // Deprecated: Use AbortMultipartUploadInput.ProtoReflect.Descriptor instead. func (*AbortMultipartUploadInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{43} + return file_oss_proto_rawDescGZIP(), []int{42} } func (x *AbortMultipartUploadInput) GetStoreName() string { @@ -4218,7 +4163,7 @@ type AbortMultipartUploadOutput struct { func (x *AbortMultipartUploadOutput) Reset() { *x = AbortMultipartUploadOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[44] + mi := &file_oss_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4231,7 +4176,7 @@ func (x *AbortMultipartUploadOutput) String() string { func (*AbortMultipartUploadOutput) ProtoMessage() {} func (x *AbortMultipartUploadOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[44] + mi := &file_oss_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4244,7 +4189,7 @@ func (x *AbortMultipartUploadOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use AbortMultipartUploadOutput.ProtoReflect.Descriptor instead. func (*AbortMultipartUploadOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{44} + return file_oss_proto_rawDescGZIP(), []int{43} } func (x *AbortMultipartUploadOutput) GetRequestCharged() string { @@ -4297,7 +4242,7 @@ type ListMultipartUploadsInput struct { func (x *ListMultipartUploadsInput) Reset() { *x = ListMultipartUploadsInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[45] + mi := &file_oss_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4310,7 +4255,7 @@ func (x *ListMultipartUploadsInput) String() string { func (*ListMultipartUploadsInput) ProtoMessage() {} func (x *ListMultipartUploadsInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[45] + mi := &file_oss_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4323,7 +4268,7 @@ func (x *ListMultipartUploadsInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMultipartUploadsInput.ProtoReflect.Descriptor instead. func (*ListMultipartUploadsInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{45} + return file_oss_proto_rawDescGZIP(), []int{44} } func (x *ListMultipartUploadsInput) GetStoreName() string { @@ -4401,7 +4346,7 @@ type Initiator struct { func (x *Initiator) Reset() { *x = Initiator{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[46] + mi := &file_oss_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4414,7 +4359,7 @@ func (x *Initiator) String() string { func (*Initiator) ProtoMessage() {} func (x *Initiator) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[46] + mi := &file_oss_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4427,7 +4372,7 @@ func (x *Initiator) ProtoReflect() protoreflect.Message { // Deprecated: Use Initiator.ProtoReflect.Descriptor instead. func (*Initiator) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{46} + return file_oss_proto_rawDescGZIP(), []int{45} } func (x *Initiator) GetDisplayName() string { @@ -4460,7 +4405,7 @@ type MultipartUpload struct { func (x *MultipartUpload) Reset() { *x = MultipartUpload{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[47] + mi := &file_oss_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4473,7 +4418,7 @@ func (x *MultipartUpload) String() string { func (*MultipartUpload) ProtoMessage() {} func (x *MultipartUpload) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[47] + mi := &file_oss_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4486,7 +4431,7 @@ func (x *MultipartUpload) ProtoReflect() protoreflect.Message { // Deprecated: Use MultipartUpload.ProtoReflect.Descriptor instead. func (*MultipartUpload) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{47} + return file_oss_proto_rawDescGZIP(), []int{46} } func (x *MultipartUpload) GetInitiated() int64 { @@ -4569,7 +4514,7 @@ type ListMultipartUploadsOutput struct { func (x *ListMultipartUploadsOutput) Reset() { *x = ListMultipartUploadsOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[48] + mi := &file_oss_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4582,7 +4527,7 @@ func (x *ListMultipartUploadsOutput) String() string { func (*ListMultipartUploadsOutput) ProtoMessage() {} func (x *ListMultipartUploadsOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[48] + mi := &file_oss_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4595,7 +4540,7 @@ func (x *ListMultipartUploadsOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMultipartUploadsOutput.ProtoReflect.Descriptor instead. func (*ListMultipartUploadsOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{48} + return file_oss_proto_rawDescGZIP(), []int{47} } func (x *ListMultipartUploadsOutput) GetBucket() string { @@ -4718,7 +4663,7 @@ type ListObjectVersionsInput struct { func (x *ListObjectVersionsInput) Reset() { *x = ListObjectVersionsInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[49] + mi := &file_oss_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4731,7 +4676,7 @@ func (x *ListObjectVersionsInput) String() string { func (*ListObjectVersionsInput) ProtoMessage() {} func (x *ListObjectVersionsInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[49] + mi := &file_oss_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4744,7 +4689,7 @@ func (x *ListObjectVersionsInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListObjectVersionsInput.ProtoReflect.Descriptor instead. func (*ListObjectVersionsInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{49} + return file_oss_proto_rawDescGZIP(), []int{48} } func (x *ListObjectVersionsInput) GetStoreName() string { @@ -4829,7 +4774,7 @@ type DeleteMarkerEntry struct { func (x *DeleteMarkerEntry) Reset() { *x = DeleteMarkerEntry{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[50] + mi := &file_oss_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4842,7 +4787,7 @@ func (x *DeleteMarkerEntry) String() string { func (*DeleteMarkerEntry) ProtoMessage() {} func (x *DeleteMarkerEntry) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[50] + mi := &file_oss_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4855,7 +4800,7 @@ func (x *DeleteMarkerEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteMarkerEntry.ProtoReflect.Descriptor instead. func (*DeleteMarkerEntry) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{50} + return file_oss_proto_rawDescGZIP(), []int{49} } func (x *DeleteMarkerEntry) GetIsLatest() bool { @@ -4913,7 +4858,7 @@ type ObjectVersion struct { func (x *ObjectVersion) Reset() { *x = ObjectVersion{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[51] + mi := &file_oss_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4926,7 +4871,7 @@ func (x *ObjectVersion) String() string { func (*ObjectVersion) ProtoMessage() {} func (x *ObjectVersion) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[51] + mi := &file_oss_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4939,7 +4884,7 @@ func (x *ObjectVersion) ProtoReflect() protoreflect.Message { // Deprecated: Use ObjectVersion.ProtoReflect.Descriptor instead. func (*ObjectVersion) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{51} + return file_oss_proto_rawDescGZIP(), []int{50} } func (x *ObjectVersion) GetEtag() string { @@ -5022,7 +4967,7 @@ type ListObjectVersionsOutput struct { func (x *ListObjectVersionsOutput) Reset() { *x = ListObjectVersionsOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[52] + mi := &file_oss_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5035,7 +4980,7 @@ func (x *ListObjectVersionsOutput) String() string { func (*ListObjectVersionsOutput) ProtoMessage() {} func (x *ListObjectVersionsOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[52] + mi := &file_oss_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5048,7 +4993,7 @@ func (x *ListObjectVersionsOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListObjectVersionsOutput.ProtoReflect.Descriptor instead. func (*ListObjectVersionsOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{52} + return file_oss_proto_rawDescGZIP(), []int{51} } func (x *ListObjectVersionsOutput) GetCommonPrefixes() []string { @@ -5173,7 +5118,7 @@ type HeadObjectInput struct { func (x *HeadObjectInput) Reset() { *x = HeadObjectInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[53] + mi := &file_oss_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5186,7 +5131,7 @@ func (x *HeadObjectInput) String() string { func (*HeadObjectInput) ProtoMessage() {} func (x *HeadObjectInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[53] + mi := &file_oss_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5199,7 +5144,7 @@ func (x *HeadObjectInput) ProtoReflect() protoreflect.Message { // Deprecated: Use HeadObjectInput.ProtoReflect.Descriptor instead. func (*HeadObjectInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{53} + return file_oss_proto_rawDescGZIP(), []int{52} } func (x *HeadObjectInput) GetStoreName() string { @@ -5326,7 +5271,7 @@ type HeadObjectOutput struct { func (x *HeadObjectOutput) Reset() { *x = HeadObjectOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[54] + mi := &file_oss_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5339,7 +5284,7 @@ func (x *HeadObjectOutput) String() string { func (*HeadObjectOutput) ProtoMessage() {} func (x *HeadObjectOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[54] + mi := &file_oss_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5352,7 +5297,7 @@ func (x *HeadObjectOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use HeadObjectOutput.ProtoReflect.Descriptor instead. func (*HeadObjectOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{54} + return file_oss_proto_rawDescGZIP(), []int{53} } func (x *HeadObjectOutput) GetResultMetadata() map[string]string { @@ -5376,7 +5321,7 @@ type IsObjectExistInput struct { func (x *IsObjectExistInput) Reset() { *x = IsObjectExistInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[55] + mi := &file_oss_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5389,7 +5334,7 @@ func (x *IsObjectExistInput) String() string { func (*IsObjectExistInput) ProtoMessage() {} func (x *IsObjectExistInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[55] + mi := &file_oss_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5402,7 +5347,7 @@ func (x *IsObjectExistInput) ProtoReflect() protoreflect.Message { // Deprecated: Use IsObjectExistInput.ProtoReflect.Descriptor instead. func (*IsObjectExistInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{55} + return file_oss_proto_rawDescGZIP(), []int{54} } func (x *IsObjectExistInput) GetStoreName() string { @@ -5444,7 +5389,7 @@ type IsObjectExistOutput struct { func (x *IsObjectExistOutput) Reset() { *x = IsObjectExistOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[56] + mi := &file_oss_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5457,7 +5402,7 @@ func (x *IsObjectExistOutput) String() string { func (*IsObjectExistOutput) ProtoMessage() {} func (x *IsObjectExistOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[56] + mi := &file_oss_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5470,7 +5415,7 @@ func (x *IsObjectExistOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use IsObjectExistOutput.ProtoReflect.Descriptor instead. func (*IsObjectExistOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{56} + return file_oss_proto_rawDescGZIP(), []int{55} } func (x *IsObjectExistOutput) GetFileExist() bool { @@ -5497,7 +5442,7 @@ type SignURLInput struct { func (x *SignURLInput) Reset() { *x = SignURLInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[57] + mi := &file_oss_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5510,7 +5455,7 @@ func (x *SignURLInput) String() string { func (*SignURLInput) ProtoMessage() {} func (x *SignURLInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[57] + mi := &file_oss_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5523,7 +5468,7 @@ func (x *SignURLInput) ProtoReflect() protoreflect.Message { // Deprecated: Use SignURLInput.ProtoReflect.Descriptor instead. func (*SignURLInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{57} + return file_oss_proto_rawDescGZIP(), []int{56} } func (x *SignURLInput) GetStoreName() string { @@ -5572,7 +5517,7 @@ type SignURLOutput struct { func (x *SignURLOutput) Reset() { *x = SignURLOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[58] + mi := &file_oss_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5585,7 +5530,7 @@ func (x *SignURLOutput) String() string { func (*SignURLOutput) ProtoMessage() {} func (x *SignURLOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[58] + mi := &file_oss_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5598,7 +5543,7 @@ func (x *SignURLOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use SignURLOutput.ProtoReflect.Descriptor instead. func (*SignURLOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{58} + return file_oss_proto_rawDescGZIP(), []int{57} } func (x *SignURLOutput) GetSignedUrl() string { @@ -5623,7 +5568,7 @@ type UpdateBandwidthRateLimitInput struct { func (x *UpdateBandwidthRateLimitInput) Reset() { *x = UpdateBandwidthRateLimitInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[59] + mi := &file_oss_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5636,7 +5581,7 @@ func (x *UpdateBandwidthRateLimitInput) String() string { func (*UpdateBandwidthRateLimitInput) ProtoMessage() {} func (x *UpdateBandwidthRateLimitInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[59] + mi := &file_oss_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5649,7 +5594,7 @@ func (x *UpdateBandwidthRateLimitInput) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateBandwidthRateLimitInput.ProtoReflect.Descriptor instead. func (*UpdateBandwidthRateLimitInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{59} + return file_oss_proto_rawDescGZIP(), []int{58} } func (x *UpdateBandwidthRateLimitInput) GetStoreName() string { @@ -5698,7 +5643,7 @@ type AppendObjectInput struct { func (x *AppendObjectInput) Reset() { *x = AppendObjectInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[60] + mi := &file_oss_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5711,7 +5656,7 @@ func (x *AppendObjectInput) String() string { func (*AppendObjectInput) ProtoMessage() {} func (x *AppendObjectInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[60] + mi := &file_oss_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5724,7 +5669,7 @@ func (x *AppendObjectInput) ProtoReflect() protoreflect.Message { // Deprecated: Use AppendObjectInput.ProtoReflect.Descriptor instead. func (*AppendObjectInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{60} + return file_oss_proto_rawDescGZIP(), []int{59} } func (x *AppendObjectInput) GetStoreName() string { @@ -5843,7 +5788,7 @@ type AppendObjectOutput struct { func (x *AppendObjectOutput) Reset() { *x = AppendObjectOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[61] + mi := &file_oss_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5856,7 +5801,7 @@ func (x *AppendObjectOutput) String() string { func (*AppendObjectOutput) ProtoMessage() {} func (x *AppendObjectOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[61] + mi := &file_oss_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5869,7 +5814,7 @@ func (x *AppendObjectOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use AppendObjectOutput.ProtoReflect.Descriptor instead. func (*AppendObjectOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{61} + return file_oss_proto_rawDescGZIP(), []int{60} } func (x *AppendObjectOutput) GetAppendPosition() int64 { @@ -5897,7 +5842,7 @@ type ListPartsInput struct { func (x *ListPartsInput) Reset() { *x = ListPartsInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[62] + mi := &file_oss_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5910,7 +5855,7 @@ func (x *ListPartsInput) String() string { func (*ListPartsInput) ProtoMessage() {} func (x *ListPartsInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[62] + mi := &file_oss_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5923,7 +5868,7 @@ func (x *ListPartsInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPartsInput.ProtoReflect.Descriptor instead. func (*ListPartsInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{62} + return file_oss_proto_rawDescGZIP(), []int{61} } func (x *ListPartsInput) GetStoreName() string { @@ -5996,7 +5941,7 @@ type Part struct { func (x *Part) Reset() { *x = Part{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[63] + mi := &file_oss_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6009,7 +5954,7 @@ func (x *Part) String() string { func (*Part) ProtoMessage() {} func (x *Part) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[63] + mi := &file_oss_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6022,7 +5967,7 @@ func (x *Part) ProtoReflect() protoreflect.Message { // Deprecated: Use Part.ProtoReflect.Descriptor instead. func (*Part) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{63} + return file_oss_proto_rawDescGZIP(), []int{62} } func (x *Part) GetEtag() string { @@ -6080,7 +6025,7 @@ type ListPartsOutput struct { func (x *ListPartsOutput) Reset() { *x = ListPartsOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[64] + mi := &file_oss_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6093,7 +6038,7 @@ func (x *ListPartsOutput) String() string { func (*ListPartsOutput) ProtoMessage() {} func (x *ListPartsOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[64] + mi := &file_oss_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6106,7 +6051,7 @@ func (x *ListPartsOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPartsOutput.ProtoReflect.Descriptor instead. func (*ListPartsOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{64} + return file_oss_proto_rawDescGZIP(), []int{63} } func (x *ListPartsOutput) GetBucket() string { @@ -6165,391 +6110,854 @@ var file_oss_proto_rawDesc = []byte{ 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 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, 0xb5, 0x01, 0x0a, 0x09, 0x49, 0x6e, 0x69, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, + 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, 0x18, 0x05, 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, 0x06, 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, 0x07, 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, 0x08, 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, 0x09, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x12, 0x40, 0x0a, 0x1c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x3a, + 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x29, + 0x0a, 0x10, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 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, 0x13, 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, 0x14, 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, 0x15, 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, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x63, 0x63, + 0x65, 0x70, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x17, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, + 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x72, 0x6c, + 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x55, 0x72, + 0x6c, 0x22, 0xeb, 0x05, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x02, 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, 0x03, 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, 0x04, 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, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, + 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, + 0x67, 0x18, 0x0a, 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, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, + 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, + 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, + 0x61, 0x67, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, + 0x74, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1f, 0x0a, + 0x0b, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x52, + 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, + 0x32, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 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, 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, + 0xa9, 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, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x05, 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, 0x06, 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, 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, + 0x45, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 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, 0x4e, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, + 0x67, 0x18, 0x0e, 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, 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, 0x4c, - 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 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, 0x49, 0x6e, 0x69, 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, 0x3b, 0x0a, 0x0d, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 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, 0x86, 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, 0x4c, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 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, 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, 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, 0x18, 0x05, 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, 0x06, 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, 0x07, 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, 0x08, 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, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, - 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x23, 0x0a, - 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, - 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, - 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x14, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x40, 0x0a, 0x1c, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x44, - 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, - 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, - 0x61, 0x67, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, - 0x67, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x13, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, - 0x73, 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, 0x13, 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, 0x14, 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, 0x15, 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, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, - 0x64, 0x69, 0x6e, 0x67, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x63, 0x65, - 0x70, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x69, - 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x55, 0x72, 0x6c, 0x22, 0xeb, 0x05, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, - 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x18, 0x02, 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, 0x03, 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, 0x04, 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, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x25, 0x0a, - 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x65, - 0x6e, 0x67, 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x72, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x0a, 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, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x12, - 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x69, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x67, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x74, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, - 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x52, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 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, 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, 0xa9, 0x05, 0x0a, 0x0e, 0x50, 0x75, 0x74, 0x4f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe8, 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, 0x6c, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 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, 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, 0xee, 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, 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, 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, 0xf0, 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, 0x4d, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 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, 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, 0x6c, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 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, 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, 0x87, 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, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x16, 0x0a, - 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x05, - 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, - 0x06, 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, 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, 0x45, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, - 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, + 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, 0x44, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 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, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0a, 0x63, + 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4f, 0x0a, 0x07, 0x74, 0x61, 0x67, + 0x67, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 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, 0x52, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, - 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, 0x4e, - 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x0e, 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, 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, + 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, 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, 0x86, 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, 0x4c, 0x0a, 0x04, 0x74, - 0x61, 0x67, 0x73, 0x18, 0x04, 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, 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, 0xe8, 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, 0x6c, 0x0a, 0x0f, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, - 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, 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, + 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, 0xaa, 0x01, + 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x12, 0x57, 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, 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, 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, 0x63, 0x0a, 0x06, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 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, + 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, 0xa9, 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, 0x37, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 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, 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, 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, 0xee, 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, 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, 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, 0xf0, 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, 0x4d, 0x0a, 0x04, - 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x73, 0x70, 0x65, + 0x64, 0x22, 0x57, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 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, 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, 0xdf, 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, 0x3b, 0x0a, 0x08, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 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, 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, 0xc2, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1e, 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, 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, 0x98, 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, + 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, + 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, 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, 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, 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, 0xef, 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, 0x5e, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 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, 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, 0x6c, 0x0a, 0x0f, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 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, 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, 0x87, - 0x04, 0x0a, 0x0f, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, + 0x6e, 0x2e, 0x76, 0x31, 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, 0x5a, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, + 0x69, 0x6e, 0x67, 0x18, 0x1d, 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, 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, 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, 0xa6, 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, 0x44, 0x0a, + 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 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, 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, 0xb7, 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, 0x51, 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, 0x27, 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, 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, 0x58, 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, 0x3c, 0x0a, 0x05, + 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 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, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, + 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x22, 0xbb, 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, 0x5c, 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, 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, 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, 0x44, 0x0a, 0x0b, 0x63, - 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x23, 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, 0x43, 0x6f, 0x70, 0x79, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x4f, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0b, 0x32, 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, 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, 0x52, 0x0a, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 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, 0xaa, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x57, 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, 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, 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, 0x63, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x07, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 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, 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, 0xa9, 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, 0x37, 0x0a, 0x06, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 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, 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, 0x57, 0x0a, 0x13, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x12, 0x40, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 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, 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, + 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, 0xfb, 0x01, 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, 0x40, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 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, 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, 0x34, 0x0a, 0x05, + 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0xe4, 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, 0x42, 0x0a, 0x07, 0x75, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 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, @@ -6560,912 +6968,438 @@ var file_oss_proto_rawDesc = []byte{ 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, 0xdf, 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, 0x3b, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 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, - 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, 0xc2, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, - 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0x98, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0x7c, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, + 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, 0xbc, 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, 0x34, 0x0a, + 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0x85, 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, 0x34, 0x0a, 0x05, + 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0xaf, 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, 0x51, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 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, 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, 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, 0x42, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 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, 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, 0xbd, 0x01, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x64, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x66, 0x0a, 0x0f, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 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, 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, 0xcc, 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, 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, - 0xef, 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, - 0x5e, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x11, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x41, 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, 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, 0x5a, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x1d, 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, 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, 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, + 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, 0x48, 0x0a, + 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0f, 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, 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, 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, 0xa6, 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, 0x44, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 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, 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, 0xb7, 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, - 0x51, 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, 0x27, 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, 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, 0x58, 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, 0x3c, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 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, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, - 0x74, 0x73, 0x22, 0xbb, 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, 0x5c, 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, 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, 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, 0xfb, - 0x01, 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, 0x40, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 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, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0xe4, 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, - 0x42, 0x0a, 0x07, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, - 0x32, 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, 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, 0xbc, 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, + 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, 0x84, 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, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0x85, 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, 0x34, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 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, 0xaf, 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, 0x51, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 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, 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, 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, 0x42, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, - 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, 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, 0xbd, - 0x01, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x12, 0x66, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x73, + 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, 0x33, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1d, 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, 0x50, 0x61, + 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x32, 0xb3, 0x17, 0x0a, 0x14, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x62, 0x0a, 0x09, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, + 0x27, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x62, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x12, 0x27, 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, 0x47, 0x65, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 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, 0xcc, 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, 0x48, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0f, 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, 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, 0x84, 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, 0x33, 0x0a, 0x05, - 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x73, 0x70, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x69, 0x0a, 0x0c, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 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, 0x43, 0x6f, + 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 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, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, - 0x73, 0x32, 0xb3, 0x17, 0x0a, 0x14, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x62, 0x0a, 0x09, 0x50, 0x75, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x73, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x1a, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x62, - 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x47, - 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x69, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 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, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2b, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, + 0x12, 0x63, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x63, 0x0a, - 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 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, - 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 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, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, - 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, - 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x28, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x48, 0x65, 0x61, 0x64, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, - 0x0d, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x12, 0x2b, + 0x2e, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x49, 0x73, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x10, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, + 0x6e, 0x67, 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, 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, 0x7e, 0x0a, 0x13, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 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, 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, 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, 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, 0x75, 0x0a, 0x10, 0x47, 0x65, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x45, 0x78, 0x69, 0x73, 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, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, - 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x10, 0x50, - 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 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, 0x7e, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x31, 0x2e, 0x73, 0x70, 0x65, 0x63, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 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, 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, 0x7b, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, + 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, + 0x64, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 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, 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, 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, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, - 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2e, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x2e, 0x76, 0x31, 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, 0x7b, + 0x0a, 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, + 0x64, 0x41, 0x63, 0x6c, 0x12, 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, 0x50, + 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, + 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, - 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2f, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 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, 0x84, 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, 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, + 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, 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, 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, 0x65, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, + 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x61, 0x72, 0x74, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x0e, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, + 0x43, 0x6f, 0x70, 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, + 0x70, 0x79, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x8a, 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, 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, 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, 0x7b, 0x0a, 0x12, 0x47, 0x65, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, - 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, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x1a, 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, 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, 0x7b, 0x0a, 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 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, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 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, 0x84, 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, 0x33, 0x2e, + 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, 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, 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, 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, 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, 0x65, 0x0a, 0x0a, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 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, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 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, 0x55, 0x70, 0x6c, - 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, - 0x01, 0x12, 0x6f, 0x0a, 0x0e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, - 0x6f, 0x70, 0x79, 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, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 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, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0x00, 0x12, 0x8a, 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, 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, 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, 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, - 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, - 0x81, 0x01, 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, - 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 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, 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, 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, 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, 0x81, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, - 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 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, 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, 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, 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, 0x60, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x61, 0x72, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 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, 0x81, 0x01, 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, + 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x12, 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, 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, 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, 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, 0x81, 0x01, 0x0a, 0x14, + 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x73, 0x12, 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, 0x4c, - 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, - 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x12, 0x4c, 0x69, 0x73, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 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, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x1a, 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, 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, 0x5a, 0x0a, 0x07, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, - 0x4c, 0x12, 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, 0x53, 0x69, 0x67, 0x6e, - 0x55, 0x52, 0x4c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x26, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, + 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, 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, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0x00, 0x12, 0x74, 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, 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, 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, 0x72, 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, 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, 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, 0x6b, 0x0a, 0x0c, - 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2a, 0x2e, 0x73, + 0x76, 0x31, 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, + 0x60, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x12, 0x27, 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, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 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, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6c, 0x0a, 0x0d, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 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, + 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, + 0x00, 0x12, 0x7b, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 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, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x31, 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, 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, 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, 0x5a, + 0x0a, 0x07, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x12, 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, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x1a, 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, 0x53, 0x69, 0x67, 0x6e, 0x55, + 0x52, 0x4c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x74, 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, 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, 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, 0x72, 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, 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, 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, 0x6b, 0x0a, 0x0c, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 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, 0x41, + 0x70, 0x70, 0x65, 0x6e, 0x64, 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, 0x41, 0x70, 0x70, 0x65, 0x6e, + 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, + 0x01, 0x12, 0x6c, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 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, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, + 0x2c, 0x5a, 0x2a, 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, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -7480,183 +7414,180 @@ func file_oss_proto_rawDescGZIP() []byte { return file_oss_proto_rawDescData } -var file_oss_proto_msgTypes = make([]protoimpl.MessageInfo, 80) +var file_oss_proto_msgTypes = make([]protoimpl.MessageInfo, 78) var file_oss_proto_goTypes = []interface{}{ - (*InitInput)(nil), // 0: spec.proto.extension.v1.InitInput - (*GetObjectInput)(nil), // 1: spec.proto.extension.v1.GetObjectInput - (*GetObjectOutput)(nil), // 2: spec.proto.extension.v1.GetObjectOutput - (*PutObjectInput)(nil), // 3: spec.proto.extension.v1.PutObjectInput - (*PutObjectOutput)(nil), // 4: spec.proto.extension.v1.PutObjectOutput - (*DeleteObjectInput)(nil), // 5: spec.proto.extension.v1.DeleteObjectInput - (*DeleteObjectOutput)(nil), // 6: spec.proto.extension.v1.DeleteObjectOutput - (*PutObjectTaggingInput)(nil), // 7: spec.proto.extension.v1.PutObjectTaggingInput - (*PutObjectTaggingOutput)(nil), // 8: spec.proto.extension.v1.PutObjectTaggingOutput - (*DeleteObjectTaggingInput)(nil), // 9: spec.proto.extension.v1.DeleteObjectTaggingInput - (*DeleteObjectTaggingOutput)(nil), // 10: spec.proto.extension.v1.DeleteObjectTaggingOutput - (*GetObjectTaggingInput)(nil), // 11: spec.proto.extension.v1.GetObjectTaggingInput - (*GetObjectTaggingOutput)(nil), // 12: spec.proto.extension.v1.GetObjectTaggingOutput - (*CopySource)(nil), // 13: spec.proto.extension.v1.CopySource - (*CopyObjectInput)(nil), // 14: spec.proto.extension.v1.CopyObjectInput - (*CopyObjectResult)(nil), // 15: spec.proto.extension.v1.CopyObjectResult - (*CopyObjectOutput)(nil), // 16: spec.proto.extension.v1.CopyObjectOutput - (*Delete)(nil), // 17: spec.proto.extension.v1.Delete - (*ObjectIdentifier)(nil), // 18: spec.proto.extension.v1.ObjectIdentifier - (*DeleteObjectsInput)(nil), // 19: spec.proto.extension.v1.DeleteObjectsInput - (*DeletedObject)(nil), // 20: spec.proto.extension.v1.DeletedObject - (*DeleteObjectsOutput)(nil), // 21: spec.proto.extension.v1.DeleteObjectsOutput - (*ListObjectsInput)(nil), // 22: spec.proto.extension.v1.ListObjectsInput - (*ListObjectsOutput)(nil), // 23: spec.proto.extension.v1.ListObjectsOutput - (*Owner)(nil), // 24: spec.proto.extension.v1.Owner - (*Object)(nil), // 25: spec.proto.extension.v1.Object - (*GetObjectCannedAclInput)(nil), // 26: spec.proto.extension.v1.GetObjectCannedAclInput - (*GetObjectCannedAclOutput)(nil), // 27: spec.proto.extension.v1.GetObjectCannedAclOutput - (*PutObjectCannedAclInput)(nil), // 28: spec.proto.extension.v1.PutObjectCannedAclInput - (*PutObjectCannedAclOutput)(nil), // 29: spec.proto.extension.v1.PutObjectCannedAclOutput - (*RestoreObjectInput)(nil), // 30: spec.proto.extension.v1.RestoreObjectInput - (*RestoreObjectOutput)(nil), // 31: spec.proto.extension.v1.RestoreObjectOutput - (*CreateMultipartUploadInput)(nil), // 32: spec.proto.extension.v1.CreateMultipartUploadInput - (*CreateMultipartUploadOutput)(nil), // 33: spec.proto.extension.v1.CreateMultipartUploadOutput - (*UploadPartInput)(nil), // 34: spec.proto.extension.v1.UploadPartInput - (*UploadPartOutput)(nil), // 35: spec.proto.extension.v1.UploadPartOutput - (*UploadPartCopyInput)(nil), // 36: spec.proto.extension.v1.UploadPartCopyInput - (*CopyPartResult)(nil), // 37: spec.proto.extension.v1.CopyPartResult - (*UploadPartCopyOutput)(nil), // 38: spec.proto.extension.v1.UploadPartCopyOutput - (*CompletedPart)(nil), // 39: spec.proto.extension.v1.CompletedPart - (*CompletedMultipartUpload)(nil), // 40: spec.proto.extension.v1.CompletedMultipartUpload - (*CompleteMultipartUploadInput)(nil), // 41: spec.proto.extension.v1.CompleteMultipartUploadInput - (*CompleteMultipartUploadOutput)(nil), // 42: spec.proto.extension.v1.CompleteMultipartUploadOutput - (*AbortMultipartUploadInput)(nil), // 43: spec.proto.extension.v1.AbortMultipartUploadInput - (*AbortMultipartUploadOutput)(nil), // 44: spec.proto.extension.v1.AbortMultipartUploadOutput - (*ListMultipartUploadsInput)(nil), // 45: spec.proto.extension.v1.ListMultipartUploadsInput - (*Initiator)(nil), // 46: spec.proto.extension.v1.Initiator - (*MultipartUpload)(nil), // 47: spec.proto.extension.v1.MultipartUpload - (*ListMultipartUploadsOutput)(nil), // 48: spec.proto.extension.v1.ListMultipartUploadsOutput - (*ListObjectVersionsInput)(nil), // 49: spec.proto.extension.v1.ListObjectVersionsInput - (*DeleteMarkerEntry)(nil), // 50: spec.proto.extension.v1.DeleteMarkerEntry - (*ObjectVersion)(nil), // 51: spec.proto.extension.v1.ObjectVersion - (*ListObjectVersionsOutput)(nil), // 52: spec.proto.extension.v1.ListObjectVersionsOutput - (*HeadObjectInput)(nil), // 53: spec.proto.extension.v1.HeadObjectInput - (*HeadObjectOutput)(nil), // 54: spec.proto.extension.v1.HeadObjectOutput - (*IsObjectExistInput)(nil), // 55: spec.proto.extension.v1.IsObjectExistInput - (*IsObjectExistOutput)(nil), // 56: spec.proto.extension.v1.IsObjectExistOutput - (*SignURLInput)(nil), // 57: spec.proto.extension.v1.SignURLInput - (*SignURLOutput)(nil), // 58: spec.proto.extension.v1.SignURLOutput - (*UpdateBandwidthRateLimitInput)(nil), // 59: spec.proto.extension.v1.UpdateBandwidthRateLimitInput - (*AppendObjectInput)(nil), // 60: spec.proto.extension.v1.AppendObjectInput - (*AppendObjectOutput)(nil), // 61: spec.proto.extension.v1.AppendObjectOutput - (*ListPartsInput)(nil), // 62: spec.proto.extension.v1.ListPartsInput - (*Part)(nil), // 63: spec.proto.extension.v1.Part - (*ListPartsOutput)(nil), // 64: spec.proto.extension.v1.ListPartsOutput - nil, // 65: spec.proto.extension.v1.InitInput.MetadataEntry - nil, // 66: spec.proto.extension.v1.GetObjectOutput.MetadataEntry - nil, // 67: spec.proto.extension.v1.PutObjectInput.MetaEntry - nil, // 68: spec.proto.extension.v1.PutObjectInput.TaggingEntry - nil, // 69: spec.proto.extension.v1.PutObjectTaggingInput.TagsEntry - nil, // 70: spec.proto.extension.v1.PutObjectTaggingOutput.ResultMetadataEntry - nil, // 71: spec.proto.extension.v1.DeleteObjectTaggingOutput.ResultMetadataEntry - nil, // 72: spec.proto.extension.v1.GetObjectTaggingOutput.TagsEntry - nil, // 73: spec.proto.extension.v1.GetObjectTaggingOutput.ResultMetadataEntry - nil, // 74: spec.proto.extension.v1.CopyObjectInput.TaggingEntry - nil, // 75: spec.proto.extension.v1.CopyObjectInput.MetadataEntry - nil, // 76: spec.proto.extension.v1.CreateMultipartUploadInput.MetaDataEntry - nil, // 77: spec.proto.extension.v1.CreateMultipartUploadInput.TaggingEntry - nil, // 78: spec.proto.extension.v1.HeadObjectOutput.ResultMetadataEntry - nil, // 79: spec.proto.extension.v1.AppendObjectInput.TagsEntry - (*emptypb.Empty)(nil), // 80: google.protobuf.Empty + (*GetObjectInput)(nil), // 0: spec.proto.extension.v1.GetObjectInput + (*GetObjectOutput)(nil), // 1: spec.proto.extension.v1.GetObjectOutput + (*PutObjectInput)(nil), // 2: spec.proto.extension.v1.PutObjectInput + (*PutObjectOutput)(nil), // 3: spec.proto.extension.v1.PutObjectOutput + (*DeleteObjectInput)(nil), // 4: spec.proto.extension.v1.DeleteObjectInput + (*DeleteObjectOutput)(nil), // 5: spec.proto.extension.v1.DeleteObjectOutput + (*PutObjectTaggingInput)(nil), // 6: spec.proto.extension.v1.PutObjectTaggingInput + (*PutObjectTaggingOutput)(nil), // 7: spec.proto.extension.v1.PutObjectTaggingOutput + (*DeleteObjectTaggingInput)(nil), // 8: spec.proto.extension.v1.DeleteObjectTaggingInput + (*DeleteObjectTaggingOutput)(nil), // 9: spec.proto.extension.v1.DeleteObjectTaggingOutput + (*GetObjectTaggingInput)(nil), // 10: spec.proto.extension.v1.GetObjectTaggingInput + (*GetObjectTaggingOutput)(nil), // 11: spec.proto.extension.v1.GetObjectTaggingOutput + (*CopySource)(nil), // 12: spec.proto.extension.v1.CopySource + (*CopyObjectInput)(nil), // 13: spec.proto.extension.v1.CopyObjectInput + (*CopyObjectResult)(nil), // 14: spec.proto.extension.v1.CopyObjectResult + (*CopyObjectOutput)(nil), // 15: spec.proto.extension.v1.CopyObjectOutput + (*Delete)(nil), // 16: spec.proto.extension.v1.Delete + (*ObjectIdentifier)(nil), // 17: spec.proto.extension.v1.ObjectIdentifier + (*DeleteObjectsInput)(nil), // 18: spec.proto.extension.v1.DeleteObjectsInput + (*DeletedObject)(nil), // 19: spec.proto.extension.v1.DeletedObject + (*DeleteObjectsOutput)(nil), // 20: spec.proto.extension.v1.DeleteObjectsOutput + (*ListObjectsInput)(nil), // 21: spec.proto.extension.v1.ListObjectsInput + (*ListObjectsOutput)(nil), // 22: spec.proto.extension.v1.ListObjectsOutput + (*Owner)(nil), // 23: spec.proto.extension.v1.Owner + (*Object)(nil), // 24: spec.proto.extension.v1.Object + (*GetObjectCannedAclInput)(nil), // 25: spec.proto.extension.v1.GetObjectCannedAclInput + (*GetObjectCannedAclOutput)(nil), // 26: spec.proto.extension.v1.GetObjectCannedAclOutput + (*PutObjectCannedAclInput)(nil), // 27: spec.proto.extension.v1.PutObjectCannedAclInput + (*PutObjectCannedAclOutput)(nil), // 28: spec.proto.extension.v1.PutObjectCannedAclOutput + (*RestoreObjectInput)(nil), // 29: spec.proto.extension.v1.RestoreObjectInput + (*RestoreObjectOutput)(nil), // 30: spec.proto.extension.v1.RestoreObjectOutput + (*CreateMultipartUploadInput)(nil), // 31: spec.proto.extension.v1.CreateMultipartUploadInput + (*CreateMultipartUploadOutput)(nil), // 32: spec.proto.extension.v1.CreateMultipartUploadOutput + (*UploadPartInput)(nil), // 33: spec.proto.extension.v1.UploadPartInput + (*UploadPartOutput)(nil), // 34: spec.proto.extension.v1.UploadPartOutput + (*UploadPartCopyInput)(nil), // 35: spec.proto.extension.v1.UploadPartCopyInput + (*CopyPartResult)(nil), // 36: spec.proto.extension.v1.CopyPartResult + (*UploadPartCopyOutput)(nil), // 37: spec.proto.extension.v1.UploadPartCopyOutput + (*CompletedPart)(nil), // 38: spec.proto.extension.v1.CompletedPart + (*CompletedMultipartUpload)(nil), // 39: spec.proto.extension.v1.CompletedMultipartUpload + (*CompleteMultipartUploadInput)(nil), // 40: spec.proto.extension.v1.CompleteMultipartUploadInput + (*CompleteMultipartUploadOutput)(nil), // 41: spec.proto.extension.v1.CompleteMultipartUploadOutput + (*AbortMultipartUploadInput)(nil), // 42: spec.proto.extension.v1.AbortMultipartUploadInput + (*AbortMultipartUploadOutput)(nil), // 43: spec.proto.extension.v1.AbortMultipartUploadOutput + (*ListMultipartUploadsInput)(nil), // 44: spec.proto.extension.v1.ListMultipartUploadsInput + (*Initiator)(nil), // 45: spec.proto.extension.v1.Initiator + (*MultipartUpload)(nil), // 46: spec.proto.extension.v1.MultipartUpload + (*ListMultipartUploadsOutput)(nil), // 47: spec.proto.extension.v1.ListMultipartUploadsOutput + (*ListObjectVersionsInput)(nil), // 48: spec.proto.extension.v1.ListObjectVersionsInput + (*DeleteMarkerEntry)(nil), // 49: spec.proto.extension.v1.DeleteMarkerEntry + (*ObjectVersion)(nil), // 50: spec.proto.extension.v1.ObjectVersion + (*ListObjectVersionsOutput)(nil), // 51: spec.proto.extension.v1.ListObjectVersionsOutput + (*HeadObjectInput)(nil), // 52: spec.proto.extension.v1.HeadObjectInput + (*HeadObjectOutput)(nil), // 53: spec.proto.extension.v1.HeadObjectOutput + (*IsObjectExistInput)(nil), // 54: spec.proto.extension.v1.IsObjectExistInput + (*IsObjectExistOutput)(nil), // 55: spec.proto.extension.v1.IsObjectExistOutput + (*SignURLInput)(nil), // 56: spec.proto.extension.v1.SignURLInput + (*SignURLOutput)(nil), // 57: spec.proto.extension.v1.SignURLOutput + (*UpdateBandwidthRateLimitInput)(nil), // 58: spec.proto.extension.v1.UpdateBandwidthRateLimitInput + (*AppendObjectInput)(nil), // 59: spec.proto.extension.v1.AppendObjectInput + (*AppendObjectOutput)(nil), // 60: spec.proto.extension.v1.AppendObjectOutput + (*ListPartsInput)(nil), // 61: spec.proto.extension.v1.ListPartsInput + (*Part)(nil), // 62: spec.proto.extension.v1.Part + (*ListPartsOutput)(nil), // 63: spec.proto.extension.v1.ListPartsOutput + nil, // 64: spec.proto.extension.v1.GetObjectOutput.MetadataEntry + nil, // 65: spec.proto.extension.v1.PutObjectInput.MetaEntry + nil, // 66: spec.proto.extension.v1.PutObjectInput.TaggingEntry + nil, // 67: spec.proto.extension.v1.PutObjectTaggingInput.TagsEntry + nil, // 68: spec.proto.extension.v1.PutObjectTaggingOutput.ResultMetadataEntry + nil, // 69: spec.proto.extension.v1.DeleteObjectTaggingOutput.ResultMetadataEntry + nil, // 70: spec.proto.extension.v1.GetObjectTaggingOutput.TagsEntry + nil, // 71: spec.proto.extension.v1.GetObjectTaggingOutput.ResultMetadataEntry + nil, // 72: spec.proto.extension.v1.CopyObjectInput.TaggingEntry + nil, // 73: spec.proto.extension.v1.CopyObjectInput.MetadataEntry + nil, // 74: spec.proto.extension.v1.CreateMultipartUploadInput.MetaDataEntry + nil, // 75: spec.proto.extension.v1.CreateMultipartUploadInput.TaggingEntry + nil, // 76: spec.proto.extension.v1.HeadObjectOutput.ResultMetadataEntry + nil, // 77: spec.proto.extension.v1.AppendObjectInput.TagsEntry + (*emptypb.Empty)(nil), // 78: google.protobuf.Empty } var file_oss_proto_depIdxs = []int32{ - 65, // 0: spec.proto.extension.v1.InitInput.metadata:type_name -> spec.proto.extension.v1.InitInput.MetadataEntry - 66, // 1: spec.proto.extension.v1.GetObjectOutput.metadata:type_name -> spec.proto.extension.v1.GetObjectOutput.MetadataEntry - 67, // 2: spec.proto.extension.v1.PutObjectInput.meta:type_name -> spec.proto.extension.v1.PutObjectInput.MetaEntry - 68, // 3: spec.proto.extension.v1.PutObjectInput.tagging:type_name -> spec.proto.extension.v1.PutObjectInput.TaggingEntry - 69, // 4: spec.proto.extension.v1.PutObjectTaggingInput.tags:type_name -> spec.proto.extension.v1.PutObjectTaggingInput.TagsEntry - 70, // 5: spec.proto.extension.v1.PutObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.PutObjectTaggingOutput.ResultMetadataEntry - 71, // 6: spec.proto.extension.v1.DeleteObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.DeleteObjectTaggingOutput.ResultMetadataEntry - 72, // 7: spec.proto.extension.v1.GetObjectTaggingOutput.tags:type_name -> spec.proto.extension.v1.GetObjectTaggingOutput.TagsEntry - 73, // 8: spec.proto.extension.v1.GetObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.GetObjectTaggingOutput.ResultMetadataEntry - 13, // 9: spec.proto.extension.v1.CopyObjectInput.copy_source:type_name -> spec.proto.extension.v1.CopySource - 74, // 10: spec.proto.extension.v1.CopyObjectInput.tagging:type_name -> spec.proto.extension.v1.CopyObjectInput.TaggingEntry - 75, // 11: spec.proto.extension.v1.CopyObjectInput.metadata:type_name -> spec.proto.extension.v1.CopyObjectInput.MetadataEntry - 15, // 12: spec.proto.extension.v1.CopyObjectOutput.copy_object_result:type_name -> spec.proto.extension.v1.CopyObjectResult - 18, // 13: spec.proto.extension.v1.Delete.objects:type_name -> spec.proto.extension.v1.ObjectIdentifier - 17, // 14: spec.proto.extension.v1.DeleteObjectsInput.delete:type_name -> spec.proto.extension.v1.Delete - 20, // 15: spec.proto.extension.v1.DeleteObjectsOutput.deleted:type_name -> spec.proto.extension.v1.DeletedObject - 25, // 16: spec.proto.extension.v1.ListObjectsOutput.contents:type_name -> spec.proto.extension.v1.Object - 24, // 17: spec.proto.extension.v1.Object.owner:type_name -> spec.proto.extension.v1.Owner - 24, // 18: spec.proto.extension.v1.GetObjectCannedAclOutput.owner:type_name -> spec.proto.extension.v1.Owner - 76, // 19: spec.proto.extension.v1.CreateMultipartUploadInput.meta_data:type_name -> spec.proto.extension.v1.CreateMultipartUploadInput.MetaDataEntry - 77, // 20: spec.proto.extension.v1.CreateMultipartUploadInput.tagging:type_name -> spec.proto.extension.v1.CreateMultipartUploadInput.TaggingEntry - 13, // 21: spec.proto.extension.v1.UploadPartCopyInput.copy_source:type_name -> spec.proto.extension.v1.CopySource - 37, // 22: spec.proto.extension.v1.UploadPartCopyOutput.copy_part_result:type_name -> spec.proto.extension.v1.CopyPartResult - 39, // 23: spec.proto.extension.v1.CompletedMultipartUpload.parts:type_name -> spec.proto.extension.v1.CompletedPart - 40, // 24: spec.proto.extension.v1.CompleteMultipartUploadInput.multipart_upload:type_name -> spec.proto.extension.v1.CompletedMultipartUpload - 46, // 25: spec.proto.extension.v1.MultipartUpload.initiator:type_name -> spec.proto.extension.v1.Initiator - 24, // 26: spec.proto.extension.v1.MultipartUpload.owner:type_name -> spec.proto.extension.v1.Owner - 47, // 27: spec.proto.extension.v1.ListMultipartUploadsOutput.uploads:type_name -> spec.proto.extension.v1.MultipartUpload - 24, // 28: spec.proto.extension.v1.DeleteMarkerEntry.owner:type_name -> spec.proto.extension.v1.Owner - 24, // 29: spec.proto.extension.v1.ObjectVersion.owner:type_name -> spec.proto.extension.v1.Owner - 50, // 30: spec.proto.extension.v1.ListObjectVersionsOutput.delete_markers:type_name -> spec.proto.extension.v1.DeleteMarkerEntry - 51, // 31: spec.proto.extension.v1.ListObjectVersionsOutput.versions:type_name -> spec.proto.extension.v1.ObjectVersion - 78, // 32: spec.proto.extension.v1.HeadObjectOutput.result_metadata:type_name -> spec.proto.extension.v1.HeadObjectOutput.ResultMetadataEntry - 79, // 33: spec.proto.extension.v1.AppendObjectInput.tags:type_name -> spec.proto.extension.v1.AppendObjectInput.TagsEntry - 63, // 34: spec.proto.extension.v1.ListPartsOutput.parts:type_name -> spec.proto.extension.v1.Part - 3, // 35: spec.proto.extension.v1.ObjectStorageService.PutObject:input_type -> spec.proto.extension.v1.PutObjectInput - 1, // 36: spec.proto.extension.v1.ObjectStorageService.GetObject:input_type -> spec.proto.extension.v1.GetObjectInput - 5, // 37: spec.proto.extension.v1.ObjectStorageService.DeleteObject:input_type -> spec.proto.extension.v1.DeleteObjectInput - 14, // 38: spec.proto.extension.v1.ObjectStorageService.CopyObject:input_type -> spec.proto.extension.v1.CopyObjectInput - 19, // 39: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:input_type -> spec.proto.extension.v1.DeleteObjectsInput - 22, // 40: spec.proto.extension.v1.ObjectStorageService.ListObjects:input_type -> spec.proto.extension.v1.ListObjectsInput - 53, // 41: spec.proto.extension.v1.ObjectStorageService.HeadObject:input_type -> spec.proto.extension.v1.HeadObjectInput - 55, // 42: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:input_type -> spec.proto.extension.v1.IsObjectExistInput - 7, // 43: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:input_type -> spec.proto.extension.v1.PutObjectTaggingInput - 9, // 44: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:input_type -> spec.proto.extension.v1.DeleteObjectTaggingInput - 11, // 45: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:input_type -> spec.proto.extension.v1.GetObjectTaggingInput - 26, // 46: spec.proto.extension.v1.ObjectStorageService.GetObjectCannedAcl:input_type -> spec.proto.extension.v1.GetObjectCannedAclInput - 28, // 47: spec.proto.extension.v1.ObjectStorageService.PutObjectCannedAcl:input_type -> spec.proto.extension.v1.PutObjectCannedAclInput - 32, // 48: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:input_type -> spec.proto.extension.v1.CreateMultipartUploadInput - 34, // 49: spec.proto.extension.v1.ObjectStorageService.UploadPart:input_type -> spec.proto.extension.v1.UploadPartInput - 36, // 50: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:input_type -> spec.proto.extension.v1.UploadPartCopyInput - 41, // 51: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:input_type -> spec.proto.extension.v1.CompleteMultipartUploadInput - 43, // 52: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:input_type -> spec.proto.extension.v1.AbortMultipartUploadInput - 45, // 53: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:input_type -> spec.proto.extension.v1.ListMultipartUploadsInput - 62, // 54: spec.proto.extension.v1.ObjectStorageService.ListParts:input_type -> spec.proto.extension.v1.ListPartsInput - 49, // 55: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:input_type -> spec.proto.extension.v1.ListObjectVersionsInput - 57, // 56: spec.proto.extension.v1.ObjectStorageService.SignURL:input_type -> spec.proto.extension.v1.SignURLInput - 59, // 57: spec.proto.extension.v1.ObjectStorageService.UpdateDownloadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput - 59, // 58: spec.proto.extension.v1.ObjectStorageService.UpdateUploadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput - 60, // 59: spec.proto.extension.v1.ObjectStorageService.AppendObject:input_type -> spec.proto.extension.v1.AppendObjectInput - 30, // 60: spec.proto.extension.v1.ObjectStorageService.RestoreObject:input_type -> spec.proto.extension.v1.RestoreObjectInput - 4, // 61: spec.proto.extension.v1.ObjectStorageService.PutObject:output_type -> spec.proto.extension.v1.PutObjectOutput - 2, // 62: spec.proto.extension.v1.ObjectStorageService.GetObject:output_type -> spec.proto.extension.v1.GetObjectOutput - 6, // 63: spec.proto.extension.v1.ObjectStorageService.DeleteObject:output_type -> spec.proto.extension.v1.DeleteObjectOutput - 16, // 64: spec.proto.extension.v1.ObjectStorageService.CopyObject:output_type -> spec.proto.extension.v1.CopyObjectOutput - 21, // 65: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:output_type -> spec.proto.extension.v1.DeleteObjectsOutput - 23, // 66: spec.proto.extension.v1.ObjectStorageService.ListObjects:output_type -> spec.proto.extension.v1.ListObjectsOutput - 54, // 67: spec.proto.extension.v1.ObjectStorageService.HeadObject:output_type -> spec.proto.extension.v1.HeadObjectOutput - 56, // 68: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:output_type -> spec.proto.extension.v1.IsObjectExistOutput - 8, // 69: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:output_type -> spec.proto.extension.v1.PutObjectTaggingOutput - 10, // 70: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:output_type -> spec.proto.extension.v1.DeleteObjectTaggingOutput - 12, // 71: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:output_type -> spec.proto.extension.v1.GetObjectTaggingOutput - 27, // 72: spec.proto.extension.v1.ObjectStorageService.GetObjectCannedAcl:output_type -> spec.proto.extension.v1.GetObjectCannedAclOutput - 29, // 73: spec.proto.extension.v1.ObjectStorageService.PutObjectCannedAcl:output_type -> spec.proto.extension.v1.PutObjectCannedAclOutput - 33, // 74: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:output_type -> spec.proto.extension.v1.CreateMultipartUploadOutput - 35, // 75: spec.proto.extension.v1.ObjectStorageService.UploadPart:output_type -> spec.proto.extension.v1.UploadPartOutput - 38, // 76: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:output_type -> spec.proto.extension.v1.UploadPartCopyOutput - 42, // 77: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:output_type -> spec.proto.extension.v1.CompleteMultipartUploadOutput - 44, // 78: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:output_type -> spec.proto.extension.v1.AbortMultipartUploadOutput - 48, // 79: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:output_type -> spec.proto.extension.v1.ListMultipartUploadsOutput - 64, // 80: spec.proto.extension.v1.ObjectStorageService.ListParts:output_type -> spec.proto.extension.v1.ListPartsOutput - 52, // 81: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:output_type -> spec.proto.extension.v1.ListObjectVersionsOutput - 58, // 82: spec.proto.extension.v1.ObjectStorageService.SignURL:output_type -> spec.proto.extension.v1.SignURLOutput - 80, // 83: spec.proto.extension.v1.ObjectStorageService.UpdateDownloadBandwidthRateLimit:output_type -> google.protobuf.Empty - 80, // 84: spec.proto.extension.v1.ObjectStorageService.UpdateUploadBandwidthRateLimit:output_type -> google.protobuf.Empty - 61, // 85: spec.proto.extension.v1.ObjectStorageService.AppendObject:output_type -> spec.proto.extension.v1.AppendObjectOutput - 31, // 86: spec.proto.extension.v1.ObjectStorageService.RestoreObject:output_type -> spec.proto.extension.v1.RestoreObjectOutput - 61, // [61:87] is the sub-list for method output_type - 35, // [35:61] is the sub-list for method input_type - 35, // [35:35] is the sub-list for extension type_name - 35, // [35:35] is the sub-list for extension extendee - 0, // [0:35] is the sub-list for field type_name + 64, // 0: spec.proto.extension.v1.GetObjectOutput.metadata:type_name -> spec.proto.extension.v1.GetObjectOutput.MetadataEntry + 65, // 1: spec.proto.extension.v1.PutObjectInput.meta:type_name -> spec.proto.extension.v1.PutObjectInput.MetaEntry + 66, // 2: spec.proto.extension.v1.PutObjectInput.tagging:type_name -> spec.proto.extension.v1.PutObjectInput.TaggingEntry + 67, // 3: spec.proto.extension.v1.PutObjectTaggingInput.tags:type_name -> spec.proto.extension.v1.PutObjectTaggingInput.TagsEntry + 68, // 4: spec.proto.extension.v1.PutObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.PutObjectTaggingOutput.ResultMetadataEntry + 69, // 5: spec.proto.extension.v1.DeleteObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.DeleteObjectTaggingOutput.ResultMetadataEntry + 70, // 6: spec.proto.extension.v1.GetObjectTaggingOutput.tags:type_name -> spec.proto.extension.v1.GetObjectTaggingOutput.TagsEntry + 71, // 7: spec.proto.extension.v1.GetObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.GetObjectTaggingOutput.ResultMetadataEntry + 12, // 8: spec.proto.extension.v1.CopyObjectInput.copy_source:type_name -> spec.proto.extension.v1.CopySource + 72, // 9: spec.proto.extension.v1.CopyObjectInput.tagging:type_name -> spec.proto.extension.v1.CopyObjectInput.TaggingEntry + 73, // 10: spec.proto.extension.v1.CopyObjectInput.metadata:type_name -> spec.proto.extension.v1.CopyObjectInput.MetadataEntry + 14, // 11: spec.proto.extension.v1.CopyObjectOutput.copy_object_result:type_name -> spec.proto.extension.v1.CopyObjectResult + 17, // 12: spec.proto.extension.v1.Delete.objects:type_name -> spec.proto.extension.v1.ObjectIdentifier + 16, // 13: spec.proto.extension.v1.DeleteObjectsInput.delete:type_name -> spec.proto.extension.v1.Delete + 19, // 14: spec.proto.extension.v1.DeleteObjectsOutput.deleted:type_name -> spec.proto.extension.v1.DeletedObject + 24, // 15: spec.proto.extension.v1.ListObjectsOutput.contents:type_name -> spec.proto.extension.v1.Object + 23, // 16: spec.proto.extension.v1.Object.owner:type_name -> spec.proto.extension.v1.Owner + 23, // 17: spec.proto.extension.v1.GetObjectCannedAclOutput.owner:type_name -> spec.proto.extension.v1.Owner + 74, // 18: spec.proto.extension.v1.CreateMultipartUploadInput.meta_data:type_name -> spec.proto.extension.v1.CreateMultipartUploadInput.MetaDataEntry + 75, // 19: spec.proto.extension.v1.CreateMultipartUploadInput.tagging:type_name -> spec.proto.extension.v1.CreateMultipartUploadInput.TaggingEntry + 12, // 20: spec.proto.extension.v1.UploadPartCopyInput.copy_source:type_name -> spec.proto.extension.v1.CopySource + 36, // 21: spec.proto.extension.v1.UploadPartCopyOutput.copy_part_result:type_name -> spec.proto.extension.v1.CopyPartResult + 38, // 22: spec.proto.extension.v1.CompletedMultipartUpload.parts:type_name -> spec.proto.extension.v1.CompletedPart + 39, // 23: spec.proto.extension.v1.CompleteMultipartUploadInput.multipart_upload:type_name -> spec.proto.extension.v1.CompletedMultipartUpload + 45, // 24: spec.proto.extension.v1.MultipartUpload.initiator:type_name -> spec.proto.extension.v1.Initiator + 23, // 25: spec.proto.extension.v1.MultipartUpload.owner:type_name -> spec.proto.extension.v1.Owner + 46, // 26: spec.proto.extension.v1.ListMultipartUploadsOutput.uploads:type_name -> spec.proto.extension.v1.MultipartUpload + 23, // 27: spec.proto.extension.v1.DeleteMarkerEntry.owner:type_name -> spec.proto.extension.v1.Owner + 23, // 28: spec.proto.extension.v1.ObjectVersion.owner:type_name -> spec.proto.extension.v1.Owner + 49, // 29: spec.proto.extension.v1.ListObjectVersionsOutput.delete_markers:type_name -> spec.proto.extension.v1.DeleteMarkerEntry + 50, // 30: spec.proto.extension.v1.ListObjectVersionsOutput.versions:type_name -> spec.proto.extension.v1.ObjectVersion + 76, // 31: spec.proto.extension.v1.HeadObjectOutput.result_metadata:type_name -> spec.proto.extension.v1.HeadObjectOutput.ResultMetadataEntry + 77, // 32: spec.proto.extension.v1.AppendObjectInput.tags:type_name -> spec.proto.extension.v1.AppendObjectInput.TagsEntry + 62, // 33: spec.proto.extension.v1.ListPartsOutput.parts:type_name -> spec.proto.extension.v1.Part + 2, // 34: spec.proto.extension.v1.ObjectStorageService.PutObject:input_type -> spec.proto.extension.v1.PutObjectInput + 0, // 35: spec.proto.extension.v1.ObjectStorageService.GetObject:input_type -> spec.proto.extension.v1.GetObjectInput + 4, // 36: spec.proto.extension.v1.ObjectStorageService.DeleteObject:input_type -> spec.proto.extension.v1.DeleteObjectInput + 13, // 37: spec.proto.extension.v1.ObjectStorageService.CopyObject:input_type -> spec.proto.extension.v1.CopyObjectInput + 18, // 38: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:input_type -> spec.proto.extension.v1.DeleteObjectsInput + 21, // 39: spec.proto.extension.v1.ObjectStorageService.ListObjects:input_type -> spec.proto.extension.v1.ListObjectsInput + 52, // 40: spec.proto.extension.v1.ObjectStorageService.HeadObject:input_type -> spec.proto.extension.v1.HeadObjectInput + 54, // 41: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:input_type -> spec.proto.extension.v1.IsObjectExistInput + 6, // 42: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:input_type -> spec.proto.extension.v1.PutObjectTaggingInput + 8, // 43: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:input_type -> spec.proto.extension.v1.DeleteObjectTaggingInput + 10, // 44: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:input_type -> spec.proto.extension.v1.GetObjectTaggingInput + 25, // 45: spec.proto.extension.v1.ObjectStorageService.GetObjectCannedAcl:input_type -> spec.proto.extension.v1.GetObjectCannedAclInput + 27, // 46: spec.proto.extension.v1.ObjectStorageService.PutObjectCannedAcl:input_type -> spec.proto.extension.v1.PutObjectCannedAclInput + 31, // 47: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:input_type -> spec.proto.extension.v1.CreateMultipartUploadInput + 33, // 48: spec.proto.extension.v1.ObjectStorageService.UploadPart:input_type -> spec.proto.extension.v1.UploadPartInput + 35, // 49: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:input_type -> spec.proto.extension.v1.UploadPartCopyInput + 40, // 50: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:input_type -> spec.proto.extension.v1.CompleteMultipartUploadInput + 42, // 51: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:input_type -> spec.proto.extension.v1.AbortMultipartUploadInput + 44, // 52: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:input_type -> spec.proto.extension.v1.ListMultipartUploadsInput + 61, // 53: spec.proto.extension.v1.ObjectStorageService.ListParts:input_type -> spec.proto.extension.v1.ListPartsInput + 48, // 54: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:input_type -> spec.proto.extension.v1.ListObjectVersionsInput + 56, // 55: spec.proto.extension.v1.ObjectStorageService.SignURL:input_type -> spec.proto.extension.v1.SignURLInput + 58, // 56: spec.proto.extension.v1.ObjectStorageService.UpdateDownloadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput + 58, // 57: spec.proto.extension.v1.ObjectStorageService.UpdateUploadBandwidthRateLimit:input_type -> spec.proto.extension.v1.UpdateBandwidthRateLimitInput + 59, // 58: spec.proto.extension.v1.ObjectStorageService.AppendObject:input_type -> spec.proto.extension.v1.AppendObjectInput + 29, // 59: spec.proto.extension.v1.ObjectStorageService.RestoreObject:input_type -> spec.proto.extension.v1.RestoreObjectInput + 3, // 60: spec.proto.extension.v1.ObjectStorageService.PutObject:output_type -> spec.proto.extension.v1.PutObjectOutput + 1, // 61: spec.proto.extension.v1.ObjectStorageService.GetObject:output_type -> spec.proto.extension.v1.GetObjectOutput + 5, // 62: spec.proto.extension.v1.ObjectStorageService.DeleteObject:output_type -> spec.proto.extension.v1.DeleteObjectOutput + 15, // 63: spec.proto.extension.v1.ObjectStorageService.CopyObject:output_type -> spec.proto.extension.v1.CopyObjectOutput + 20, // 64: spec.proto.extension.v1.ObjectStorageService.DeleteObjects:output_type -> spec.proto.extension.v1.DeleteObjectsOutput + 22, // 65: spec.proto.extension.v1.ObjectStorageService.ListObjects:output_type -> spec.proto.extension.v1.ListObjectsOutput + 53, // 66: spec.proto.extension.v1.ObjectStorageService.HeadObject:output_type -> spec.proto.extension.v1.HeadObjectOutput + 55, // 67: spec.proto.extension.v1.ObjectStorageService.IsObjectExist:output_type -> spec.proto.extension.v1.IsObjectExistOutput + 7, // 68: spec.proto.extension.v1.ObjectStorageService.PutObjectTagging:output_type -> spec.proto.extension.v1.PutObjectTaggingOutput + 9, // 69: spec.proto.extension.v1.ObjectStorageService.DeleteObjectTagging:output_type -> spec.proto.extension.v1.DeleteObjectTaggingOutput + 11, // 70: spec.proto.extension.v1.ObjectStorageService.GetObjectTagging:output_type -> spec.proto.extension.v1.GetObjectTaggingOutput + 26, // 71: spec.proto.extension.v1.ObjectStorageService.GetObjectCannedAcl:output_type -> spec.proto.extension.v1.GetObjectCannedAclOutput + 28, // 72: spec.proto.extension.v1.ObjectStorageService.PutObjectCannedAcl:output_type -> spec.proto.extension.v1.PutObjectCannedAclOutput + 32, // 73: spec.proto.extension.v1.ObjectStorageService.CreateMultipartUpload:output_type -> spec.proto.extension.v1.CreateMultipartUploadOutput + 34, // 74: spec.proto.extension.v1.ObjectStorageService.UploadPart:output_type -> spec.proto.extension.v1.UploadPartOutput + 37, // 75: spec.proto.extension.v1.ObjectStorageService.UploadPartCopy:output_type -> spec.proto.extension.v1.UploadPartCopyOutput + 41, // 76: spec.proto.extension.v1.ObjectStorageService.CompleteMultipartUpload:output_type -> spec.proto.extension.v1.CompleteMultipartUploadOutput + 43, // 77: spec.proto.extension.v1.ObjectStorageService.AbortMultipartUpload:output_type -> spec.proto.extension.v1.AbortMultipartUploadOutput + 47, // 78: spec.proto.extension.v1.ObjectStorageService.ListMultipartUploads:output_type -> spec.proto.extension.v1.ListMultipartUploadsOutput + 63, // 79: spec.proto.extension.v1.ObjectStorageService.ListParts:output_type -> spec.proto.extension.v1.ListPartsOutput + 51, // 80: spec.proto.extension.v1.ObjectStorageService.ListObjectVersions:output_type -> spec.proto.extension.v1.ListObjectVersionsOutput + 57, // 81: spec.proto.extension.v1.ObjectStorageService.SignURL:output_type -> spec.proto.extension.v1.SignURLOutput + 78, // 82: spec.proto.extension.v1.ObjectStorageService.UpdateDownloadBandwidthRateLimit:output_type -> google.protobuf.Empty + 78, // 83: spec.proto.extension.v1.ObjectStorageService.UpdateUploadBandwidthRateLimit:output_type -> google.protobuf.Empty + 60, // 84: spec.proto.extension.v1.ObjectStorageService.AppendObject:output_type -> spec.proto.extension.v1.AppendObjectOutput + 30, // 85: spec.proto.extension.v1.ObjectStorageService.RestoreObject:output_type -> spec.proto.extension.v1.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 } func init() { file_oss_proto_init() } @@ -7666,18 +7597,6 @@ func file_oss_proto_init() { } if !protoimpl.UnsafeEnabled { file_oss_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InitInput); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_oss_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetObjectInput); i { case 0: return &v.state @@ -7689,7 +7608,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetObjectOutput); i { case 0: return &v.state @@ -7701,7 +7620,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PutObjectInput); i { case 0: return &v.state @@ -7713,7 +7632,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PutObjectOutput); i { case 0: return &v.state @@ -7725,7 +7644,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteObjectInput); i { case 0: return &v.state @@ -7737,7 +7656,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteObjectOutput); i { case 0: return &v.state @@ -7749,7 +7668,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PutObjectTaggingInput); i { case 0: return &v.state @@ -7761,7 +7680,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PutObjectTaggingOutput); i { case 0: return &v.state @@ -7773,7 +7692,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteObjectTaggingInput); i { case 0: return &v.state @@ -7785,7 +7704,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteObjectTaggingOutput); i { case 0: return &v.state @@ -7797,7 +7716,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetObjectTaggingInput); i { case 0: return &v.state @@ -7809,7 +7728,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetObjectTaggingOutput); i { case 0: return &v.state @@ -7821,7 +7740,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CopySource); i { case 0: return &v.state @@ -7833,7 +7752,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CopyObjectInput); i { case 0: return &v.state @@ -7845,7 +7764,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CopyObjectResult); i { case 0: return &v.state @@ -7857,7 +7776,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CopyObjectOutput); i { case 0: return &v.state @@ -7869,7 +7788,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Delete); i { case 0: return &v.state @@ -7881,7 +7800,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ObjectIdentifier); i { case 0: return &v.state @@ -7893,7 +7812,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteObjectsInput); i { case 0: return &v.state @@ -7905,7 +7824,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeletedObject); i { case 0: return &v.state @@ -7917,7 +7836,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteObjectsOutput); i { case 0: return &v.state @@ -7929,7 +7848,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListObjectsInput); i { case 0: return &v.state @@ -7941,7 +7860,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListObjectsOutput); i { case 0: return &v.state @@ -7953,7 +7872,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Owner); i { case 0: return &v.state @@ -7965,7 +7884,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Object); i { case 0: return &v.state @@ -7977,7 +7896,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetObjectCannedAclInput); i { case 0: return &v.state @@ -7989,7 +7908,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetObjectCannedAclOutput); i { case 0: return &v.state @@ -8001,7 +7920,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PutObjectCannedAclInput); i { case 0: return &v.state @@ -8013,7 +7932,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PutObjectCannedAclOutput); i { case 0: return &v.state @@ -8025,7 +7944,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RestoreObjectInput); i { case 0: return &v.state @@ -8037,7 +7956,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RestoreObjectOutput); i { case 0: return &v.state @@ -8049,7 +7968,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateMultipartUploadInput); i { case 0: return &v.state @@ -8061,7 +7980,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateMultipartUploadOutput); i { case 0: return &v.state @@ -8073,7 +7992,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UploadPartInput); i { case 0: return &v.state @@ -8085,7 +8004,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UploadPartOutput); i { case 0: return &v.state @@ -8097,7 +8016,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UploadPartCopyInput); i { case 0: return &v.state @@ -8109,7 +8028,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CopyPartResult); i { case 0: return &v.state @@ -8121,7 +8040,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UploadPartCopyOutput); i { case 0: return &v.state @@ -8133,7 +8052,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CompletedPart); i { case 0: return &v.state @@ -8145,7 +8064,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CompletedMultipartUpload); i { case 0: return &v.state @@ -8157,7 +8076,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CompleteMultipartUploadInput); i { case 0: return &v.state @@ -8169,7 +8088,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CompleteMultipartUploadOutput); i { case 0: return &v.state @@ -8181,7 +8100,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AbortMultipartUploadInput); i { case 0: return &v.state @@ -8193,7 +8112,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AbortMultipartUploadOutput); i { case 0: return &v.state @@ -8205,7 +8124,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListMultipartUploadsInput); i { case 0: return &v.state @@ -8217,7 +8136,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Initiator); i { case 0: return &v.state @@ -8229,7 +8148,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MultipartUpload); i { case 0: return &v.state @@ -8241,7 +8160,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListMultipartUploadsOutput); i { case 0: return &v.state @@ -8253,7 +8172,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListObjectVersionsInput); i { case 0: return &v.state @@ -8265,7 +8184,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteMarkerEntry); i { case 0: return &v.state @@ -8277,7 +8196,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ObjectVersion); i { case 0: return &v.state @@ -8289,7 +8208,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListObjectVersionsOutput); i { case 0: return &v.state @@ -8301,7 +8220,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HeadObjectInput); i { case 0: return &v.state @@ -8313,7 +8232,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HeadObjectOutput); i { case 0: return &v.state @@ -8325,7 +8244,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IsObjectExistInput); i { case 0: return &v.state @@ -8337,7 +8256,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IsObjectExistOutput); i { case 0: return &v.state @@ -8349,7 +8268,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SignURLInput); i { case 0: return &v.state @@ -8361,7 +8280,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SignURLOutput); i { case 0: return &v.state @@ -8373,7 +8292,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateBandwidthRateLimitInput); i { case 0: return &v.state @@ -8385,7 +8304,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AppendObjectInput); i { case 0: return &v.state @@ -8397,7 +8316,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AppendObjectOutput); i { case 0: return &v.state @@ -8409,7 +8328,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListPartsInput); i { case 0: return &v.state @@ -8421,7 +8340,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Part); i { case 0: return &v.state @@ -8433,7 +8352,7 @@ func file_oss_proto_init() { return nil } } - file_oss_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_oss_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListPartsOutput); i { case 0: return &v.state @@ -8452,7 +8371,7 @@ func file_oss_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_oss_proto_rawDesc, NumEnums: 0, - NumMessages: 80, + NumMessages: 78, NumExtensions: 0, NumServices: 1, }, diff --git a/spec/proto/extension/v1/oss.proto b/spec/proto/extension/v1/oss.proto index f54a65f7d5..b4dadf3f93 100644 --- a/spec/proto/extension/v1/oss.proto +++ b/spec/proto/extension/v1/oss.proto @@ -110,11 +110,6 @@ service ObjectStorageService{ rpc RestoreObject(RestoreObjectInput) returns(RestoreObjectOutput){} } -message InitInput { - string store_name = 1; - map metadata = 2; -} - message GetObjectInput { string store_name = 1; // The bucket name containing the object From db3ce0305264229cfa96c8c9e656302b2b8aa8ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Fri, 22 Jul 2022 16:20:40 +0800 Subject: [PATCH 119/126] change function name --- cmd/layotto/main.go | 4 ++-- cmd/layotto_multiple_api/main.go | 4 ++-- cmd/layotto_without_xds/main.go | 4 ++-- components/oss/registry.go | 2 +- pkg/runtime/runtime_test.go | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cmd/layotto/main.go b/cmd/layotto/main.go index d100ec1ea1..51010d84be 100644 --- a/cmd/layotto/main.go +++ b/cmd/layotto/main.go @@ -285,8 +285,8 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp file.NewFileFactory("qiniuOSS", qiniu.NewQiniuOSS), ), runtime.WithOssFactory( - oss.NewOssFactory("aws.oss", aws_oss.NewAwsOss), - oss.NewOssFactory("aliyun.oss", aliyun_oss.NewAliyunOss), + oss.NewFactory("aws.oss", aws_oss.NewAwsOss), + oss.NewFactory("aliyun.oss", aliyun_oss.NewAliyunOss), ), // PubSub runtime.WithPubSubFactory( diff --git a/cmd/layotto_multiple_api/main.go b/cmd/layotto_multiple_api/main.go index f0504c5ba4..01a7591271 100644 --- a/cmd/layotto_multiple_api/main.go +++ b/cmd/layotto_multiple_api/main.go @@ -297,8 +297,8 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp //OSS runtime.WithOssFactory( - oss.NewOssFactory("aws.oss", aws_oss.NewAwsOss), - oss.NewOssFactory("aliyun.oss", aliyun_oss.NewAliyunOss), + oss.NewFactory("aws.oss", aws_oss.NewAwsOss), + oss.NewFactory("aliyun.oss", aliyun_oss.NewAliyunOss), ), // PubSub diff --git a/cmd/layotto_without_xds/main.go b/cmd/layotto_without_xds/main.go index ba1f94a925..50f5cb2c7c 100644 --- a/cmd/layotto_without_xds/main.go +++ b/cmd/layotto_without_xds/main.go @@ -401,8 +401,8 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp //OSS runtime.WithOssFactory( - oss.NewOssFactory("aws.oss", aws_oss.NewAwsOss), - oss.NewOssFactory("aliyun.oss", aliyun_oss.NewAliyunOss), + oss.NewFactory("aws.oss", aws_oss.NewAwsOss), + oss.NewFactory("aliyun.oss", aliyun_oss.NewAliyunOss), ), // Sequencer diff --git a/components/oss/registry.go b/components/oss/registry.go index 5c337ad81c..0b7872fd9f 100644 --- a/components/oss/registry.go +++ b/components/oss/registry.go @@ -32,7 +32,7 @@ type Factory struct { FactoryMethod func() Oss } -func NewOssFactory(compType string, f func() Oss) *Factory { +func NewFactory(compType string, f func() Oss) *Factory { return &Factory{ CompType: compType, FactoryMethod: f, diff --git a/pkg/runtime/runtime_test.go b/pkg/runtime/runtime_test.go index 6181ea8e61..8abd97cfd3 100644 --- a/pkg/runtime/runtime_test.go +++ b/pkg/runtime/runtime_test.go @@ -854,7 +854,7 @@ func TestMosnRuntimeWithOssConfig(t *testing.T) { s3ext.NewS3Server, ), WithOssFactory( - oss.NewOssFactory("aws.oss", aws2.NewAwsOss), + oss.NewFactory("aws.oss", aws2.NewAwsOss), ), ) // 4. assert From 7c90574acbb9eda23e9d499ef282fdf5dbf935fa Mon Sep 17 00:00:00 2001 From: wenxuwan Date: Sun, 24 Jul 2022 20:36:39 +0800 Subject: [PATCH 120/126] Update components/oss/registry.go Co-authored-by: seeflood --- components/oss/registry.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/oss/registry.go b/components/oss/registry.go index 0b7872fd9f..3b6e58e2bb 100644 --- a/components/oss/registry.go +++ b/components/oss/registry.go @@ -24,7 +24,7 @@ import ( type Registry interface { Register(fs ...*Factory) - Create(name string) (Oss, error) + Create(compType string) (Oss, error) } type Factory struct { From 999f7611d6e85bda0e10231ac1fb33f5bedebd27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Sun, 24 Jul 2022 22:01:05 +0800 Subject: [PATCH 121/126] fix ut --- pkg/mock/runtime/oss/oss.go | 35 ----------------------------------- 1 file changed, 35 deletions(-) diff --git a/pkg/mock/runtime/oss/oss.go b/pkg/mock/runtime/oss/oss.go index 0f22d4ef3f..6784c4e521 100644 --- a/pkg/mock/runtime/oss/oss.go +++ b/pkg/mock/runtime/oss/oss.go @@ -279,26 +279,6 @@ func (mr *MockObjectStorageServiceClientMockRecorder) HeadObject(ctx, in interfa return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HeadObject", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).HeadObject), varargs...) } -// InitClient mocks base method. -func (m *MockObjectStorageServiceClient) InitClient(ctx context.Context, in *v1.InitInput, opts ...grpc.CallOption) (*emptypb.Empty, error) { - m.ctrl.T.Helper() - varargs := []interface{}{ctx, in} - for _, a := range opts { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "InitClient", varargs...) - ret0, _ := ret[0].(*emptypb.Empty) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// InitClient indicates an expected call of InitClient. -func (mr *MockObjectStorageServiceClientMockRecorder) InitClient(ctx, in interface{}, opts ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{ctx, in}, opts...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InitClient", reflect.TypeOf((*MockObjectStorageServiceClient)(nil).InitClient), varargs...) -} - // IsObjectExist mocks base method. func (m *MockObjectStorageServiceClient) IsObjectExist(ctx context.Context, in *v1.IsObjectExistInput, opts ...grpc.CallOption) (*v1.IsObjectExistOutput, error) { m.ctrl.T.Helper() @@ -1314,21 +1294,6 @@ func (mr *MockObjectStorageServiceServerMockRecorder) HeadObject(arg0, arg1 inte return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HeadObject", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).HeadObject), arg0, arg1) } -// InitClient mocks base method. -func (m *MockObjectStorageServiceServer) InitClient(arg0 context.Context, arg1 *v1.InitInput) (*emptypb.Empty, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "InitClient", arg0, arg1) - ret0, _ := ret[0].(*emptypb.Empty) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// InitClient indicates an expected call of InitClient. -func (mr *MockObjectStorageServiceServerMockRecorder) InitClient(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InitClient", reflect.TypeOf((*MockObjectStorageServiceServer)(nil).InitClient), arg0, arg1) -} - // IsObjectExist mocks base method. func (m *MockObjectStorageServiceServer) IsObjectExist(arg0 context.Context, arg1 *v1.IsObjectExistInput) (*v1.IsObjectExistOutput, error) { m.ctrl.T.Helper() From 87a0bbcccbc029ebc976049347483dc84093157a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 25 Jul 2022 14:38:14 +0800 Subject: [PATCH 122/126] add timeout for aliyun --- components/oss/aliyun/oss.go | 28 ++++++++++++++++++--- components/oss/aliyun/oss_test.go | 41 ++++++++++++++++--------------- components/oss/aws/oss_test.go | 2 +- components/oss/oss.go | 4 +-- spec/proto/extension/v1/oss.proto | 25 +++++++++++++++++++ 5 files changed, 74 insertions(+), 26 deletions(-) diff --git a/components/oss/aliyun/oss.go b/components/oss/aliyun/oss.go index fabb24af28..16022aa8d7 100644 --- a/components/oss/aliyun/oss.go +++ b/components/oss/aliyun/oss.go @@ -20,6 +20,7 @@ import ( "context" "encoding/json" "net/http" + "strconv" "mosn.io/layotto/components/pkg/utils" @@ -28,6 +29,11 @@ import ( "github.com/aliyun/aliyun-oss-go-sdk/oss" ) +const ( + connectTimeoutSec = "connectTimeoutSec" + readWriteTimeoutSec = "readWriteTimeout" +) + type AliyunOSS struct { client *oss.Client basicConf json.RawMessage @@ -38,13 +44,29 @@ func NewAliyunOss() l8oss.Oss { } func (a *AliyunOSS) Init(ctx context.Context, config *l8oss.Config) error { + var connectTimeout, readWriteTimeout int64 a.basicConf = config.Metadata[l8oss.BasicConfiguration] m := &utils.OssMetadata{} err := json.Unmarshal(a.basicConf, &m) if err != nil { return l8oss.ErrInvalid } - client, err := oss.New(m.Endpoint, m.AccessKeyID, m.AccessKeySecret) + connectTimeout = 30 + readWriteTimeout = 60 + if t, ok := config.Metadata[connectTimeoutSec]; ok { + v, err := strconv.Atoi(string(t)) + if err == nil { + connectTimeout = int64(v) + } + } + if t, ok := config.Metadata[readWriteTimeoutSec]; ok { + v, err := strconv.Atoi(string(t)) + if err == nil { + readWriteTimeout = int64(v) + } + } + + client, err := oss.New(m.Endpoint, m.AccessKeyID, m.AccessKeySecret, oss.Timeout(connectTimeout, readWriteTimeout)) if err != nil { return err } @@ -396,9 +418,9 @@ func (a *AliyunOSS) ListMultipartUploads(ctx context.Context, req *l8oss.ListMul Delimiter: resp.Delimiter, Prefix: resp.Prefix, KeyMarker: resp.KeyMarker, - UploadIdMarker: resp.UploadIDMarker, + UploadIDMarker: resp.UploadIDMarker, NextKeyMarker: resp.NextKeyMarker, - NextUploadIdMarker: resp.NextUploadIDMarker, + NextUploadIDMarker: resp.NextUploadIDMarker, MaxUploads: int32(resp.MaxUploads), IsTruncated: resp.IsTruncated, CommonPrefixes: resp.CommonPrefixes, diff --git a/components/oss/aliyun/oss_test.go b/components/oss/aliyun/oss_test.go index 5bc679d072..8ccabb17ce 100644 --- a/components/oss/aliyun/oss_test.go +++ b/components/oss/aliyun/oss_test.go @@ -57,61 +57,62 @@ func TestInitAliyunOss(t *testing.T) { func TestAliyunOss(t *testing.T) { instance := NewAliyunOss() - instance.Init(context.TODO(), &l8oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) - appendObjectResp, err := instance.AppendObject(context.TODO(), &oss.AppendObjectInput{}) + instance.Init(context.TODO(), &l8oss.Config{Metadata: map[string]json.RawMessage{connectTimeoutSec: []byte("1"), readWriteTimeoutSec: []byte("1"), oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) + appendObjectResp, err := instance.AppendObject(context.TODO(), &oss.AppendObjectInput{Bucket: "bucket"}) assert.NotNil(t, err) assert.Nil(t, appendObjectResp) - _, err = instance.AbortMultipartUpload(context.TODO(), &oss.AbortMultipartUploadInput{}) + _, err = instance.AbortMultipartUpload(context.TODO(), &oss.AbortMultipartUploadInput{Bucket: "bucket"}) assert.NotNil(t, err) - _, err = instance.CompleteMultipartUpload(context.TODO(), &oss.CompleteMultipartUploadInput{}) + _, err = instance.CompleteMultipartUpload(context.TODO(), &oss.CompleteMultipartUploadInput{Bucket: "bucket"}) assert.NotNil(t, err) - _, err = instance.CopyObject(context.TODO(), &oss.CopyObjectInput{}) + _, err = instance.CopyObject(context.TODO(), &oss.CopyObjectInput{Bucket: "bucket", CopySource: &oss.CopySource{}}) assert.NotNil(t, err) - _, err = instance.CreateMultipartUpload(context.TODO(), &oss.CreateMultipartUploadInput{}) + _, err = instance.CreateMultipartUpload(context.TODO(), &oss.CreateMultipartUploadInput{Bucket: "bucket"}) assert.NotNil(t, err) - _, err = instance.DeleteObject(context.TODO(), &oss.DeleteObjectInput{}) + _, err = instance.DeleteObject(context.TODO(), &oss.DeleteObjectInput{Bucket: "bucket"}) assert.NotNil(t, err) _, err = instance.DeleteObjects(context.TODO(), &oss.DeleteObjectsInput{ + Bucket: "bucket", Delete: &oss.Delete{}, }) assert.NotNil(t, err) - _, err = instance.DeleteObjectTagging(context.TODO(), &oss.DeleteObjectTaggingInput{}) + _, err = instance.DeleteObjectTagging(context.TODO(), &oss.DeleteObjectTaggingInput{Bucket: "bucket"}) assert.NotNil(t, err) - _, err = instance.GetObject(context.TODO(), &oss.GetObjectInput{}) + _, err = instance.GetObject(context.TODO(), &oss.GetObjectInput{Bucket: "bucket"}) assert.NotNil(t, err) - _, err = instance.GetObjectCannedAcl(context.TODO(), &oss.GetObjectCannedAclInput{}) + _, err = instance.GetObjectCannedAcl(context.TODO(), &oss.GetObjectCannedAclInput{Bucket: "bucket"}) assert.NotNil(t, err) - _, err = instance.GetObjectTagging(context.TODO(), &oss.GetObjectTaggingInput{}) + _, err = instance.GetObjectTagging(context.TODO(), &oss.GetObjectTaggingInput{Bucket: "bucket"}) assert.NotNil(t, err) - _, err = instance.HeadObject(context.TODO(), &oss.HeadObjectInput{}) + _, err = instance.HeadObject(context.TODO(), &oss.HeadObjectInput{Bucket: "bucket"}) assert.NotNil(t, err) - _, err = instance.IsObjectExist(context.TODO(), &oss.IsObjectExistInput{}) + _, err = instance.IsObjectExist(context.TODO(), &oss.IsObjectExistInput{Bucket: "bucket"}) assert.NotNil(t, err) - _, err = instance.ListParts(context.TODO(), &oss.ListPartsInput{}) + _, err = instance.ListParts(context.TODO(), &oss.ListPartsInput{Bucket: "bucket"}) assert.NotNil(t, err) - _, err = instance.ListMultipartUploads(context.TODO(), &oss.ListMultipartUploadsInput{}) + _, err = instance.ListMultipartUploads(context.TODO(), &oss.ListMultipartUploadsInput{Bucket: "bucket"}) assert.NotNil(t, err) - _, err = instance.ListObjects(context.TODO(), &oss.ListObjectsInput{}) + _, err = instance.ListObjects(context.TODO(), &oss.ListObjectsInput{Bucket: "bucket"}) assert.NotNil(t, err) - _, err = instance.ListObjectVersions(context.TODO(), &oss.ListObjectVersionsInput{}) + _, err = instance.ListObjectVersions(context.TODO(), &oss.ListObjectVersionsInput{Bucket: "bucket"}) assert.NotNil(t, err) stream := buffer.NewIoBufferString("hello") - _, err = instance.PutObject(context.TODO(), &oss.PutObjectInput{DataStream: stream}) + _, err = instance.PutObject(context.TODO(), &oss.PutObjectInput{DataStream: stream, Bucket: "bucket"}) assert.NotNil(t, err) - _, err = instance.PutObjectCannedAcl(context.TODO(), &oss.PutObjectCannedAclInput{}) + _, err = instance.PutObjectCannedAcl(context.TODO(), &oss.PutObjectCannedAclInput{Bucket: "bucket"}) assert.NotNil(t, err) - _, err = instance.PutObjectTagging(context.TODO(), &oss.PutObjectTaggingInput{}) + _, err = instance.PutObjectTagging(context.TODO(), &oss.PutObjectTaggingInput{Bucket: "bucket"}) assert.NotNil(t, err) _, err = instance.RestoreObject(context.TODO(), &oss.RestoreObjectInput{}) diff --git a/components/oss/aws/oss_test.go b/components/oss/aws/oss_test.go index 9745173f4b..78d893e65f 100644 --- a/components/oss/aws/oss_test.go +++ b/components/oss/aws/oss_test.go @@ -80,7 +80,7 @@ func TestAwsOss(t *testing.T) { _, err = instance.DeleteObject(context.TODO(), &oss.DeleteObjectInput{}) assert.NotNil(t, err) _, err = instance.DeleteObjects(context.TODO(), &oss.DeleteObjectsInput{ - Delete: &oss.Delete{}, + Delete: &oss.Delete{Objects: []*oss.ObjectIdentifier{{Key: "object", VersionId: "version"}}}, }) assert.NotNil(t, err) _, err = instance.DeleteObjectTagging(context.TODO(), &oss.DeleteObjectTaggingInput{}) diff --git a/components/oss/oss.go b/components/oss/oss.go index 952b60867a..d5f0a0520d 100644 --- a/components/oss/oss.go +++ b/components/oss/oss.go @@ -435,9 +435,9 @@ type ListMultipartUploadsOutput struct { KeyMarker string `json:"key_marker,omitempty"` MaxUploads int32 `json:"max_uploads,omitempty"` NextKeyMarker string `json:"next_key_marker,omitempty"` - NextUploadIdMarker string `json:"next_upload_id_marker,omitempty"` + NextUploadIDMarker string `json:"next_upload_id_marker,omitempty"` Prefix string `json:"prefix,omitempty"` - UploadIdMarker string `json:"upload_id_marker,omitempty"` + UploadIDMarker string `json:"upload_id_marker,omitempty"` Uploads []*MultipartUpload `json:"uploads,omitempty"` } type MultipartUpload struct { diff --git a/spec/proto/extension/v1/oss.proto b/spec/proto/extension/v1/oss.proto index b4dadf3f93..de3349fcd0 100644 --- a/spec/proto/extension/v1/oss.proto +++ b/spec/proto/extension/v1/oss.proto @@ -111,6 +111,7 @@ service ObjectStorageService{ } message GetObjectInput { + // Required. The name of oss store. string store_name = 1; // The bucket name containing the object // This member is required @@ -223,6 +224,7 @@ message GetObjectOutput { } message PutObjectInput{ + // Required. The name of oss store. string store_name = 1; // Object data. bytes body = 2; @@ -281,6 +283,7 @@ message PutObjectOutput{ } message DeleteObjectInput{ + // Required. The name of oss store. string store_name = 1; // The bucket name to which the DEL action was initiated // This member is required. @@ -311,6 +314,7 @@ message DeleteObjectOutput{ } message PutObjectTaggingInput{ + // Required. The name of oss store. string store_name = 1; // The bucket name containing the object // This member is required. @@ -331,6 +335,7 @@ message PutObjectTaggingOutput{ } message DeleteObjectTaggingInput{ + // Required. The name of oss store. string store_name = 1; // The bucket name containing the objects from which to remove the tags. string bucket = 2; @@ -352,6 +357,7 @@ message DeleteObjectTaggingOutput{ } message GetObjectTaggingInput{ + // Required. The name of oss store. string store_name = 1; // The bucket name containing the object for which to get the tagging information. // This member is required. @@ -387,6 +393,7 @@ message CopySource{ string copy_source_version_id = 3; } message CopyObjectInput{ + // Required. The name of oss store. string store_name = 1; // The name of the destination bucket. When using this action with an access point // This member is required. @@ -437,6 +444,7 @@ message ObjectIdentifier{ string version_id = 2; } message DeleteObjectsInput{ + // Required. The name of oss store. string store_name = 1; string bucket = 2; Delete delete = 3; @@ -461,6 +469,7 @@ message DeleteObjectsOutput{ } message ListObjectsInput{ + // Required. The name of oss store. string store_name = 1; string bucket = 2; // A delimiter is a character you use to group keys. @@ -539,6 +548,7 @@ message Object{ } message GetObjectCannedAclInput{ + // Required. The name of oss store. string store_name = 1; string bucket = 2; string key = 3; @@ -554,6 +564,7 @@ message GetObjectCannedAclOutput{ } message PutObjectCannedAclInput{ + // Required. The name of oss store. string store_name = 1; string bucket = 2; string key = 3; @@ -567,6 +578,7 @@ message PutObjectCannedAclOutput{ } message RestoreObjectInput{ + // Required. The name of oss store. string store_name = 1; string bucket = 2; string key = 3; @@ -583,6 +595,7 @@ message RestoreObjectOutput{ } message CreateMultipartUploadInput{ + // Required. The name of oss store. string store_name = 1; string bucket = 2; string key = 3; @@ -637,6 +650,7 @@ message CreateMultipartUploadOutput{ } message UploadPartInput{ + // Required. The name of oss store. string store_name = 1; string bucket = 2; string key = 3; @@ -670,6 +684,7 @@ message UploadPartOutput{ } message UploadPartCopyInput{ + // Required. The name of oss store. string store_name = 1; string bucket = 2; string key = 3; @@ -710,6 +725,7 @@ message CompletedMultipartUpload{ repeated CompletedPart parts = 1; } message CompleteMultipartUploadInput{ + // Required. The name of oss store. string store_name = 1; string bucket = 2; string key = 3; @@ -742,6 +758,7 @@ message CompleteMultipartUploadOutput{ } message AbortMultipartUploadInput{ + // Required. The name of oss store. string store_name = 1; string bucket = 2; string key = 3; @@ -757,6 +774,7 @@ message AbortMultipartUploadOutput{ } message ListMultipartUploadsInput{ + // Required. The name of oss store. string store_name = 1; string bucket = 2; // Character you use to group keys. All keys that contain the same string between @@ -835,6 +853,7 @@ message ListMultipartUploadsOutput{ } message ListObjectVersionsInput{ + // Required. The name of oss store. string store_name = 1; string bucket = 2; // A delimiter is a character that you specify to group keys. All keys that contain @@ -903,6 +922,7 @@ message ListObjectVersionsOutput{ } message HeadObjectInput{ + // Required. The name of oss store. string store_name = 1; string bucket = 2; string key = 3; @@ -931,6 +951,7 @@ message HeadObjectOutput{ } message IsObjectExistInput{ + // Required. The name of oss store. string store_name = 1; string bucket = 2; string key = 3; @@ -941,6 +962,7 @@ message IsObjectExistOutput{ } message SignURLInput{ + // Required. The name of oss store. string store_name = 1; string bucket = 2; string key = 3; @@ -954,6 +976,7 @@ message SignURLOutput{ } message UpdateBandwidthRateLimitInput{ + // Required. The name of oss store. string store_name = 1; // The average upload/download bandwidth rate limit in bits per second. int64 average_rate_limit_in_bits_per_sec = 2; @@ -962,6 +985,7 @@ message UpdateBandwidthRateLimitInput{ } message AppendObjectInput{ + // Required. The name of oss store. string store_name = 1; string bucket = 2; string key = 3; @@ -984,6 +1008,7 @@ message AppendObjectOutput{ } message ListPartsInput{ + // Required. The name of oss store. string store_name = 1; string bucket = 2; string key = 3; From 58bca5b30061a73682fc82df581a40ee5bd71a06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 25 Jul 2022 15:30:22 +0800 Subject: [PATCH 123/126] add comments for pb --- spec/proto/extension/v1/oss.proto | 231 +++++++++++++++++++++++++++--- 1 file changed, 214 insertions(+), 17 deletions(-) diff --git a/spec/proto/extension/v1/oss.proto b/spec/proto/extension/v1/oss.proto index de3349fcd0..be6c8ab158 100644 --- a/spec/proto/extension/v1/oss.proto +++ b/spec/proto/extension/v1/oss.proto @@ -139,10 +139,6 @@ message GetObjectInput { // end is used to specify the location where the file end int64 end = 11; // Confirms that the requester knows that they will be charged for the request. - // Bucket owners need not specify this parameter in their requests. For information - // about downloading objects from Requester Pays buckets, see Downloading Objects - // in Requester Pays Buckets - // (https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html) string request_payer = 12; // Sets the Cache-Control header of the response. string response_cache_control = 13; @@ -236,11 +232,8 @@ message PutObjectInput{ string key = 4; // The canned ACL to apply to the object,different oss provider have different acl type string acl = 5; - // 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. + // Indicates whether the multipart upload uses an S3 Bucket Key for server-side + // encryption with Amazon Web Services KMS (SSE-KMS). bool bucket_key_enabled = 6; // Can be used to specify caching behavior along the request/reply chain. string cache_control = 7; @@ -292,11 +285,6 @@ message DeleteObjectInput{ // This member is required. string key = 3; // Confirms that the requester knows that they will be charged for the request. - // Bucket owners need not specify this parameter in their requests. For information - // about downloading objects from Requester Pays buckets, see Downloading Objects - // in Requester Pays Buckets - // (https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html) - // in the Amazon S3 User Guide. string request_payer = 4; // VersionId used to reference a specific version of the object. string version_id = 5; @@ -401,6 +389,7 @@ message CopyObjectInput{ // The key of the destination object. // This member is required. string key = 3; + // CopySource CopySource copy_source = 4; // The tag-set for the object destination object this value must be used in // conjunction with the TaggingDirective. The tag-set must be encoded as URL Query @@ -431,6 +420,7 @@ message CopyObjectOutput{ message Delete{ + // ObjectIdentifier repeated ObjectIdentifier objects = 1; // Element to enable quiet mode for the request. When you add this element, you // must set its value to true. @@ -446,8 +436,12 @@ message ObjectIdentifier{ message DeleteObjectsInput{ // Required. The name of oss store. string store_name = 1; + // The bucket name containing the object + // This member is required string bucket = 2; + // Delete objects Delete delete = 3; + // Confirms that the requester knows that they will be charged for the request. string request_payer = 4; } message DeletedObject{ @@ -465,12 +459,15 @@ message DeletedObject{ string version_id = 4; } message DeleteObjectsOutput{ + // DeletedObject repeated DeletedObject deleted = 1; } message ListObjectsInput{ // Required. The name of oss store. string store_name = 1; + // The bucket name containing the object + // This member is required string bucket = 2; // A delimiter is a character you use to group keys. string delimiter = 3; @@ -494,13 +491,13 @@ message ListObjectsInput{ int32 maxKeys = 7; // Limits the response to keys that begin with the specified prefix. string prefix = 8; - // Confirms that the requester knows that she or he will be charged for the list - // objects request. Bucket owners need not specify this parameter in their - // requests. + // Confirms that the requester knows that they will be charged for the request. string request_payer = 9; } message ListObjectsOutput{ + // CommonPrefixes repeated string common_prefixes = 1; + // Objects contents repeated Object contents = 2; // Causes keys that contain the same string between the prefix and the first // occurrence of the delimiter to be rolled up into a single result element in the @@ -528,7 +525,9 @@ message ListObjectsOutput{ string prefix = 10; } message Owner{ + // Owner display name string display_name = 1; + // Owner id string id = 2; } message Object{ @@ -550,13 +549,19 @@ message Object{ message GetObjectCannedAclInput{ // Required. The name of oss store. string store_name = 1; + // The bucket name containing the object + // This member is required string bucket = 2; + // Name of the object key. + // This member is required. string key = 3; // VersionId used to reference a specific version of the object string version_id = 4; } message GetObjectCannedAclOutput{ + // Object CannedACL string canned_acl = 1; + // Owner Owner owner = 2; // If present, indicates that the requester was successfully charged for the // request. @@ -566,7 +571,11 @@ message GetObjectCannedAclOutput{ message PutObjectCannedAclInput{ // Required. The name of oss store. string store_name = 1; + // The bucket name containing the object + // This member is required string bucket = 2; + // Name of the object key. + // This member is required. string key = 3; // The canned ACL to apply to the object string acl = 4; @@ -574,13 +583,18 @@ message PutObjectCannedAclInput{ string version_id = 5; } message PutObjectCannedAclOutput{ + // Request charged string request_charged = 1; } message RestoreObjectInput{ // Required. The name of oss store. string store_name = 1; + // The bucket name containing the object + // This member is required string bucket = 2; + // Name of the object key. + // This member is required. string key = 3; // VersionId used to reference a specific version of the object. string version_id = 5; @@ -597,53 +611,119 @@ message RestoreObjectOutput{ message CreateMultipartUploadInput{ // Required. The name of oss store. string store_name = 1; + // The bucket name containing the object + // This member is required string bucket = 2; + // Name of the object key. + // This member is required. string key = 3; // The canned ACL to apply to the object. This action is not supported by Amazon S3 // on Outposts. string acl = 4; + // 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. bool bucket_key_enabled = 5; + // Specifies caching behavior along the request/reply chain string cache_control = 6; + // Specifies presentational information for the object string content_disposition = 7; + // 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. string content_encoding = 8; + // The language the content is in. string content_language = 9; + // A standard MIME type describing the format of the object data. string content_type = 10; // 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). string expected_bucket_owner = 11; + // The date and time at which the object is no longer cacheable. int64 expires = 12; + // Gives the grantee READ, READ_ACP, and WRITE_ACP permissions on the object. This + // action is not supported by Amazon S3 on Outposts. string grant_full_control = 13; + // Allows grantee to read the object data and its metadata. This action is not + // supported by Amazon S3 on Outposts. string grant_read = 14; + // Allows grantee to read the object ACL. This action is not supported by Amazon S3 + // on Outposts. string grant_read_acp = 15; + // Allows grantee to write the ACL for the applicable object. This action is not + // supported by Amazon S3 on Outposts. string grant_write_acp = 16; + // A map of metadata to store with the object map meta_data = 17; + // Specifies whether you want to apply a legal hold to the uploaded object string object_lock_legal_hold_status = 18; + // Specifies the Object Lock mode that you want to apply to the uploaded object string object_lock_mode = 19; + // Specifies the date and time when you want the Object Lock to expire int64 object_lock_retain_until_date = 20; + // Confirms that the requester knows that they will be charged for the request string request_payer = 21; + // Specifies the algorithm to use to when encrypting the object (for example, + // AES256). string sse_customer_algorithm = 22; + // Specifies the customer-provided encryption key to use in encrypting data string sse_customer_key = 23; + // Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321 string sse_customer_key_md5 = 24; + // Specifies the Amazon Web Services KMS Encryption Context to use for object encryption string sse_kms_encryption_context = 25; + // Specifies the ID of the symmetric customer managed key to use for object encryption string sse_kms_key_id = 26; + // The server-side encryption algorithm used when storing this object string server_side_encryption = 27; + // By default, oss store uses the STANDARD Storage Class to store newly created objects string storage_class = 28; // The tag-set for the object. The tag-set must be encoded as URL Query parameters. map tagging = 29; + // 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. string website_redirect_location = 30; } message CreateMultipartUploadOutput{ + // The bucket name containing the object + // This member is required string bucket = 1; + // Name of the object key. + // This member is required. string key = 2; + // 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 int64 abort_date = 3; + // It identifies the applicable lifecycle configuration rule that defines the action to abort + // incomplete multipart uploads. string abort_rule_id = 4; + // Indicates whether the multipart upload uses an S3 Bucket Key for server-side + // encryption with Amazon Web Services KMS (SSE-KMS). bool bucket_key_enabled = 5; + // If present, indicates that the requester was successfully charged for the + // request. string request_charged = 6; + // If server-side encryption with a customer-provided encryption key was requested, + // the response will include this header confirming the encryption algorithm used. string sse_customer_algorithm = 7; + // 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. string sse_customer_key_md5 = 8; + // 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. string sse_kms_encryption_context = 9; + // 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. string sse_kms_key_id = 10; + // The server-side encryption algorithm used when storing this object in Amazon S3 + // (for example, AES256, aws:kms). string server_side_encryption = 11; // ID for the initiated multipart upload. string upload_id = 12; @@ -652,42 +732,69 @@ message CreateMultipartUploadOutput{ message UploadPartInput{ // Required. The name of oss store. string store_name = 1; + // The bucket name containing the object + // This member is required string bucket = 2; + // Name of the object key. + // This member is required. string key = 3; // Object data. bytes body = 4; // Size of the body in bytes. This parameter is useful when the size of the body // cannot be determined automatically. int64 content_length = 5; + // The base64-encoded 128-bit MD5 digest of the part data. string content_md5 = 6; + // The account ID of the expected bucket owner string expected_bucket_owner = 7; // Part number of part being uploaded. This is a positive integer between 1 and 10,000. // This member is required. int32 part_number = 8; + // Confirms that the requester knows that they will be charged for the request. string request_payer = 9; + // Specifies the algorithm to use to when encrypting the object (for example, + // AES256). string sse_customer_algorithm = 10; + // Specifies the customer-provided encryption key for Amazon S3 to use in + // encrypting data string sse_customer_key = 11; + // Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. string sse_customer_key_md5 = 12; // Upload ID identifying the multipart upload whose part is being uploaded. // This member is required. string upload_id = 13; } message UploadPartOutput{ + // Indicates whether the multipart upload uses an S3 Bucket Key for server-side + // encryption with Amazon Web Services KMS (SSE-KMS). bool bucket_key_enabled = 1; // Entity tag for the uploaded object. string etag = 2; + // If present, indicates that the requester was successfully charged for the + // request. string request_charged = 3; + // Specifies the algorithm to use to when encrypting the object (for example, + // AES256). string sse_customer_algorithm = 4; + // Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. string sse_customer_key_md5 = 5; + // Specifies the ID of the symmetric customer managed key to use for object encryption string sse_kms_key_id = 6; + // The server-side encryption algorithm used when storing this object in Amazon S3 + // (for example, AES256, aws:kms). string server_side_encryption = 7; } message UploadPartCopyInput{ // Required. The name of oss store. string store_name = 1; + // The bucket name containing the object + // This member is required string bucket = 2; + // Name of the object key. + // This member is required. string key = 3; + // CopySource CopySource copy_source = 4; // Part number of part being copied. This is a positive integer between 1 and 10,000. // This member is required. @@ -697,27 +804,49 @@ message UploadPartCopyInput{ string upload_id = 6; // The range of bytes to copy from the source object.bytes=start_position-part_size int64 start_position = 7; + // Part size int64 part_size = 8; } message CopyPartResult{ // Entity tag of the object. string etag = 1; + // Last modified time int64 last_modified = 2; } message UploadPartCopyOutput{ + // Indicates whether the multipart upload uses an S3 Bucket Key for server-side + // encryption with Amazon Web Services KMS (SSE-KMS). bool bucket_key_enabled = 1; + // Container for all response elements. CopyPartResult copy_part_result = 2; + // The version of the source object that was copied, if you have enabled versioning + // on the source bucket. string copy_source_version_id = 3; + // If present, indicates that the requester was successfully charged for the + // request. string request_charged = 4; + // If server-side encryption with a customer-provided encryption key was requested, + // the response will include this header confirming the encryption algorithm used. string sse_customer_algorithm = 5; + // 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. string sse_customer_key_md5 = 6; + // 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. string sse_kms_key_id = 7; + // The server-side encryption algorithm used when storing this object in Amazon S3 + // (for example, AES256, aws:kms). string server_side_encryption = 8; } message CompletedPart{ + // Entity tag returned when the part was uploaded. string etag = 1; + // Part number that identifies the part. This is a positive integer between 1 and + // 10,000. int32 part_number = 2; } message CompletedMultipartUpload{ @@ -727,19 +856,31 @@ message CompletedMultipartUpload{ message CompleteMultipartUploadInput{ // Required. The name of oss store. string store_name = 1; + // The bucket name containing the object + // This member is required string bucket = 2; + // Name of the object key. + // This member is required. string key = 3; // ID for the initiated multipart upload. // This member is required. string upload_id = 4; + // Confirms that the requester knows that they will be charged for the request. string request_payer = 5; + // Expected bucket owner string expected_bucket_owner = 6; // The container for the multipart upload request information. CompletedMultipartUpload multipart_upload = 7; } message CompleteMultipartUploadOutput{ + // The bucket name containing the object + // This member is required string bucket = 1; + // Name of the object key. + // This member is required. string key = 2; + // Indicates whether the multipart upload uses an S3 Bucket Key for server-side + // encryption with Amazon Web Services KMS (SSE-KMS). bool bucket_key_enabled = 3; string etag = 4; // If the object expiration is configured, this will contain the expiration date @@ -751,6 +892,8 @@ message CompleteMultipartUploadOutput{ // request. string request_charged = 7; string sse_kms_keyId = 8; + // The server-side encryption algorithm used when storing this object in Amazon S3 + // (for example, AES256, aws:kms). string server_side_encryption = 9; // Version ID of the newly created object, in case the bucket has versioning turned // on. @@ -760,9 +903,14 @@ message CompleteMultipartUploadOutput{ message AbortMultipartUploadInput{ // Required. The name of oss store. string store_name = 1; + // The bucket name containing the object + // This member is required string bucket = 2; + // Name of the object key. + // This member is required. string key = 3; string expected_bucket_owner = 4; + // Confirms that the requester knows that they will be charged for the request. string request_payer = 5; // Upload ID that identifies the multipart upload. // This member is required. @@ -776,6 +924,8 @@ message AbortMultipartUploadOutput{ message ListMultipartUploadsInput{ // Required. The name of oss store. string store_name = 1; + // The bucket name containing the object + // This member is required string bucket = 2; // 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 @@ -816,12 +966,16 @@ message Initiator{ message MultipartUpload{ int64 initiated = 1; Initiator initiator = 2; + // Name of the object key. + // This member is required. string key = 3; Owner owner = 4; string storage_class = 5; string upload_id = 6; } message ListMultipartUploadsOutput{ + // The bucket name containing the object + // This member is required string bucket = 1; repeated string common_prefixes = 2; string delimiter = 3; @@ -855,6 +1009,8 @@ message ListMultipartUploadsOutput{ message ListObjectVersionsInput{ // Required. The name of oss store. string store_name = 1; + // The bucket name containing the object + // This member is required string bucket = 2; // 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 @@ -885,6 +1041,8 @@ message DeleteMarkerEntry{ // Specifies whether the object is (true) or is not (false) the latest version of // an object. bool is_latest = 1; + // Name of the object key. + // This member is required. string key = 2; // Date and time the object was last modified. int64 last_modified = 3; @@ -897,6 +1055,8 @@ message ObjectVersion{ // Specifies whether the object is (true) or is not (false) the latest version of // an object. bool is_latest = 2; + // Name of the object key. + // This member is required. string key = 3; int64 last_modified = 4; Owner owner = 5; @@ -924,7 +1084,11 @@ message ListObjectVersionsOutput{ message HeadObjectInput{ // Required. The name of oss store. string store_name = 1; + // The bucket name containing the object + // This member is required string bucket = 2; + // Name of the object key. + // This member is required. string key = 3; string checksum_mode = 4; string expected_bucket_owner = 5; @@ -937,6 +1101,7 @@ message HeadObjectInput{ // Useful querying about the size of the part and the number of parts in this // object. int32 part_number = 10; + // Confirms that the requester knows that they will be charged for the request. string request_payer = 11; string sse_customer_algorithm = 12; string sse_customer_key = 13; @@ -953,7 +1118,11 @@ message HeadObjectOutput{ message IsObjectExistInput{ // Required. The name of oss store. string store_name = 1; + // The bucket name containing the object + // This member is required string bucket = 2; + // Name of the object key. + // This member is required. string key = 3; string version_id = 4; } @@ -964,7 +1133,11 @@ message IsObjectExistOutput{ message SignURLInput{ // Required. The name of oss store. string store_name = 1; + // The bucket name containing the object + // This member is required string bucket = 2; + // Name of the object key. + // This member is required. string key = 3; // the method for sign url, eg. GET、POST string method = 4; @@ -987,7 +1160,11 @@ message UpdateBandwidthRateLimitInput{ message AppendObjectInput{ // Required. The name of oss store. string store_name = 1; + // The bucket name containing the object + // This member is required string bucket = 2; + // Name of the object key. + // This member is required. string key = 3; bytes body = 4; int64 position = 5; @@ -998,6 +1175,8 @@ message AppendObjectInput{ string content_md5 = 10; int64 expires = 11; string storage_class = 12; + // The server-side encryption algorithm used when storing this object in Amazon S3 + // (for example, AES256, aws:kms). string server_side_encryption = 13; string meta = 14; map tags = 15; @@ -1010,22 +1189,40 @@ message AppendObjectOutput{ message ListPartsInput{ // Required. The name of oss store. string store_name = 1; + // The bucket name containing the object + // This member is required string bucket = 2; + // Name of the object key. + // This member is required. string key = 3; + // The account ID of the expected bucket owner string expected_bucket_owner = 4; + // Sets the maximum number of parts to return int64 max_parts = 5; + // Specifies the part after which listing should begin. Only parts with higher part + // numbers will be listed. int64 part_number_marker = 6; + // Confirms that the requester knows that they will be charged for the request. string request_payer = 7; + // Upload ID identifying the multipart upload whose parts are being listed. string upload_id = 8; } message Part{ + // Part Etag string etag = 1; + // Last modified time int64 last_modified = 2; + // Part number int64 part_number = 3; + // Part size int64 size = 4; } message ListPartsOutput{ + // The bucket name containing the object + // This member is required string bucket = 1; + // Name of the object key. + // This member is required. string key = 2; // Upload ID identifying the multipart upload whose parts are being listed. string upload_id = 3; From a6b964b28f81657eba07c4ab5932d072efebb037 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 25 Jul 2022 16:14:55 +0800 Subject: [PATCH 124/126] add comments for protobuf --- spec/proto/extension/v1/oss.proto | 173 +++++++++++++++++++++++++++++- 1 file changed, 172 insertions(+), 1 deletion(-) diff --git a/spec/proto/extension/v1/oss.proto b/spec/proto/extension/v1/oss.proto index be6c8ab158..4a25a9cf09 100644 --- a/spec/proto/extension/v1/oss.proto +++ b/spec/proto/extension/v1/oss.proto @@ -9,6 +9,7 @@ import "google/protobuf/empty.proto"; option go_package = "mosn.io/layotto/spec/proto/extension/v1;s3"; +// ObjectStorageService service ObjectStorageService{ //Object CRUD API //Adds an object to a bucket. @@ -110,6 +111,7 @@ service ObjectStorageService{ rpc RestoreObject(RestoreObjectInput) returns(RestoreObjectOutput){} } +// GetObjectInput message GetObjectInput { // Required. The name of oss store. string store_name = 1; @@ -170,6 +172,8 @@ message GetObjectInput { // Specify the signed url of object, user can get object with signed url without ak、sk string signed_url = 24; } + +// GetObjectOutput message GetObjectOutput { // Object data. bytes body = 1; @@ -219,6 +223,7 @@ message GetObjectOutput { map metadata = 18; } +// PutObjectInput message PutObjectInput{ // Required. The name of oss store. string store_name = 1; @@ -261,6 +266,8 @@ message PutObjectInput{ // The tag-set for the object. The tag-set must be encoded as URL Query parameters. map tagging = 14; } + +// PutObjectOutput message PutObjectOutput{ // Indicates whether the uploaded object uses an S3 Bucket Key for server-side // encryption with Amazon Web Services KMS (SSE-KMS). @@ -275,6 +282,7 @@ message PutObjectOutput{ string version_id = 5; } +// DeleteObjectInput message DeleteObjectInput{ // Required. The name of oss store. string store_name = 1; @@ -289,6 +297,8 @@ message DeleteObjectInput{ // VersionId used to reference a specific version of the object. string version_id = 5; } + +// DeleteObjectOutput message DeleteObjectOutput{ // Specifies whether the versioned object that was permanently deleted was (true) // or was not (false) a delete marker. @@ -301,6 +311,7 @@ message DeleteObjectOutput{ string version_id = 3; } +// PutObjectTaggingInput message PutObjectTaggingInput{ // Required. The name of oss store. string store_name = 1; @@ -315,6 +326,8 @@ message PutObjectTaggingInput{ // The versionId of the object that the tag-set will be added to. string version_id = 5; } + +// PutObjectTaggingOutput message PutObjectTaggingOutput{ // The versionId of the object the tag-set was added to. string version_id = 1; @@ -322,6 +335,7 @@ message PutObjectTaggingOutput{ map result_metadata = 2; } +// DeleteObjectTaggingInput message DeleteObjectTaggingInput{ // Required. The name of oss store. string store_name = 1; @@ -337,6 +351,8 @@ message DeleteObjectTaggingInput{ // (access denied). string expected_bucket_owner = 5; } + +// DeleteObjectTaggingOutput message DeleteObjectTaggingOutput{ // The versionId of the object the tag-set was removed from. string version_id = 1; @@ -344,6 +360,7 @@ message DeleteObjectTaggingOutput{ map result_metadata = 2; } +// GetObjectTaggingInput message GetObjectTaggingInput{ // Required. The name of oss store. string store_name = 1; @@ -362,6 +379,8 @@ message GetObjectTaggingInput{ // Confirms that the requester knows that they will be charged for the request. string request_payer = 6; } + +// GetObjectTaggingOutput message GetObjectTaggingOutput{ // Contains the tag set. // This member is required. @@ -372,6 +391,7 @@ message GetObjectTaggingOutput{ map result_metadata = 3; } +// CopySource message CopySource{ // source object bucket name string copy_source_bucket = 1; @@ -380,6 +400,8 @@ message CopySource{ // source object version string copy_source_version_id = 3; } + +// CopyObjectInput message CopyObjectInput{ // Required. The name of oss store. string store_name = 1; @@ -402,6 +424,8 @@ message CopyObjectInput{ // A map of metadata to store with the object in S3. map metadata = 8; } + +// CopyObjectResult message CopyObjectResult{ // Returns the ETag of the new object. The ETag reflects only changes to the // contents of an object, not its metadata. @@ -409,6 +433,8 @@ message CopyObjectResult{ // Creation date of the object. int64 last_modified = 2; } + +// CopyObjectOutput message CopyObjectOutput{ // Container for all response elements. CopyObjectResult copy_object_result = 1; @@ -418,7 +444,7 @@ message CopyObjectOutput{ string expiration = 3; } - +// Delete message Delete{ // ObjectIdentifier repeated ObjectIdentifier objects = 1; @@ -426,6 +452,8 @@ message Delete{ // must set its value to true. bool quiet = 2; } + +// ObjectIdentifier message ObjectIdentifier{ // Key name of the object. // This member is required. @@ -433,6 +461,8 @@ message ObjectIdentifier{ // VersionId for the specific version of the object to delete. string version_id = 2; } + +// DeleteObjectsInput message DeleteObjectsInput{ // Required. The name of oss store. string store_name = 1; @@ -444,6 +474,8 @@ message DeleteObjectsInput{ // Confirms that the requester knows that they will be charged for the request. string request_payer = 4; } + +// DeletedObject message DeletedObject{ // Specifies whether the versioned object that was permanently deleted was (true) // or was not (false) a delete marker. In a simple DELETE, this header indicates @@ -458,11 +490,14 @@ message DeletedObject{ // The version ID of the deleted object. string version_id = 4; } + +// DeleteObjectsOutput message DeleteObjectsOutput{ // DeletedObject repeated DeletedObject deleted = 1; } +// ListObjectsInput message ListObjectsInput{ // Required. The name of oss store. string store_name = 1; @@ -494,6 +529,8 @@ message ListObjectsInput{ // Confirms that the requester knows that they will be charged for the request. string request_payer = 9; } + +// ListObjectsOutput message ListObjectsOutput{ // CommonPrefixes repeated string common_prefixes = 1; @@ -524,12 +561,16 @@ message ListObjectsOutput{ // Keys that begin with the indicated prefix. string prefix = 10; } + +// Owner message Owner{ // Owner display name string display_name = 1; // Owner id string id = 2; } + +// Object message Object{ // The entity tag is a hash of the object string etag = 1; @@ -546,6 +587,7 @@ message Object{ string storage_class = 6; } +// GetObjectCannedAclInput message GetObjectCannedAclInput{ // Required. The name of oss store. string store_name = 1; @@ -558,6 +600,8 @@ message GetObjectCannedAclInput{ // VersionId used to reference a specific version of the object string version_id = 4; } + +// GetObjectCannedAclOutput message GetObjectCannedAclOutput{ // Object CannedACL string canned_acl = 1; @@ -568,6 +612,7 @@ message GetObjectCannedAclOutput{ string request_charged = 3; } +// PutObjectCannedAclInput message PutObjectCannedAclInput{ // Required. The name of oss store. string store_name = 1; @@ -582,11 +627,14 @@ message PutObjectCannedAclInput{ // VersionId used to reference a specific version of the object. string version_id = 5; } + +// PutObjectCannedAclOutput message PutObjectCannedAclOutput{ // Request charged string request_charged = 1; } +// RestoreObjectInput message RestoreObjectInput{ // Required. The name of oss store. string store_name = 1; @@ -599,6 +647,8 @@ message RestoreObjectInput{ // VersionId used to reference a specific version of the object. string version_id = 5; } + +// RestoreObjectOutput message RestoreObjectOutput{ // If present, indicates that the requester was successfully charged for the // request. @@ -608,6 +658,7 @@ message RestoreObjectOutput{ string restore_output_path = 2; } +// CreateMultipartUploadInput message CreateMultipartUploadInput{ // Required. The name of oss store. string store_name = 1; @@ -687,6 +738,8 @@ message CreateMultipartUploadInput{ // another object in the same bucket or to an external URL. string website_redirect_location = 30; } + +// CreateMultipartUploadOutput message CreateMultipartUploadOutput{ // The bucket name containing the object // This member is required @@ -729,6 +782,7 @@ message CreateMultipartUploadOutput{ string upload_id = 12; } +// UploadPartInput message UploadPartInput{ // Required. The name of oss store. string store_name = 1; @@ -764,6 +818,8 @@ message UploadPartInput{ // This member is required. string upload_id = 13; } + +// UploadPartOutput message UploadPartOutput{ // Indicates whether the multipart upload uses an S3 Bucket Key for server-side // encryption with Amazon Web Services KMS (SSE-KMS). @@ -785,6 +841,7 @@ message UploadPartOutput{ string server_side_encryption = 7; } +// UploadPartCopyInput message UploadPartCopyInput{ // Required. The name of oss store. string store_name = 1; @@ -808,12 +865,15 @@ message UploadPartCopyInput{ int64 part_size = 8; } +// CopyPartResult message CopyPartResult{ // Entity tag of the object. string etag = 1; // Last modified time int64 last_modified = 2; } + +// UploadPartCopyOutput message UploadPartCopyOutput{ // Indicates whether the multipart upload uses an S3 Bucket Key for server-side // encryption with Amazon Web Services KMS (SSE-KMS). @@ -842,6 +902,7 @@ message UploadPartCopyOutput{ string server_side_encryption = 8; } +// CompletedPart message CompletedPart{ // Entity tag returned when the part was uploaded. string etag = 1; @@ -849,10 +910,14 @@ message CompletedPart{ // 10,000. int32 part_number = 2; } + +// CompletedMultipartUpload message CompletedMultipartUpload{ // Array of CompletedPart data types. repeated CompletedPart parts = 1; } + +// CompleteMultipartUploadInput message CompleteMultipartUploadInput{ // Required. The name of oss store. string store_name = 1; @@ -872,6 +937,8 @@ message CompleteMultipartUploadInput{ // The container for the multipart upload request information. CompletedMultipartUpload multipart_upload = 7; } + +// CompleteMultipartUploadOutput message CompleteMultipartUploadOutput{ // The bucket name containing the object // This member is required @@ -900,6 +967,7 @@ message CompleteMultipartUploadOutput{ string version_id = 10; } +// AbortMultipartUploadInput message AbortMultipartUploadInput{ // Required. The name of oss store. string store_name = 1; @@ -916,11 +984,14 @@ message AbortMultipartUploadInput{ // This member is required. string upload_id = 6; } + +// AbortMultipartUploadOutput message AbortMultipartUploadOutput{ // If present, indicates that the requester was successfully charged for the request. string request_charged = 1; } +// ListMultipartUploadsInput message ListMultipartUploadsInput{ // Required. The name of oss store. string store_name = 1; @@ -959,26 +1030,44 @@ message ListMultipartUploadsInput{ // greater than the specified upload-id-marker. string upload_id_marker = 9; } + +// Initiator message Initiator{ + // Initiator name string display_name = 1; + // Initiator id string id = 2; } + +// MultipartUpload message MultipartUpload{ + // Date and time at which the multipart upload was initiated. int64 initiated = 1; + // Identifies who initiated the multipart upload. Initiator initiator = 2; // Name of the object key. // This member is required. string key = 3; + // Specifies the owner of the object that is part of the multipart upload. Owner owner = 4; + // The class of storage used to store the object. string storage_class = 5; + // // Upload ID that identifies the multipart upload. string upload_id = 6; } + +// ListMultipartUploadsOutput message ListMultipartUploadsOutput{ // The bucket name containing the object // This member is required string bucket = 1; + // If you specify a delimiter in the request, then the result returns each distinct + // key prefix containing the delimiter in a CommonPrefixes element. repeated string common_prefixes = 2; + // 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. string delimiter = 3; + // Encoding type used by Amazon S3 to encode object keys in the response. string encoding_type = 4; // 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 @@ -1006,6 +1095,7 @@ message ListMultipartUploadsOutput{ repeated MultipartUpload uploads = 12; } +// ListObjectVersionsInput message ListObjectVersionsInput{ // Required. The name of oss store. string store_name = 1; @@ -1018,7 +1108,10 @@ message ListObjectVersionsInput{ // counted as one result against the max-keys limitation. These keys are not // returned elsewhere in the response. string delimiter = 3; + // 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; string encoding_type = 4; + // The account ID of the expected bucket owner string expected_bucket_owner = 5; // Specifies the key to start with when listing objects in a bucket. string key_marker = 6; @@ -1037,6 +1130,8 @@ message ListObjectVersionsInput{ // Specifies the object version you want to start listing from. string version_id_marker = 9; } + +// DeleteMarkerEntry message DeleteMarkerEntry{ // Specifies whether the object is (true) or is not (false) the latest version of // an object. @@ -1046,11 +1141,15 @@ message DeleteMarkerEntry{ string key = 2; // Date and time the object was last modified. int64 last_modified = 3; + // Owner Owner owner = 4; // Version ID of an object. string version_id = 5; } + +// ObjectVersion message ObjectVersion{ + // The entity tag is an MD5 hash of that version of the object. string etag = 1; // Specifies whether the object is (true) or is not (false) the latest version of // an object. @@ -1058,29 +1157,54 @@ message ObjectVersion{ // Name of the object key. // This member is required. string key = 3; + // Date and time the object was last modified. int64 last_modified = 4; + // Specifies the owner of the object. Owner owner = 5; + // Size in bytes of the object. int64 size = 6; + // The class of storage used to store the object. string storage_class = 7; + // Version ID of an object. string version_id = 8; } + +// ListObjectVersionsOutput message ListObjectVersionsOutput{ + // All of the keys rolled up into a common prefix count as a single return when + // calculating the number of returns. repeated string common_prefixes = 1; + // Container for an object that is a delete marker. repeated DeleteMarkerEntry delete_markers = 2; + // The delimiter grouping the included keys. string delimiter = 3; + // Encoding type used by Amazon S3 to encode object key names in the XML response. string encoding_type = 4; + // A flag that indicates whether Amazon S3 returned all of the results that + // satisfied the search criteria bool is_truncated = 5; + // Marks the last key returned in a truncated response. string key_marker = 6; + // Specifies the maximum number of objects to return int64 max_keys = 7; + // The bucket name. string name = 8; + // When the number of responses exceeds the value of MaxKeys, NextKeyMarker + // specifies the first key not returned that satisfies the search criteria string next_key_marker = 9; + // When the number of responses exceeds the value of MaxKeys, NextVersionIdMarker + // specifies the first object version not returned that satisfies the search + // criteria. string next_version_id_marker = 10; + // Selects objects that start with the value supplied by this parameter. string prefix = 11; + // Marks the last version of the key returned in a truncated response. string version_id_marker = 12; // Container for version information. repeated ObjectVersion versions = 13; } +// HeadObjectInput message HeadObjectInput{ // Required. The name of oss store. string store_name = 1; @@ -1090,11 +1214,20 @@ message HeadObjectInput{ // Name of the object key. // This member is required. string key = 3; + // To retrieve the checksum, this parameter must be enabled string checksum_mode = 4; + // The account ID of the expected bucket owner string expected_bucket_owner = 5; + // Return the object only if its entity tag (ETag) is the same as the one + // specified; otherwise, return a 412 (precondition failed) error. string if_match = 6; + // Return the object only if it has been modified since the specified time; + // otherwise, return a 304 (not modified) error. int64 if_modified_since = 7; + // Return the object only if its entity tag (ETag) is different from the one + // specified string if_none_match = 8; + // Return the object only if it has not been modified since the specified time; int64 if_unmodified_since = 9; // 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. @@ -1103,18 +1236,27 @@ message HeadObjectInput{ int32 part_number = 10; // Confirms that the requester knows that they will be charged for the request. string request_payer = 11; + // Specifies the algorithm to use to when encrypting the object (for example, + // AES256). string sse_customer_algorithm = 12; + // Specifies the customer-provided encryption key for Amazon S3 to use in + // encrypting data string sse_customer_key = 13; + // Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. string sse_customer_key_md5 = 14; + // VersionId used to reference a specific version of the object. string version_id = 15; // Return object details meta bool with_details = 16; } + +// HeadObjectOutput message HeadObjectOutput{ // Metadata pertaining to the operation's result. map result_metadata = 1; } +// IsObjectExistInput message IsObjectExistInput{ // Required. The name of oss store. string store_name = 1; @@ -1124,12 +1266,17 @@ message IsObjectExistInput{ // Name of the object key. // This member is required. string key = 3; + // Object version id string version_id = 4; } + +// IsObjectExistOutput message IsObjectExistOutput{ + // Object exist or not bool file_exist = 1; } +// SignURLInput message SignURLInput{ // Required. The name of oss store. string store_name = 1; @@ -1144,10 +1291,14 @@ message SignURLInput{ // expire time of the sign url int64 expired_in_sec = 5; } + +// SignURLOutput message SignURLOutput{ + // Object signed url string signed_url = 1; } +// UpdateBandwidthRateLimitInput message UpdateBandwidthRateLimitInput{ // Required. The name of oss store. string store_name = 1; @@ -1157,6 +1308,7 @@ message UpdateBandwidthRateLimitInput{ string gateway_resource_name = 3; } +// AppendObjectInput message AppendObjectInput{ // Required. The name of oss store. string store_name = 1; @@ -1166,26 +1318,41 @@ message AppendObjectInput{ // Name of the object key. // This member is required. string key = 3; + // Object content bytes body = 4; + // Append start position int64 position = 5; + // Object ACL string acl = 6; + // Sets the Cache-Control header of the response. string cache_control = 7; + // Sets the Content-Disposition header of the response string content_disposition = 8; + // Sets the Content-Encoding header of the response string content_encoding = 9; + // The base64-encoded 128-bit MD5 digest of the part data. string content_md5 = 10; + // Sets the Expires header of the response int64 expires = 11; + // Provides storage class information of the object. Amazon S3 returns this header + // for all objects except for S3 Standard storage class objects. string storage_class = 12; // The server-side encryption algorithm used when storing this object in Amazon S3 // (for example, AES256, aws:kms). string server_side_encryption = 13; + // Object metadata string meta = 14; map tags = 15; } + +// AppendObjectOutput message AppendObjectOutput{ + // Next append position int64 append_position = 1; } +// ListPartsInput message ListPartsInput{ // Required. The name of oss store. string store_name = 1; @@ -1207,6 +1374,8 @@ message ListPartsInput{ // Upload ID identifying the multipart upload whose parts are being listed. string upload_id = 8; } + +// Part message Part{ // Part Etag string etag = 1; @@ -1217,6 +1386,8 @@ message Part{ // Part size int64 size = 4; } + +// ListPartsOutput message ListPartsOutput{ // The bucket name containing the object // This member is required From a15c15d7b9a6e3a7c55d0dc5e3136d1d5cdcafa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 25 Jul 2022 16:29:31 +0800 Subject: [PATCH 125/126] add comments --- spec/proto/extension/v1/oss.pb.go | 754 ++++++++++++++++++++++-------- spec/proto/extension/v1/oss.proto | 9 + 2 files changed, 568 insertions(+), 195 deletions(-) diff --git a/spec/proto/extension/v1/oss.pb.go b/spec/proto/extension/v1/oss.pb.go index dfe1b7c9d0..6f18decf17 100644 --- a/spec/proto/extension/v1/oss.pb.go +++ b/spec/proto/extension/v1/oss.pb.go @@ -26,11 +26,13 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// GetObjectInput type GetObjectInput 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 @@ -58,10 +60,6 @@ type GetObjectInput struct { // end is used to specify the location where the file end End int64 `protobuf:"varint,11,opt,name=end,proto3" json:"end,omitempty"` // Confirms that the requester knows that they will be charged for the request. - // Bucket owners need not specify this parameter in their requests. For information - // about downloading objects from Requester Pays buckets, see Downloading Objects - // in Requester Pays Buckets - // (https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html) RequestPayer string `protobuf:"bytes,12,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` // Sets the Cache-Control header of the response. ResponseCacheControl string `protobuf:"bytes,13,opt,name=response_cache_control,json=responseCacheControl,proto3" json:"response_cache_control,omitempty"` @@ -294,6 +292,7 @@ func (x *GetObjectInput) GetSignedUrl() string { return "" } +// GetObjectOutput type GetObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -505,11 +504,13 @@ func (x *GetObjectOutput) GetMetadata() map[string]string { return nil } +// PutObjectInput type PutObjectInput 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"` // Object data. Body []byte `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"` @@ -521,11 +522,8 @@ type PutObjectInput struct { Key string `protobuf:"bytes,4,opt,name=key,proto3" json:"key,omitempty"` // The canned ACL to apply to the object,different oss provider have different acl type Acl string `protobuf:"bytes,5,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. + // 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,6,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` // Can be used to specify caching behavior along the request/reply chain. CacheControl string `protobuf:"bytes,7,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` @@ -684,6 +682,7 @@ func (x *PutObjectInput) GetTagging() map[string]string { return nil } +// PutObjectOutput type PutObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -769,11 +768,13 @@ func (x *PutObjectOutput) GetVersionId() string { return "" } +// DeleteObjectInput type DeleteObjectInput 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 to which the DEL action was initiated // This member is required. @@ -782,11 +783,6 @@ type DeleteObjectInput struct { // This member is required. Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` // Confirms that the requester knows that they will be charged for the request. - // Bucket owners need not specify this parameter in their requests. For information - // about downloading objects from Requester Pays buckets, see Downloading Objects - // in Requester Pays Buckets - // (https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html) - // in the Amazon S3 User Guide. RequestPayer string `protobuf:"bytes,4,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,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"` @@ -859,6 +855,7 @@ func (x *DeleteObjectInput) GetVersionId() string { return "" } +// DeleteObjectOutput type DeleteObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -928,11 +925,13 @@ func (x *DeleteObjectOutput) GetVersionId() string { return "" } +// PutObjectTaggingInput type PutObjectTaggingInput 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. @@ -1013,6 +1012,7 @@ func (x *PutObjectTaggingInput) GetVersionId() string { return "" } +// PutObjectTaggingOutput type PutObjectTaggingOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1070,11 +1070,13 @@ func (x *PutObjectTaggingOutput) GetResultMetadata() map[string]string { return nil } +// DeleteObjectTaggingInput type DeleteObjectTaggingInput 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 objects from which to remove the tags. Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` @@ -1156,6 +1158,7 @@ func (x *DeleteObjectTaggingInput) GetExpectedBucketOwner() string { return "" } +// DeleteObjectTaggingOutput type DeleteObjectTaggingOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1213,11 +1216,13 @@ func (x *DeleteObjectTaggingOutput) GetResultMetadata() map[string]string { return nil } +// GetObjectTaggingInput type GetObjectTaggingInput 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 for which to get the tagging information. // This member is required. @@ -1309,6 +1314,7 @@ func (x *GetObjectTaggingInput) GetRequestPayer() string { return "" } +// GetObjectTaggingOutput type GetObjectTaggingOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1376,6 +1382,7 @@ func (x *GetObjectTaggingOutput) GetResultMetadata() map[string]string { return nil } +// CopySource type CopySource struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1442,18 +1449,21 @@ func (x *CopySource) GetCopySourceVersionId() string { return "" } +// CopyObjectInput type CopyObjectInput 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 name of the destination bucket. When using this action with an access point // This member is required. Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` // The key of the destination object. // This member is required. - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + 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"` // The tag-set for the object destination object this value must be used in // conjunction with the TaggingDirective. The tag-set must be encoded as URL Query @@ -1555,6 +1565,7 @@ func (x *CopyObjectInput) GetMetadata() map[string]string { return nil } +// CopyObjectResult type CopyObjectResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1613,6 +1624,7 @@ func (x *CopyObjectResult) GetLastModified() int64 { return 0 } +// CopyObjectOutput type CopyObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1679,11 +1691,13 @@ func (x *CopyObjectOutput) GetExpiration() string { return "" } +// Delete type Delete struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // ObjectIdentifier Objects []*ObjectIdentifier `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` // Element to enable quiet mode for the request. When you add this element, you // must set its value to true. @@ -1736,6 +1750,7 @@ func (x *Delete) GetQuiet() bool { return false } +// ObjectIdentifier type ObjectIdentifier struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1794,15 +1809,21 @@ func (x *ObjectIdentifier) GetVersionId() string { return "" } +// DeleteObjectsInput type DeleteObjectsInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Delete *Delete `protobuf:"bytes,3,opt,name=delete,proto3" json:"delete,omitempty"` - RequestPayer string `protobuf:"bytes,4,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,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"` + // Delete objects + Delete *Delete `protobuf:"bytes,3,opt,name=delete,proto3" json:"delete,omitempty"` + // Confirms that the requester knows that they will be charged for the request. + RequestPayer string `protobuf:"bytes,4,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` } func (x *DeleteObjectsInput) Reset() { @@ -1865,6 +1886,7 @@ func (x *DeleteObjectsInput) GetRequestPayer() string { return "" } +// DeletedObject type DeletedObject struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1944,11 +1966,13 @@ func (x *DeletedObject) GetVersionId() string { return "" } +// DeleteObjectsOutput type DeleteObjectsOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // DeletedObject Deleted []*DeletedObject `protobuf:"bytes,1,rep,name=deleted,proto3" json:"deleted,omitempty"` } @@ -1991,13 +2015,17 @@ func (x *DeleteObjectsOutput) GetDeleted() []*DeletedObject { return nil } +// ListObjectsInput type ListObjectsInput 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"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,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 you use to group keys. 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 @@ -2020,9 +2048,7 @@ type ListObjectsInput struct { MaxKeys int32 `protobuf:"varint,7,opt,name=maxKeys,proto3" json:"maxKeys,omitempty"` // Limits the response to keys that begin with the specified prefix. Prefix string `protobuf:"bytes,8,opt,name=prefix,proto3" json:"prefix,omitempty"` - // Confirms that the requester knows that she or he will be charged for the list - // objects request. Bucket owners need not specify this parameter in their - // requests. + // 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"` } @@ -2121,13 +2147,16 @@ func (x *ListObjectsInput) GetRequestPayer() string { return "" } +// ListObjectsOutput type ListObjectsOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CommonPrefixes []string `protobuf:"bytes,1,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` - Contents []*Object `protobuf:"bytes,2,rep,name=contents,proto3" json:"contents,omitempty"` + // CommonPrefixes + CommonPrefixes []string `protobuf:"bytes,1,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` + // Objects contents + Contents []*Object `protobuf:"bytes,2,rep,name=contents,proto3" json:"contents,omitempty"` // Causes keys that contain the same string between the prefix and the first // occurrence of the delimiter to be rolled up into a single result element in the // CommonPrefixes collection. These rolled-up keys are not returned elsewhere in @@ -2256,13 +2285,16 @@ func (x *ListObjectsOutput) GetPrefix() string { return "" } +// Owner type Owner struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // Owner display name DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + // Owner id + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` } func (x *Owner) Reset() { @@ -2311,6 +2343,7 @@ func (x *Owner) GetId() string { return "" } +// Object type Object struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2405,14 +2438,20 @@ func (x *Object) GetStorageClass() string { return "" } +// GetObjectCannedAclInput type GetObjectCannedAclInput 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"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,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"` // VersionId used to reference a specific version of the object VersionId string `protobuf:"bytes,4,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } @@ -2477,13 +2516,16 @@ func (x *GetObjectCannedAclInput) GetVersionId() string { return "" } +// GetObjectCannedAclOutput type GetObjectCannedAclOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // Object CannedACL CannedAcl string `protobuf:"bytes,1,opt,name=canned_acl,json=cannedAcl,proto3" json:"canned_acl,omitempty"` - Owner *Owner `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,omitempty"` + // Owner + Owner *Owner `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,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"` @@ -2542,14 +2584,20 @@ func (x *GetObjectCannedAclOutput) GetRequestCharged() string { return "" } +// PutObjectCannedAclInput type PutObjectCannedAclInput 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"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,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 Acl string `protobuf:"bytes,4,opt,name=acl,proto3" json:"acl,omitempty"` // VersionId used to reference a specific version of the object. @@ -2623,11 +2671,13 @@ func (x *PutObjectCannedAclInput) GetVersionId() string { return "" } +// PutObjectCannedAclOutput type PutObjectCannedAclOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // Request charged RequestCharged string `protobuf:"bytes,1,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` } @@ -2670,14 +2720,20 @@ func (x *PutObjectCannedAclOutput) GetRequestCharged() string { return "" } +// RestoreObjectInput type RestoreObjectInput 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"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,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"` // 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"` } @@ -2742,6 +2798,7 @@ func (x *RestoreObjectInput) GetVersionId() string { return "" } +// RestoreObjectOutput type RestoreObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2801,47 +2858,89 @@ func (x *RestoreObjectOutput) GetRestoreOutputPath() string { return "" } +// CreateMultipartUploadInput type CreateMultipartUploadInput 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"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,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"` - BucketKeyEnabled bool `protobuf:"varint,5,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - CacheControl string `protobuf:"bytes,6,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` + 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"` - ContentEncoding string `protobuf:"bytes,8,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` - ContentLanguage string `protobuf:"bytes,9,opt,name=content_language,json=contentLanguage,proto3" json:"content_language,omitempty"` - ContentType string `protobuf:"bytes,10,opt,name=content_type,json=contentType,proto3" json:"content_type,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"` - Expires int64 `protobuf:"varint,12,opt,name=expires,proto3" json:"expires,omitempty"` - GrantFullControl string `protobuf:"bytes,13,opt,name=grant_full_control,json=grantFullControl,proto3" json:"grant_full_control,omitempty"` - GrantRead string `protobuf:"bytes,14,opt,name=grant_read,json=grantRead,proto3" json:"grant_read,omitempty"` - GrantReadAcp string `protobuf:"bytes,15,opt,name=grant_read_acp,json=grantReadAcp,proto3" json:"grant_read_acp,omitempty"` - GrantWriteAcp string `protobuf:"bytes,16,opt,name=grant_write_acp,json=grantWriteAcp,proto3" json:"grant_write_acp,omitempty"` - 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"` - ObjectLockLegalHoldStatus string `protobuf:"bytes,18,opt,name=object_lock_legal_hold_status,json=objectLockLegalHoldStatus,proto3" json:"object_lock_legal_hold_status,omitempty"` - ObjectLockMode string `protobuf:"bytes,19,opt,name=object_lock_mode,json=objectLockMode,proto3" json:"object_lock_mode,omitempty"` - ObjectLockRetainUntilDate int64 `protobuf:"varint,20,opt,name=object_lock_retain_until_date,json=objectLockRetainUntilDate,proto3" json:"object_lock_retain_until_date,omitempty"` - RequestPayer string `protobuf:"bytes,21,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - SseCustomerAlgorithm string `protobuf:"bytes,22,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - SseCustomerKey string `protobuf:"bytes,23,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` - SseCustomerKeyMd5 string `protobuf:"bytes,24,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - SseKmsEncryptionContext string `protobuf:"bytes,25,opt,name=sse_kms_encryption_context,json=sseKmsEncryptionContext,proto3" json:"sse_kms_encryption_context,omitempty"` - SseKmsKeyId string `protobuf:"bytes,26,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` - ServerSideEncryption string `protobuf:"bytes,27,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` - StorageClass string `protobuf:"bytes,28,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` + 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"` - WebsiteRedirectLocation string `protobuf:"bytes,30,opt,name=website_redirect_location,json=websiteRedirectLocation,proto3" json:"website_redirect_location,omitempty"` + 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() { @@ -3086,22 +3185,49 @@ func (x *CreateMultipartUploadInput) GetWebsiteRedirectLocation() string { return "" } +// CreateMultipartUploadOutput type CreateMultipartUploadOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - AbortDate int64 `protobuf:"varint,3,opt,name=abort_date,json=abortDate,proto3" json:"abort_date,omitempty"` - AbortRuleId string `protobuf:"bytes,4,opt,name=abort_rule_id,json=abortRuleId,proto3" json:"abort_rule_id,omitempty"` - BucketKeyEnabled bool `protobuf:"varint,5,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - RequestCharged string `protobuf:"bytes,6,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` - SseCustomerAlgorithm string `protobuf:"bytes,7,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - SseCustomerKeyMd5 string `protobuf:"bytes,8,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + // 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,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"` - SseKmsKeyId string `protobuf:"bytes,10,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` - ServerSideEncryption string `protobuf:"bytes,11,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,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"` } @@ -3222,28 +3348,42 @@ func (x *CreateMultipartUploadOutput) GetUploadId() string { return "" } +// UploadPartInput type UploadPartInput 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"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,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 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"` - ContentMd5 string `protobuf:"bytes,6,opt,name=content_md5,json=contentMd5,proto3" json:"content_md5,omitempty"` + 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"` - RequestPayer string `protobuf:"bytes,9,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,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,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"` - SseCustomerKey string `protobuf:"bytes,11,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` - SseCustomerKeyMd5 string `protobuf:"bytes,12,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,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"` @@ -3372,18 +3512,29 @@ func (x *UploadPartInput) GetUploadId() string { return "" } +// UploadPartOutput type UploadPartOutput 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"` - RequestCharged string `protobuf:"bytes,3,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + 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"` + // 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"` - SseCustomerKeyMd5 string `protobuf:"bytes,5,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - SseKmsKeyId string `protobuf:"bytes,6,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,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,7,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` } @@ -3468,14 +3619,21 @@ func (x *UploadPartOutput) GetServerSideEncryption() string { return "" } +// UploadPartCopyInput type UploadPartCopyInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,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"` + // 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. @@ -3485,7 +3643,8 @@ type UploadPartCopyInput struct { 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"` - PartSize int64 `protobuf:"varint,8,opt,name=part_size,json=partSize,proto3" json:"part_size,omitempty"` + // Part size + PartSize int64 `protobuf:"varint,8,opt,name=part_size,json=partSize,proto3" json:"part_size,omitempty"` } func (x *UploadPartCopyInput) Reset() { @@ -3576,14 +3735,16 @@ func (x *UploadPartCopyInput) GetPartSize() int64 { return 0 } +// 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"` - LastModified int64 `protobuf:"varint,2,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` + 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 *CopyPartResult) Reset() { @@ -3632,19 +3793,37 @@ func (x *CopyPartResult) GetLastModified() int64 { return 0 } +// UploadPartCopyOutput type UploadPartCopyOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - BucketKeyEnabled bool `protobuf:"varint,1,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - CopyPartResult *CopyPartResult `protobuf:"bytes,2,opt,name=copy_part_result,json=copyPartResult,proto3" json:"copy_part_result,omitempty"` - CopySourceVersionId string `protobuf:"bytes,3,opt,name=copy_source_version_id,json=copySourceVersionId,proto3" json:"copy_source_version_id,omitempty"` - RequestCharged string `protobuf:"bytes,4,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` - SseCustomerAlgorithm string `protobuf:"bytes,5,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - SseCustomerKeyMd5 string `protobuf:"bytes,6,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - SseKmsKeyId string `protobuf:"bytes,7,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` - ServerSideEncryption string `protobuf:"bytes,8,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,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"` + // 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() { @@ -3735,13 +3914,17 @@ func (x *UploadPartCopyOutput) GetServerSideEncryption() string { return "" } +// CompletedPart type CompletedPart struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` - PartNumber int32 `protobuf:"varint,2,opt,name=part_number,json=partNumber,proto3" json:"part_number,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 *CompletedPart) Reset() { @@ -3790,6 +3973,7 @@ func (x *CompletedPart) GetPartNumber() int32 { return 0 } +// CompletedMultipartUpload type CompletedMultipartUpload struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3838,18 +4022,26 @@ func (x *CompletedMultipartUpload) GetParts() []*CompletedPart { return nil } +// 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"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,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"` - RequestPayer string `protobuf:"bytes,5,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + 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"` @@ -3936,15 +4128,23 @@ func (x *CompleteMultipartUploadInput) GetMultipartUpload() *CompletedMultipartU return nil } +// CompleteMultipartUploadOutput type CompleteMultipartUploadOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - BucketKeyEnabled bool `protobuf:"varint,3,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - Etag string `protobuf:"bytes,4,opt,name=etag,proto3" json:"etag,omitempty"` + // 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"` @@ -3952,8 +4152,13 @@ type CompleteMultipartUploadOutput struct { 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"` - SseKmsKeyId string `protobuf:"bytes,8,opt,name=sse_kms_keyId,json=sseKmsKeyId,proto3" json:"sse_kms_keyId,omitempty"` + 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. @@ -4062,16 +4267,24 @@ func (x *CompleteMultipartUploadOutput) GetVersionId() string { return "" } +// AbortMultipartUploadInput type AbortMultipartUploadInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,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 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"` - RequestPayer string `protobuf:"bytes,5,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,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"` @@ -4151,6 +4364,7 @@ func (x *AbortMultipartUploadInput) GetUploadId() string { return "" } +// AbortMultipartUploadOutput type AbortMultipartUploadOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4199,21 +4413,28 @@ func (x *AbortMultipartUploadOutput) GetRequestCharged() string { return "" } +// ListMultipartUploadsInput type ListMultipartUploadsInput 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"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,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"` - EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + 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 @@ -4334,13 +4555,16 @@ func (x *ListMultipartUploadsInput) GetUploadIdMarker() string { return "" } +// Initiator type Initiator 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"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + // Initiator id + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` } func (x *Initiator) Reset() { @@ -4389,17 +4613,25 @@ func (x *Initiator) GetId() string { return "" } +// MultipartUpload type MultipartUpload struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Initiated int64 `protobuf:"varint,1,opt,name=initiated,proto3" json:"initiated,omitempty"` - Initiator *Initiator `protobuf:"bytes,2,opt,name=initiator,proto3" json:"initiator,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - Owner *Owner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` - StorageClass string `protobuf:"bytes,5,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` - UploadId string `protobuf:"bytes,6,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + // 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 *MultipartUpload) Reset() { @@ -4476,15 +4708,23 @@ func (x *MultipartUpload) GetUploadId() string { return "" } +// ListMultipartUploadsOutput type ListMultipartUploadsOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + // 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"` - Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` - EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,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 @@ -4627,20 +4867,27 @@ func (x *ListMultipartUploadsOutput) GetUploads() []*MultipartUpload { return nil } +// ListObjectVersionsInput type ListObjectVersionsInput 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"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,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"` - EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + 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"` @@ -4755,6 +5002,7 @@ func (x *ListObjectVersionsInput) GetVersionIdMarker() string { return "" } +// DeleteMarkerEntry type DeleteMarkerEntry struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4762,11 +5010,14 @@ type DeleteMarkerEntry struct { // 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"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + 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 `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` + 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"` } @@ -4838,21 +5089,30 @@ func (x *DeleteMarkerEntry) GetVersionId() string { 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"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - LastModified int64 `protobuf:"varint,4,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` - Owner *Owner `protobuf:"bytes,5,opt,name=owner,proto3" json:"owner,omitempty"` - Size int64 `protobuf:"varint,6,opt,name=size,proto3" json:"size,omitempty"` + 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"` - VersionId string `protobuf:"bytes,8,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + // Version ID of an object. + VersionId string `protobuf:"bytes,8,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } func (x *ObjectVersion) Reset() { @@ -4943,23 +5203,41 @@ func (x *ObjectVersion) GetVersionId() string { return "" } +// ListObjectVersionsOutput type ListObjectVersionsOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CommonPrefixes []string `protobuf:"bytes,1,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` - DeleteMarkers []*DeleteMarkerEntry `protobuf:"bytes,2,rep,name=delete_markers,json=deleteMarkers,proto3" json:"delete_markers,omitempty"` - Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` - EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` - IsTruncated bool `protobuf:"varint,5,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` - KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` - MaxKeys int64 `protobuf:"varint,7,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` - Name string `protobuf:"bytes,8,opt,name=name,proto3" json:"name,omitempty"` - NextKeyMarker string `protobuf:"bytes,9,opt,name=next_key_marker,json=nextKeyMarker,proto3" json:"next_key_marker,omitempty"` - NextVersionIdMarker string `protobuf:"bytes,10,opt,name=next_version_id_marker,json=nextVersionIdMarker,proto3" json:"next_version_id_marker,omitempty"` - Prefix string `protobuf:"bytes,11,opt,name=prefix,proto3" json:"prefix,omitempty"` - VersionIdMarker string `protobuf:"bytes,12,opt,name=version_id_marker,json=versionIdMarker,proto3" json:"version_id_marker,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"` } @@ -5087,30 +5365,52 @@ func (x *ListObjectVersionsOutput) GetVersions() []*ObjectVersion { return nil } +// HeadObjectInput type HeadObjectInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - ChecksumMode string `protobuf:"bytes,4,opt,name=checksum_mode,json=checksumMode,proto3" json:"checksum_mode,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"` + // 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"` - IfMatch string `protobuf:"bytes,6,opt,name=if_match,json=ifMatch,proto3" json:"if_match,omitempty"` - IfModifiedSince int64 `protobuf:"varint,7,opt,name=if_modified_since,json=ifModifiedSince,proto3" json:"if_modified_since,omitempty"` - IfNoneMatch string `protobuf:"bytes,8,opt,name=if_none_match,json=ifNoneMatch,proto3" json:"if_none_match,omitempty"` - IfUnmodifiedSince int64 `protobuf:"varint,9,opt,name=if_unmodified_since,json=ifUnmodifiedSince,proto3" json:"if_unmodified_since,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"` - RequestPayer string `protobuf:"bytes,11,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + 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"` - SseCustomerKey string `protobuf:"bytes,13,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` - SseCustomerKeyMd5 string `protobuf:"bytes,14,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - VersionId string `protobuf:"bytes,15,opt,name=version_id,json=versionId,proto3" json:"version_id,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"` } @@ -5259,6 +5559,7 @@ func (x *HeadObjectInput) GetWithDetails() bool { return false } +// HeadObjectOutput type HeadObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5307,14 +5608,21 @@ func (x *HeadObjectOutput) GetResultMetadata() map[string]string { 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"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,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"` } @@ -5378,11 +5686,13 @@ func (x *IsObjectExistInput) GetVersionId() string { return "" } +// 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"` } @@ -5425,14 +5735,20 @@ func (x *IsObjectExistOutput) GetFileExist() bool { 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"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,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 @@ -5506,11 +5822,13 @@ func (x *SignURLInput) GetExpiredInSec() int64 { return 0 } +// SignURLOutput type SignURLOutput 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"` } @@ -5553,11 +5871,13 @@ func (x *SignURLOutput) GetSignedUrl() string { 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"` @@ -5618,26 +5938,46 @@ func (x *UpdateBandwidthRateLimitInput) GetGatewayResourceName() string { return "" } +// AppendObjectInput type AppendObjectInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - Body []byte `protobuf:"bytes,4,opt,name=body,proto3" json:"body,omitempty"` - Position int64 `protobuf:"varint,5,opt,name=position,proto3" json:"position,omitempty"` - Acl string `protobuf:"bytes,6,opt,name=acl,proto3" json:"acl,omitempty"` - CacheControl string `protobuf:"bytes,7,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` - ContentDisposition string `protobuf:"bytes,8,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` - ContentEncoding string `protobuf:"bytes,9,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` - ContentMd5 string `protobuf:"bytes,10,opt,name=content_md5,json=contentMd5,proto3" json:"content_md5,omitempty"` - Expires int64 `protobuf:"varint,11,opt,name=expires,proto3" json:"expires,omitempty"` - StorageClass string `protobuf:"bytes,12,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` - ServerSideEncryption string `protobuf:"bytes,13,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` - Meta string `protobuf:"bytes,14,opt,name=meta,proto3" json:"meta,omitempty"` - 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"` + // 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() { @@ -5777,11 +6117,13 @@ func (x *AppendObjectInput) GetTags() map[string]string { 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"` } @@ -5824,19 +6166,31 @@ func (x *AppendObjectOutput) GetAppendPosition() int64 { return 0 } +// ListPartsInput type ListPartsInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,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 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"` - MaxParts int64 `protobuf:"varint,5,opt,name=max_parts,json=maxParts,proto3" json:"max_parts,omitempty"` - PartNumberMarker int64 `protobuf:"varint,6,opt,name=part_number_marker,json=partNumberMarker,proto3" json:"part_number_marker,omitempty"` - RequestPayer string `protobuf:"bytes,7,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - UploadId string `protobuf:"bytes,8,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,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() { @@ -5927,15 +6281,20 @@ func (x *ListPartsInput) GetUploadId() string { return "" } +// Part type Part struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` - LastModified int64 `protobuf:"varint,2,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` - PartNumber int64 `protobuf:"varint,3,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` - Size int64 `protobuf:"varint,4,opt,name=size,proto3" json:"size,omitempty"` + // 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() { @@ -5998,13 +6357,18 @@ func (x *Part) GetSize() int64 { 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"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,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 diff --git a/spec/proto/extension/v1/oss.proto b/spec/proto/extension/v1/oss.proto index 4a25a9cf09..caa6a1567b 100644 --- a/spec/proto/extension/v1/oss.proto +++ b/spec/proto/extension/v1/oss.proto @@ -949,6 +949,7 @@ message CompleteMultipartUploadOutput{ // Indicates whether the multipart upload uses an S3 Bucket Key for server-side // encryption with Amazon Web Services KMS (SSE-KMS). bool bucket_key_enabled = 3; + // Entity tag that identifies the newly created object's data string etag = 4; // 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. @@ -958,6 +959,9 @@ message CompleteMultipartUploadOutput{ // If present, indicates that the requester was successfully charged for the // request. string request_charged = 7; + // 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. string sse_kms_keyId = 8; // The server-side encryption algorithm used when storing this object in Amazon S3 // (for example, AES256, aws:kms). @@ -977,6 +981,7 @@ message AbortMultipartUploadInput{ // Name of the object key. // This member is required. string key = 3; + // The account ID of the expected bucket owner string expected_bucket_owner = 4; // Confirms that the requester knows that they will be charged for the request. string request_payer = 5; @@ -1005,7 +1010,10 @@ message ListMultipartUploadsInput{ // key. The keys that are grouped under CommonPrefixes result element are not // returned elsewhere in the response. string delimiter = 3; + // 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; string encoding_type = 4; + // The account ID of the expected bucket owner string expected_bucket_owner = 5; // 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 @@ -1342,6 +1350,7 @@ message AppendObjectInput{ string server_side_encryption = 13; // Object metadata string meta = 14; + // Object tags map tags = 15; } From ebfa15fccf501101ea06f57dacc141011e2bc741 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E5=BE=90?= Date: Mon, 25 Jul 2022 17:18:55 +0800 Subject: [PATCH 126/126] format pb file comments --- spec/proto/extension/v1/oss.pb.go | 4 ++-- spec/proto/extension/v1/oss.proto | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/spec/proto/extension/v1/oss.pb.go b/spec/proto/extension/v1/oss.pb.go index 6f18decf17..323aa2e9b6 100644 --- a/spec/proto/extension/v1/oss.pb.go +++ b/spec/proto/extension/v1/oss.pb.go @@ -4630,7 +4630,7 @@ type MultipartUpload struct { 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. + // Upload ID that identifies the multipart upload. UploadId string `protobuf:"bytes,6,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` } @@ -5881,7 +5881,7 @@ type UpdateBandwidthRateLimitInput struct { 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 + // Resource name of gateway GatewayResourceName string `protobuf:"bytes,3,opt,name=gateway_resource_name,json=gatewayResourceName,proto3" json:"gateway_resource_name,omitempty"` } diff --git a/spec/proto/extension/v1/oss.proto b/spec/proto/extension/v1/oss.proto index caa6a1567b..98d5344634 100644 --- a/spec/proto/extension/v1/oss.proto +++ b/spec/proto/extension/v1/oss.proto @@ -395,9 +395,9 @@ message GetObjectTaggingOutput{ message CopySource{ // source object bucket name string copy_source_bucket = 1; - // source object name + // source object name string copy_source_key = 2; - // source object version + // source object version string copy_source_version_id = 3; } @@ -755,7 +755,7 @@ message CreateMultipartUploadOutput{ // incomplete multipart uploads. string abort_rule_id = 4; // Indicates whether the multipart upload uses an S3 Bucket Key for server-side - // encryption with Amazon Web Services KMS (SSE-KMS). + // encryption with Amazon Web Services KMS (SSE-KMS). bool bucket_key_enabled = 5; // If present, indicates that the requester was successfully charged for the // request. @@ -1060,7 +1060,7 @@ message MultipartUpload{ Owner owner = 4; // The class of storage used to store the object. string storage_class = 5; - // // Upload ID that identifies the multipart upload. + // Upload ID that identifies the multipart upload. string upload_id = 6; } @@ -1312,7 +1312,7 @@ message UpdateBandwidthRateLimitInput{ string store_name = 1; // The average upload/download bandwidth rate limit in bits per second. int64 average_rate_limit_in_bits_per_sec = 2; - //Resource name of gateway + // Resource name of gateway string gateway_resource_name = 3; }