From a4b937a52f28f4a5bd628eb234897524c03f2dd5 Mon Sep 17 00:00:00 2001 From: Shravan Shetty Date: Wed, 7 Jul 2021 16:09:51 +0530 Subject: [PATCH 1/9] :art: fixed package naming convention --- .../{blobberHTTP => blobberhttp}/response.go | 2 +- .../blobbercore/convert/responseHandler.go | 48 +++++++++---------- .../handler/object_operation_handler.go | 27 +++++------ .../blobbercore/handler/storage_handler.go | 27 +++++------ 4 files changed, 51 insertions(+), 53 deletions(-) rename code/go/0chain.net/blobbercore/{blobberHTTP => blobberhttp}/response.go (99%) diff --git a/code/go/0chain.net/blobbercore/blobberHTTP/response.go b/code/go/0chain.net/blobbercore/blobberhttp/response.go similarity index 99% rename from code/go/0chain.net/blobbercore/blobberHTTP/response.go rename to code/go/0chain.net/blobbercore/blobberhttp/response.go index d6c72baf9..e09b4430a 100644 --- a/code/go/0chain.net/blobbercore/blobberHTTP/response.go +++ b/code/go/0chain.net/blobbercore/blobberhttp/response.go @@ -1,4 +1,4 @@ -package blobberHTTP +package blobberhttp import ( "github.com/0chain/blobber/code/go/0chain.net/blobbercore/allocation" diff --git a/code/go/0chain.net/blobbercore/convert/responseHandler.go b/code/go/0chain.net/blobbercore/convert/responseHandler.go index 800bee170..aeba4f122 100644 --- a/code/go/0chain.net/blobbercore/convert/responseHandler.go +++ b/code/go/0chain.net/blobbercore/convert/responseHandler.go @@ -3,12 +3,12 @@ package convert import ( "context" "encoding/json" + "github.com/0chain/blobber/code/go/0chain.net/core/common" stats2 "github.com/0chain/blobber/code/go/0chain.net/blobbercore/stats" "github.com/0chain/blobber/code/go/0chain.net/blobbercore/allocation" - "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobberHTTP" "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" "github.com/0chain/blobber/code/go/0chain.net/blobbercore/reference" ) @@ -62,7 +62,7 @@ func ListEntitesResponseCreator(r interface{}) *blobbergrpc.ListEntitiesResponse return nil } - httpResp, _ := r.(*blobberHTTP.ListResult) + httpResp, _ := r.(*blobberhttp.ListResult) var resp blobbergrpc.ListEntitiesResponse for i := range httpResp.Entities { @@ -79,7 +79,7 @@ func GetReferencePathResponseCreator(r interface{}) *blobbergrpc.GetReferencePat return nil } - httpResp, _ := r.(*blobberHTTP.ReferencePathResult) + httpResp, _ := r.(*blobberhttp.ReferencePathResult) var resp blobbergrpc.GetReferencePathResponse var recursionCount int @@ -93,7 +93,7 @@ func GetObjectTreeResponseCreator(r interface{}) *blobbergrpc.GetObjectTreeRespo return nil } - httpResp, _ := r.(*blobberHTTP.ReferencePathResult) + httpResp, _ := r.(*blobberhttp.ReferencePathResult) var resp blobbergrpc.GetObjectTreeResponse var recursionCount int @@ -107,7 +107,7 @@ func GetObjectPathResponseCreator(r interface{}) *blobbergrpc.GetObjectPathRespo return nil } - httpResp, _ := r.(*blobberHTTP.ObjectPathResult) + httpResp, _ := r.(*blobberhttp.ObjectPathResult) var resp blobbergrpc.GetObjectPathResponse var pathList []*blobbergrpc.FileRef @@ -133,7 +133,7 @@ func CommitWriteResponseCreator(r interface{}) *blobbergrpc.CommitResponse { return nil } - httpResp, _ := r.(*blobberHTTP.CommitResult) + httpResp, _ := r.(*blobberhttp.CommitResult) return &blobbergrpc.CommitResponse{ AllocationRoot: httpResp.AllocationRoot, @@ -195,7 +195,7 @@ func CopyObjectResponseCreator(r interface{}) *blobbergrpc.CopyObjectResponse { return nil } - httpResp, _ := r.(*blobberHTTP.UploadResult) + httpResp, _ := r.(*blobberhttp.UploadResult) return &blobbergrpc.CopyObjectResponse{ Filename: httpResp.Filename, Size: httpResp.Size, @@ -236,29 +236,29 @@ func GetFileStatsResponseHandler(resp *blobbergrpc.GetFileStatsResponse) map[str return result } -func ListEntitesResponseHandler(resp *blobbergrpc.ListEntitiesResponse) *blobberHTTP.ListResult { +func ListEntitesResponseHandler(resp *blobbergrpc.ListEntitiesResponse) *blobberhttp.ListResult { ctx := context.Background() var entities []map[string]interface{} for i := range resp.Entities { entities = append(entities, FileRefGRPCToFileRef(resp.Entities[i]).GetListingData(ctx)) } - return &blobberHTTP.ListResult{ + return &blobberhttp.ListResult{ AllocationRoot: resp.AllocationRoot, Meta: FileRefGRPCToFileRef(resp.MetaData).GetListingData(ctx), Entities: entities, } } -func GetReferencePathResponseHandler(getReferencePathResponse *blobbergrpc.GetReferencePathResponse) *blobberHTTP.ReferencePathResult { +func GetReferencePathResponseHandler(getReferencePathResponse *blobbergrpc.GetReferencePathResponse) *blobberhttp.ReferencePathResult { var recursionCount int - return &blobberHTTP.ReferencePathResult{ + return &blobberhttp.ReferencePathResult{ ReferencePath: ReferencePathGRPCToReferencePath(&recursionCount, getReferencePathResponse.ReferencePath), LatestWM: WriteMarkerGRPCToWriteMarker(getReferencePathResponse.LatestWM), } } -func GetObjectPathResponseHandler(getObjectPathResponse *blobbergrpc.GetObjectPathResponse) *blobberHTTP.ObjectPathResult { +func GetObjectPathResponseHandler(getObjectPathResponse *blobbergrpc.GetObjectPathResponse) *blobberhttp.ObjectPathResult { ctx := context.Background() path := FileRefGRPCToFileRef(getObjectPathResponse.ObjectPath.Path).GetListingData(ctx) var pathList []map[string]interface{} @@ -267,7 +267,7 @@ func GetObjectPathResponseHandler(getObjectPathResponse *blobbergrpc.GetObjectPa } path["list"] = pathList - return &blobberHTTP.ObjectPathResult{ + return &blobberhttp.ObjectPathResult{ ObjectPath: &reference.ObjectPath{ RootHash: getObjectPathResponse.ObjectPath.RootHash, Meta: FileRefGRPCToFileRef(getObjectPathResponse.ObjectPath.Meta).GetListingData(ctx), @@ -278,16 +278,16 @@ func GetObjectPathResponseHandler(getObjectPathResponse *blobbergrpc.GetObjectPa } } -func GetObjectTreeResponseHandler(getObjectTreeResponse *blobbergrpc.GetObjectTreeResponse) *blobberHTTP.ReferencePathResult { +func GetObjectTreeResponseHandler(getObjectTreeResponse *blobbergrpc.GetObjectTreeResponse) *blobberhttp.ReferencePathResult { var recursionCount int - return &blobberHTTP.ReferencePathResult{ + return &blobberhttp.ReferencePathResult{ ReferencePath: ReferencePathGRPCToReferencePath(&recursionCount, getObjectTreeResponse.ReferencePath), LatestWM: WriteMarkerGRPCToWriteMarker(getObjectTreeResponse.LatestWM), } } -func CommitWriteResponseHandler(resp *blobbergrpc.CommitResponse) *blobberHTTP.CommitResult { - return &blobberHTTP.CommitResult{ +func CommitWriteResponseHandler(resp *blobbergrpc.CommitResponse) *blobberhttp.CommitResult { + return &blobberhttp.CommitResult{ AllocationRoot: resp.AllocationRoot, WriteMarker: WriteMarkerGRPCToWriteMarker(resp.WriteMarker), Success: resp.Success, @@ -338,14 +338,14 @@ func CollaboratorResponse(response *blobbergrpc.CollaboratorResponse) interface{ return nil } -func UpdateObjectAttributesResponseHandler(updateAttributesResponse *blobbergrpc.UpdateObjectAttributesResponse) *blobberHTTP.UpdateObjectAttributesResponse { - return &blobberHTTP.UpdateObjectAttributesResponse{ +func UpdateObjectAttributesResponseHandler(updateAttributesResponse *blobbergrpc.UpdateObjectAttributesResponse) *blobberhttp.UpdateObjectAttributesResponse { + return &blobberhttp.UpdateObjectAttributesResponse{ WhoPaysForReads: common.WhoPays(updateAttributesResponse.WhoPaysForReads), } } -func CopyObjectResponseHandler(copyObjectResponse *blobbergrpc.CopyObjectResponse) *blobberHTTP.UploadResult { - return &blobberHTTP.UploadResult{ +func CopyObjectResponseHandler(copyObjectResponse *blobbergrpc.CopyObjectResponse) *blobberhttp.UploadResult { + return &blobberhttp.UploadResult{ Filename: copyObjectResponse.Filename, Size: copyObjectResponse.Size, Hash: copyObjectResponse.ContentHash, @@ -360,7 +360,7 @@ func RenameObjectResponseCreator(r interface{}) *blobbergrpc.RenameObjectRespons return nil } - httpResp, _ := r.(*blobberHTTP.UploadResult) + httpResp, _ := r.(*blobberhttp.UploadResult) return &blobbergrpc.RenameObjectResponse{ Filename: httpResp.Filename, Size: httpResp.Size, @@ -381,7 +381,7 @@ func DownloadFileResponseCreator(r interface{}) *blobbergrpc.DownloadFileRespons return &blobbergrpc.DownloadFileResponse{ Data: httpResp, } - case *blobberHTTP.DownloadResponse: + case *blobberhttp.DownloadResponse: return &blobbergrpc.DownloadFileResponse{ Success: httpResp.Success, Data: httpResp.Data, @@ -399,7 +399,7 @@ func UploadFileResponseCreator(r interface{}) *blobbergrpc.UploadFileResponse { return nil } - httpResp, _ := r.(*blobberHTTP.UploadResult) + httpResp, _ := r.(*blobberhttp.UploadResult) return &blobbergrpc.UploadFileResponse{ Filename: httpResp.Filename, Size: httpResp.Size, diff --git a/code/go/0chain.net/blobbercore/handler/object_operation_handler.go b/code/go/0chain.net/blobbercore/handler/object_operation_handler.go index 15913b6a9..87dac1f3b 100644 --- a/code/go/0chain.net/blobbercore/handler/object_operation_handler.go +++ b/code/go/0chain.net/blobbercore/handler/object_operation_handler.go @@ -5,7 +5,6 @@ import ( "encoding/hex" "encoding/json" "errors" - "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobberHTTP" "net/http" "path/filepath" @@ -282,9 +281,9 @@ func (fsh *StorageHandler) DownloadFile(ctx context.Context, r *http.Request) ( // authorize file access var ( - isOwner = clientID == alloc.OwnerID - isRepairer = clientID == alloc.RepairerID - isCollaborator = reference.IsACollaborator(ctx, fileref.ID, clientID) + isOwner = clientID == alloc.OwnerID + isRepairer = clientID == alloc.RepairerID + isCollaborator = reference.IsACollaborator(ctx, fileref.ID, clientID) ) if !isOwner && !isRepairer && !isCollaborator { @@ -340,7 +339,7 @@ func (fsh *StorageHandler) DownloadFile(ctx context.Context, r *http.Request) ( if latestRM != nil && latestRM.ReadCounter+(numBlocks) != readMarker.ReadCounter { - var response = &blobberHTTP.DownloadResponse{ + var response = &blobberhttp.DownloadResponse{ Success: false, LatestRM: latestRM, Path: fileref.Path, @@ -394,7 +393,7 @@ func (fsh *StorageHandler) DownloadFile(ctx context.Context, r *http.Request) ( "couldn't save latest read marker: %v", err) } - var response = &blobberHTTP.DownloadResponse{} + var response = &blobberhttp.DownloadResponse{} response.Success = true response.LatestRM = readMarker response.Data = respData @@ -405,7 +404,7 @@ func (fsh *StorageHandler) DownloadFile(ctx context.Context, r *http.Request) ( return respData, nil } -func (fsh *StorageHandler) CommitWrite(ctx context.Context, r *http.Request) (*blobberHTTP.CommitResult, error) { +func (fsh *StorageHandler) CommitWrite(ctx context.Context, r *http.Request) (*blobberhttp.CommitResult, error) { if r.Method == "GET" { return nil, common.NewError("invalid_method", "Invalid method used for the upload URL. Use POST instead") @@ -488,7 +487,7 @@ func (fsh *StorageHandler) CommitWrite(ctx context.Context, r *http.Request) (*b err) } - var result blobberHTTP.CommitResult + var result blobberhttp.CommitResult var latestWM *writemarker.WriteMarkerEntity if len(allocationObj.AllocationRoot) == 0 { latestWM = nil @@ -659,7 +658,7 @@ func (fsh *StorageHandler) RenameObject(ctx context.Context, r *http.Request) (i return nil, common.NewError("connection_write_error", "Error writing the connection meta data") } - result := &blobberHTTP.UploadResult{} + result := &blobberhttp.UploadResult{} result.Filename = new_name result.Hash = objectRef.Hash result.MerkleRoot = objectRef.MerkleRoot @@ -866,7 +865,7 @@ func (fsh *StorageHandler) CopyObject(ctx context.Context, r *http.Request) (int return nil, common.NewError("connection_write_error", "Error writing the connection meta data") } - result := &blobberHTTP.UploadResult{} + result := &blobberhttp.UploadResult{} result.Filename = objectRef.Name result.Hash = objectRef.Hash result.MerkleRoot = objectRef.MerkleRoot @@ -875,7 +874,7 @@ func (fsh *StorageHandler) CopyObject(ctx context.Context, r *http.Request) (int return result, nil } -func (fsh *StorageHandler) DeleteFile(ctx context.Context, r *http.Request, connectionObj *allocation.AllocationChangeCollector) (*blobberHTTP.UploadResult, error) { +func (fsh *StorageHandler) DeleteFile(ctx context.Context, r *http.Request, connectionObj *allocation.AllocationChangeCollector) (*blobberhttp.UploadResult, error) { path := r.FormValue("path") if len(path) == 0 { return nil, common.NewError("invalid_parameters", "Invalid path") @@ -897,7 +896,7 @@ func (fsh *StorageHandler) DeleteFile(ctx context.Context, r *http.Request, conn connectionObj.Size += allocationChange.Size connectionObj.AddChange(allocationChange, dfc) - result := &blobberHTTP.UploadResult{} + result := &blobberhttp.UploadResult{} result.Filename = fileRef.Name result.Hash = fileRef.Hash result.MerkleRoot = fileRef.MerkleRoot @@ -910,7 +909,7 @@ func (fsh *StorageHandler) DeleteFile(ctx context.Context, r *http.Request, conn } //WriteFile stores the file into the blobber files system from the HTTP request -func (fsh *StorageHandler) WriteFile(ctx context.Context, r *http.Request) (*blobberHTTP.UploadResult, error) { +func (fsh *StorageHandler) WriteFile(ctx context.Context, r *http.Request) (*blobberhttp.UploadResult, error) { if r.Method == "GET" { return nil, common.NewError("invalid_method", "Invalid method used for the upload URL. Use multi-part form POST / PUT / DELETE instead") @@ -958,7 +957,7 @@ func (fsh *StorageHandler) WriteFile(ctx context.Context, r *http.Request) (*blo mutex.Lock() defer mutex.Unlock() - result := &blobberHTTP.UploadResult{} + result := &blobberhttp.UploadResult{} mode := allocation.INSERT_OPERATION if r.Method == "PUT" { mode = allocation.UPDATE_OPERATION diff --git a/code/go/0chain.net/blobbercore/handler/storage_handler.go b/code/go/0chain.net/blobbercore/handler/storage_handler.go index 0258c50a0..7fc9a328d 100644 --- a/code/go/0chain.net/blobbercore/handler/storage_handler.go +++ b/code/go/0chain.net/blobbercore/handler/storage_handler.go @@ -8,7 +8,6 @@ import ( "strings" "github.com/0chain/blobber/code/go/0chain.net/blobbercore/allocation" - "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobberHTTP" "github.com/0chain/blobber/code/go/0chain.net/blobbercore/constants" "github.com/0chain/blobber/code/go/0chain.net/blobbercore/readmarker" "github.com/0chain/blobber/code/go/0chain.net/blobbercore/reference" @@ -167,9 +166,9 @@ func (fsh *StorageHandler) GetFileMeta(ctx context.Context, r *http.Request) (in // authorize file access var ( - isOwner = clientID == alloc.OwnerID - isRepairer = clientID == alloc.RepairerID - isCollaborator = reference.IsACollaborator(ctx, fileref.ID, clientID) + isOwner = clientID == alloc.OwnerID + isRepairer = clientID == alloc.RepairerID + isCollaborator = reference.IsACollaborator(ctx, fileref.ID, clientID) ) if !isOwner && !isRepairer && !isCollaborator { @@ -392,7 +391,7 @@ func (fsh *StorageHandler) GetFileStats(ctx context.Context, r *http.Request) (i return result, nil } -func (fsh *StorageHandler) ListEntities(ctx context.Context, r *http.Request) (*blobberHTTP.ListResult, error) { +func (fsh *StorageHandler) ListEntities(ctx context.Context, r *http.Request) (*blobberhttp.ListResult, error) { if r.Method == "POST" { return nil, common.NewError("invalid_method", "Invalid method used. Use GET instead") @@ -437,7 +436,7 @@ func (fsh *StorageHandler) ListEntities(ctx context.Context, r *http.Request) (* return nil, common.NewError("invalid_parameters", "Invalid path. "+err.Error()) } - var result blobberHTTP.ListResult + var result blobberhttp.ListResult result.AllocationRoot = allocationObj.AllocationRoot result.Meta = dirref.GetListingData(ctx) if clientID != allocationObj.OwnerID { @@ -454,8 +453,8 @@ func (fsh *StorageHandler) ListEntities(ctx context.Context, r *http.Request) (* return &result, nil } -func (fsh *StorageHandler) GetReferencePath(ctx context.Context, r *http.Request) (*blobberHTTP.ReferencePathResult, error) { - resCh := make(chan *blobberHTTP.ReferencePathResult) +func (fsh *StorageHandler) GetReferencePath(ctx context.Context, r *http.Request) (*blobberhttp.ReferencePathResult, error) { + resCh := make(chan *blobberhttp.ReferencePathResult) errCh := make(chan error) go fsh.getReferencePath(ctx, r, resCh, errCh) @@ -471,7 +470,7 @@ func (fsh *StorageHandler) GetReferencePath(ctx context.Context, r *http.Request } } -func (fsh *StorageHandler) getReferencePath(ctx context.Context, r *http.Request, resCh chan<- *blobberHTTP.ReferencePathResult, errCh chan<- error) { +func (fsh *StorageHandler) getReferencePath(ctx context.Context, r *http.Request, resCh chan<- *blobberhttp.ReferencePathResult, errCh chan<- error) { if r.Method == "POST" { errCh <- common.NewError("invalid_method", "Invalid method used. Use GET instead") return @@ -537,7 +536,7 @@ func (fsh *StorageHandler) getReferencePath(ctx context.Context, r *http.Request return } } - var refPathResult blobberHTTP.ReferencePathResult + var refPathResult blobberhttp.ReferencePathResult refPathResult.ReferencePath = refPath if latestWM != nil { refPathResult.LatestWM = &latestWM.WM @@ -546,7 +545,7 @@ func (fsh *StorageHandler) getReferencePath(ctx context.Context, r *http.Request resCh <- &refPathResult } -func (fsh *StorageHandler) GetObjectPath(ctx context.Context, r *http.Request) (*blobberHTTP.ObjectPathResult, error) { +func (fsh *StorageHandler) GetObjectPath(ctx context.Context, r *http.Request) (*blobberhttp.ObjectPathResult, error) { if r.Method == "POST" { return nil, common.NewError("invalid_method", "Invalid method used. Use GET instead") } @@ -596,7 +595,7 @@ func (fsh *StorageHandler) GetObjectPath(ctx context.Context, r *http.Request) ( return nil, common.NewError("latest_write_marker_read_error", "Error reading the latest write marker for allocation."+err.Error()) } } - var objPathResult blobberHTTP.ObjectPathResult + var objPathResult blobberhttp.ObjectPathResult objPathResult.ObjectPath = objectPath if latestWM != nil { objPathResult.LatestWM = &latestWM.WM @@ -604,7 +603,7 @@ func (fsh *StorageHandler) GetObjectPath(ctx context.Context, r *http.Request) ( return &objPathResult, nil } -func (fsh *StorageHandler) GetObjectTree(ctx context.Context, r *http.Request) (*blobberHTTP.ReferencePathResult, error) { +func (fsh *StorageHandler) GetObjectTree(ctx context.Context, r *http.Request) (*blobberhttp.ReferencePathResult, error) { if r.Method == "POST" { return nil, common.NewError("invalid_method", "Invalid method used. Use GET instead") } @@ -662,7 +661,7 @@ func (fsh *StorageHandler) GetObjectTree(ctx context.Context, r *http.Request) ( return nil, common.NewError("latest_write_marker_read_error", "Error reading the latest write marker for allocation."+err.Error()) } } - var refPathResult blobberHTTP.ReferencePathResult + var refPathResult blobberhttp.ReferencePathResult refPathResult.ReferencePath = refPath if latestWM != nil { refPathResult.LatestWM = &latestWM.WM From a88f7aa80037e3ca08b18eb08303b2a3f8c22ab2 Mon Sep 17 00:00:00 2001 From: Shravan Shetty Date: Wed, 7 Jul 2021 16:15:00 +0530 Subject: [PATCH 2/9] :bug: fixed compile errors --- code/go/0chain.net/blobbercore/convert/responseHandler.go | 1 + .../0chain.net/blobbercore/handler/object_operation_handler.go | 2 ++ code/go/0chain.net/blobbercore/handler/storage_handler.go | 2 ++ 3 files changed, 5 insertions(+) diff --git a/code/go/0chain.net/blobbercore/convert/responseHandler.go b/code/go/0chain.net/blobbercore/convert/responseHandler.go index aeba4f122..602a21dbb 100644 --- a/code/go/0chain.net/blobbercore/convert/responseHandler.go +++ b/code/go/0chain.net/blobbercore/convert/responseHandler.go @@ -10,6 +10,7 @@ import ( "github.com/0chain/blobber/code/go/0chain.net/blobbercore/allocation" "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobberhttp" "github.com/0chain/blobber/code/go/0chain.net/blobbercore/reference" ) diff --git a/code/go/0chain.net/blobbercore/handler/object_operation_handler.go b/code/go/0chain.net/blobbercore/handler/object_operation_handler.go index 87dac1f3b..3f3357d0b 100644 --- a/code/go/0chain.net/blobbercore/handler/object_operation_handler.go +++ b/code/go/0chain.net/blobbercore/handler/object_operation_handler.go @@ -6,6 +6,8 @@ import ( "encoding/json" "errors" + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobberhttp" + "net/http" "path/filepath" "strconv" diff --git a/code/go/0chain.net/blobbercore/handler/storage_handler.go b/code/go/0chain.net/blobbercore/handler/storage_handler.go index 7fc9a328d..002f3ad3c 100644 --- a/code/go/0chain.net/blobbercore/handler/storage_handler.go +++ b/code/go/0chain.net/blobbercore/handler/storage_handler.go @@ -7,6 +7,8 @@ import ( "strconv" "strings" + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobberhttp" + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/allocation" "github.com/0chain/blobber/code/go/0chain.net/blobbercore/constants" "github.com/0chain/blobber/code/go/0chain.net/blobbercore/readmarker" From eed3e4e9d9f9b12c84a33e64c1fccb1cba8bbbe1 Mon Sep 17 00:00:00 2001 From: Shravan Shetty Date: Wed, 7 Jul 2021 16:49:10 +0530 Subject: [PATCH 3/9] :art: seperated integration tests into different files --- .../handler/getallocation_integration_test.go | 64 + .../handler/grpc_handler_integration_test.go | 1413 ----------------- ...nit_test.go => helper_integration_test.go} | 61 + 3 files changed, 125 insertions(+), 1413 deletions(-) create mode 100644 code/go/0chain.net/blobbercore/handler/getallocation_integration_test.go delete mode 100644 code/go/0chain.net/blobbercore/handler/grpc_handler_integration_test.go rename code/go/0chain.net/blobbercore/handler/{grpc_handler_helper_unit_test.go => helper_integration_test.go} (93%) diff --git a/code/go/0chain.net/blobbercore/handler/getallocation_integration_test.go b/code/go/0chain.net/blobbercore/handler/getallocation_integration_test.go new file mode 100644 index 000000000..8fe1fb7fa --- /dev/null +++ b/code/go/0chain.net/blobbercore/handler/getallocation_integration_test.go @@ -0,0 +1,64 @@ +package handler + +import ( + "context" + "testing" + + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" +) + +func TestGetAllocation_IntegrationTest(t *testing.T) { + + bClient, tdController := setupHandlerIntegrationTests(t) + + err := tdController.ClearDatabase() + if err != nil { + t.Fatal(err) + } + err = tdController.AddGetAllocationTestData() + if err != nil { + t.Fatal(err) + } + + testCases := []struct { + name string + input *blobbergrpc.GetAllocationRequest + expectedTx string + expectingError bool + }{ + { + name: "Success", + input: &blobbergrpc.GetAllocationRequest{ + Id: "exampleTransaction", + }, + expectedTx: "exampleTransaction", + expectingError: false, + }, + { + name: "UnknownAllocation", + input: &blobbergrpc.GetAllocationRequest{ + Id: "exampleTransaction1", + }, + expectedTx: "", + expectingError: true, + }, + } + + for _, tc := range testCases { + getAllocationResp, err := bClient.GetAllocation(context.Background(), tc.input) + if err != nil { + if !tc.expectingError { + t.Fatal(err) + } + continue + } + + if tc.expectingError { + t.Fatal("expected error") + } + + if getAllocationResp.Allocation.Tx != tc.expectedTx { + t.Fatal("response with wrong allocation transaction") + } + } +} diff --git a/code/go/0chain.net/blobbercore/handler/grpc_handler_integration_test.go b/code/go/0chain.net/blobbercore/handler/grpc_handler_integration_test.go deleted file mode 100644 index 79e929f57..000000000 --- a/code/go/0chain.net/blobbercore/handler/grpc_handler_integration_test.go +++ /dev/null @@ -1,1413 +0,0 @@ -package handler - -import ( - "context" - "encoding/hex" - "encoding/json" - "fmt" - "io" - "log" - "math/rand" - "net/http" - "os" - "strconv" - "strings" - "testing" - "time" - - "github.com/0chain/blobber/code/go/0chain.net/blobbercore/allocation" - "github.com/0chain/blobber/code/go/0chain.net/blobbercore/readmarker" - - "github.com/0chain/blobber/code/go/0chain.net/blobbercore/reference" - "github.com/0chain/blobber/code/go/0chain.net/blobbercore/writemarker" - - "github.com/0chain/blobber/code/go/0chain.net/core/common" - "github.com/0chain/blobber/code/go/0chain.net/core/encryption" - "google.golang.org/grpc/metadata" - - "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" - "github.com/0chain/blobber/code/go/0chain.net/blobbercore/config" - "google.golang.org/grpc" - "gorm.io/driver/postgres" - "gorm.io/gorm" -) - -const BlobberTestAddr = "localhost:7031" -const RetryAttempts = 8 -const RetryTimeout = 3 - -func TestBlobberGRPCService_IntegrationTest(t *testing.T) { - args := make(map[string]bool) - for _, arg := range os.Args { - args[arg] = true - } - if !args["integration"] { - t.Skip() - } - - var conn *grpc.ClientConn - var err error - for i := 0; i < RetryAttempts; i++ { - log.Println("Connection attempt - " + fmt.Sprint(i+1)) - conn, err = grpc.Dial(BlobberTestAddr, grpc.WithInsecure()) - if err != nil { - log.Println(err) - <-time.After(time.Second * RetryTimeout) - continue - } - break - } - if err != nil { - t.Fatal(err) - } - defer conn.Close() - blobberClient := blobbergrpc.NewBlobberClient(conn) - - setupIntegrationTestConfig(t) - db, err := gorm.Open(postgres.Open(fmt.Sprintf( - "host=%v port=%v user=%v dbname=%v password=%v sslmode=disable", - config.Configuration.DBHost, config.Configuration.DBPort, - config.Configuration.DBUserName, config.Configuration.DBName, - config.Configuration.DBPassword)), &gorm.Config{}) - if err != nil { - t.Fatal(err) - } - tdController := NewTestDataController(db) - - t.Run("TestGetAllocation", func(t *testing.T) { - err := tdController.ClearDatabase() - if err != nil { - t.Fatal(err) - } - err = tdController.AddGetAllocationTestData() - if err != nil { - t.Fatal(err) - } - - testCases := []struct { - name string - input *blobbergrpc.GetAllocationRequest - expectedTx string - expectingError bool - }{ - { - name: "Success", - input: &blobbergrpc.GetAllocationRequest{ - Id: "exampleTransaction", - }, - expectedTx: "exampleTransaction", - expectingError: false, - }, - { - name: "UnknownAllocation", - input: &blobbergrpc.GetAllocationRequest{ - Id: "exampleTransaction1", - }, - expectedTx: "", - expectingError: true, - }, - } - - for _, tc := range testCases { - getAllocationResp, err := blobberClient.GetAllocation(context.Background(), tc.input) - if err != nil { - if !tc.expectingError { - t.Fatal(err) - } - continue - } - - if tc.expectingError { - t.Fatal("expected error") - } - - if getAllocationResp.Allocation.Tx != tc.expectedTx { - t.Fatal("response with wrong allocation transaction") - } - } - }) - - t.Run("TestGetFileMetaData", func(t *testing.T) { - err := tdController.ClearDatabase() - if err != nil { - t.Fatal(err) - } - err = tdController.AddGetFileMetaDataTestData() - if err != nil { - t.Fatal(err) - } - - testCases := []struct { - name string - context metadata.MD - input *blobbergrpc.GetFileMetaDataRequest - expectedFileName string - expectingError bool - }{ - { - name: "Success", - context: metadata.New(map[string]string{ - common.ClientHeader: "exampleOwnerId", - }), - input: &blobbergrpc.GetFileMetaDataRequest{ - Path: "examplePath", - PathHash: "exampleId:examplePath", - Allocation: "exampleTransaction", - }, - expectedFileName: "filename", - expectingError: false, - }, - { - name: "Unknown file path", - context: metadata.New(map[string]string{ - common.ClientHeader: "exampleOwnerId", - }), - input: &blobbergrpc.GetFileMetaDataRequest{ - Path: "examplePath", - PathHash: "exampleId:examplePath123", - Allocation: "exampleTransaction", - }, - expectedFileName: "", - expectingError: true, - }, - } - - for _, tc := range testCases { - ctx := context.Background() - ctx = metadata.NewOutgoingContext(ctx, tc.context) - getFileMetaDataResp, err := blobberClient.GetFileMetaData(ctx, tc.input) - if err != nil { - if !tc.expectingError { - t.Fatal(err) - } - continue - } - - if tc.expectingError { - t.Fatal("expected error") - } - - if getFileMetaDataResp.MetaData.FileMetaData.Name != tc.expectedFileName { - t.Fatal("unexpected file name from GetFileMetaData rpc") - } - } - }) - - t.Run("TestGetFileStats", func(t *testing.T) { - - allocationTx := randString(32) - - pubKey, _, signScheme := GeneratePubPrivateKey(t) - clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) - - err := tdController.ClearDatabase() - if err != nil { - t.Fatal(err) - } - err = tdController.AddGetFileStatsTestData(allocationTx, pubKey) - if err != nil { - t.Fatal(err) - } - - testCases := []struct { - name string - context metadata.MD - input *blobbergrpc.GetFileStatsRequest - expectedFileName string - expectingError bool - }{ - { - name: "Success", - context: metadata.New(map[string]string{ - common.ClientHeader: "exampleOwnerId", - common.ClientSignatureHeader: clientSignature, - }), - input: &blobbergrpc.GetFileStatsRequest{ - Path: "examplePath", - PathHash: "exampleId:examplePath", - Allocation: allocationTx, - }, - expectedFileName: "filename", - expectingError: false, - }, - { - name: "Unknown Path", - context: metadata.New(map[string]string{ - common.ClientHeader: "exampleOwnerId", - common.ClientSignatureHeader: clientSignature, - }), - input: &blobbergrpc.GetFileStatsRequest{ - Path: "examplePath", - PathHash: "exampleId:examplePath123", - Allocation: allocationTx, - }, - expectedFileName: "", - expectingError: true, - }, - } - - for _, tc := range testCases { - ctx := context.Background() - ctx = metadata.NewOutgoingContext(ctx, tc.context) - getFileStatsResp, err := blobberClient.GetFileStats(ctx, tc.input) - if err != nil { - if !tc.expectingError { - t.Fatal(err) - } - continue - } - - if tc.expectingError { - t.Fatal("expected error") - } - - if getFileStatsResp.MetaData.FileMetaData.Name != tc.expectedFileName { - t.Fatal("unexpected file name from GetFileStats rpc") - } - } - - }) - - t.Run("TestListEntities", func(t *testing.T) { - allocationTx := randString(32) - - pubKey, _, signScheme := GeneratePubPrivateKey(t) - clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) - - err := tdController.ClearDatabase() - if err != nil { - t.Fatal(err) - } - err = tdController.AddListEntitiesTestData(allocationTx, pubKey) - if err != nil { - t.Fatal(err) - } - - testCases := []struct { - name string - context metadata.MD - input *blobbergrpc.ListEntitiesRequest - expectedPath string - expectingError bool - }{ - { - name: "Success", - context: metadata.New(map[string]string{ - common.ClientHeader: "exampleOwnerId", - common.ClientSignatureHeader: clientSignature, - }), - input: &blobbergrpc.ListEntitiesRequest{ - Path: "examplePath", - PathHash: "exampleId:examplePath", - AuthToken: "", - Allocation: allocationTx, - }, - expectedPath: "examplePath", - expectingError: false, - }, - { - name: "bad path", - context: metadata.New(map[string]string{ - common.ClientHeader: "exampleOwnerId", - common.ClientSignatureHeader: clientSignature, - }), - input: &blobbergrpc.ListEntitiesRequest{ - Path: "examplePath", - PathHash: "exampleId:examplePath123", - AuthToken: "", - Allocation: allocationTx, - }, - expectedPath: "", - expectingError: true, - }, - } - - for _, tc := range testCases { - ctx := context.Background() - ctx = metadata.NewOutgoingContext(ctx, tc.context) - listEntitiesResp, err := blobberClient.ListEntities(ctx, tc.input) - if err != nil { - if !tc.expectingError { - t.Fatal(err) - } - continue - } - - if tc.expectingError { - t.Fatal("expected error") - } - - if listEntitiesResp.MetaData.DirMetaData.Path != tc.expectedPath { - t.Fatal("unexpected path from ListEntities rpc") - } - } - - }) - - t.Run("TestGetObjectPath", func(t *testing.T) { - allocationTx := randString(32) - - pubKey, _, signScheme := GeneratePubPrivateKey(t) - clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) - - err := tdController.ClearDatabase() - if err != nil { - t.Fatal(err) - } - err = tdController.AddGetObjectPathTestData(allocationTx, pubKey) - if err != nil { - t.Fatal(err) - } - - testCases := []struct { - name string - context metadata.MD - input *blobbergrpc.GetObjectPathRequest - expectedPath string - expectingError bool - }{ - { - name: "Success", - context: metadata.New(map[string]string{ - common.ClientHeader: "exampleOwnerId", - common.ClientSignatureHeader: clientSignature, - }), - input: &blobbergrpc.GetObjectPathRequest{ - Allocation: allocationTx, - Path: "examplePath", - BlockNum: "0", - }, - expectedPath: "/", - expectingError: false, - }, - } - - for _, tc := range testCases { - ctx := context.Background() - ctx = metadata.NewOutgoingContext(ctx, tc.context) - getObjectPathResp, err := blobberClient.GetObjectPath(ctx, tc.input) - if err != nil { - if !tc.expectingError { - t.Fatal(err) - } - continue - } - - if tc.expectingError { - t.Fatal("expected error") - } - - if getObjectPathResp.ObjectPath.Path.DirMetaData.Path != tc.expectedPath { - t.Fatal("unexpected root hash from GetObjectPath rpc") - } - } - }) - - t.Run("TestGetReferencePath", func(t *testing.T) { - allocationTx := randString(32) - - pubKey, _, signScheme := GeneratePubPrivateKey(t) - clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) - - err := tdController.ClearDatabase() - if err != nil { - t.Fatal(err) - } - err = tdController.AddGetReferencePathTestData(allocationTx, pubKey) - if err != nil { - t.Fatal(err) - } - - testCases := []struct { - name string - context metadata.MD - input *blobbergrpc.GetReferencePathRequest - expectedPath string - expectingError bool - }{ - { - name: "Success", - context: metadata.New(map[string]string{ - common.ClientHeader: "exampleOwnerId", - common.ClientSignatureHeader: clientSignature, - }), - input: &blobbergrpc.GetReferencePathRequest{ - Paths: "", - Path: "/", - Allocation: allocationTx, - }, - expectedPath: "/", - expectingError: false, - }, - } - - for _, tc := range testCases { - ctx := context.Background() - ctx = metadata.NewOutgoingContext(ctx, tc.context) - getReferencePathResp, err := blobberClient.GetReferencePath(ctx, tc.input) - if err != nil { - if !tc.expectingError { - t.Fatal(err) - } - continue - } - - if tc.expectingError { - t.Fatal("expected error") - } - - if getReferencePathResp.ReferencePath.MetaData.DirMetaData.Path != tc.expectedPath { - t.Fatal("unexpected path from GetReferencePath rpc") - } - } - }) - - t.Run("TestGetObjectTree", func(t *testing.T) { - allocationTx := randString(32) - - pubKey, _, signScheme := GeneratePubPrivateKey(t) - clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) - - err := tdController.ClearDatabase() - if err != nil { - t.Fatal(err) - } - err = tdController.AddGetObjectTreeTestData(allocationTx, pubKey) - if err != nil { - t.Fatal(err) - } - - testCases := []struct { - name string - context metadata.MD - input *blobbergrpc.GetObjectTreeRequest - expectedFileName string - expectingError bool - }{ - { - name: "Success", - context: metadata.New(map[string]string{ - common.ClientHeader: "exampleOwnerId", - common.ClientSignatureHeader: clientSignature, - }), - input: &blobbergrpc.GetObjectTreeRequest{ - Path: "/", - Allocation: allocationTx, - }, - expectedFileName: "root", - expectingError: false, - }, - { - name: "bad path", - context: metadata.New(map[string]string{ - common.ClientHeader: "exampleOwnerId", - common.ClientSignatureHeader: clientSignature, - }), - input: &blobbergrpc.GetObjectTreeRequest{ - Path: "/2", - Allocation: "", - }, - expectedFileName: "root", - expectingError: true, - }, - } - - for _, tc := range testCases { - ctx := context.Background() - ctx = metadata.NewOutgoingContext(ctx, tc.context) - getObjectTreeResp, err := blobberClient.GetObjectTree(ctx, tc.input) - if err != nil { - if !tc.expectingError { - t.Fatal(err) - } - continue - } - - if tc.expectingError { - t.Fatal("expected error") - } - - if getObjectTreeResp.ReferencePath.MetaData.DirMetaData.Name != tc.expectedFileName { - t.Fatal("unexpected root name from GetObject") - } - } - - }) - - t.Run("TestCommit", func(t *testing.T) { - allocationTx := randString(32) - - pubKey, _, signScheme := GeneratePubPrivateKey(t) - clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) - pubKeyBytes, _ := hex.DecodeString(pubKey) - clientId := encryption.Hash(pubKeyBytes) - now := common.Timestamp(time.Now().UnixNano()) - - blobberPubKey := "de52c0a51872d5d2ec04dbc15a6f0696cba22657b80520e1d070e72de64c9b04e19ce3223cae3c743a20184158457582ffe9c369ca9218c04bfe83a26a62d88d" - blobberPubKeyBytes, _ := hex.DecodeString(blobberPubKey) - - fr := reference.Ref{ - AllocationID: "exampleId", - Type: "f", - Name: "new_name", - Path: "/new_name", - ContentHash: "contentHash", - MerkleRoot: "merkleRoot", - ActualFileHash: "actualFileHash", - } - - rootRefHash := encryption.Hash(encryption.Hash(fr.GetFileHashData())) - - wm := writemarker.WriteMarker{ - AllocationRoot: encryption.Hash(rootRefHash + ":" + strconv.FormatInt(int64(now), 10)), - PreviousAllocationRoot: "/", - AllocationID: "exampleId", - Size: 1337, - BlobberID: encryption.Hash(blobberPubKeyBytes), - Timestamp: now, - ClientID: clientId, - } - - wmSig, err := signScheme.Sign(encryption.Hash(wm.GetHashData())) - if err != nil { - t.Fatal(err) - } - - wm.Signature = wmSig - - wmRaw, err := json.Marshal(wm) - if err != nil { - t.Fatal(err) - } - - err = tdController.ClearDatabase() - if err != nil { - t.Fatal(err) - } - err = tdController.AddCommitTestData(allocationTx, pubKey, clientId, wmSig, now) - if err != nil { - t.Fatal(err) - } - - testCases := []struct { - name string - context metadata.MD - input *blobbergrpc.CommitRequest - expectedAllocation string - expectingError bool - }{ - { - name: "Success", - context: metadata.New(map[string]string{ - common.ClientHeader: clientId, - common.ClientSignatureHeader: clientSignature, - common.ClientKeyHeader: pubKey, - }), - input: &blobbergrpc.CommitRequest{ - Allocation: allocationTx, - ConnectionId: "connection_id", - WriteMarker: string(wmRaw), - }, - expectedAllocation: "exampleId", - expectingError: false, - }, - { - name: "invalid write_marker", - context: metadata.New(map[string]string{ - common.ClientHeader: clientId, - common.ClientSignatureHeader: clientSignature, - common.ClientKeyHeader: pubKey, - }), - input: &blobbergrpc.CommitRequest{ - Allocation: allocationTx, - ConnectionId: "invalid", - WriteMarker: "invalid", - }, - expectedAllocation: "", - expectingError: true, - }, - } - - for _, tc := range testCases { - ctx := context.Background() - ctx = metadata.NewOutgoingContext(ctx, tc.context) - getCommiteResp, err := blobberClient.Commit(ctx, tc.input) - if err != nil { - if !tc.expectingError { - t.Fatal(err) - } - continue - } - - if tc.expectingError { - t.Fatal("expected error") - } - - if getCommiteResp.WriteMarker.AllocationID != tc.expectedAllocation { - t.Fatal("unexpected root name from GetObject") - } - } - }) - - t.Run("TestCommitMetaTxn", func(t *testing.T) { - allocationTx := randString(32) - - pubKey, _, signScheme := GeneratePubPrivateKey(t) - pubKeyBytes, _ := hex.DecodeString(pubKey) - clientId := encryption.Hash(pubKeyBytes) - now := common.Timestamp(time.Now().UnixNano()) - - blobberPubKey := "de52c0a51872d5d2ec04dbc15a6f0696cba22657b80520e1d070e72de64c9b04e19ce3223cae3c743a20184158457582ffe9c369ca9218c04bfe83a26a62d88d" - blobberPubKeyBytes, _ := hex.DecodeString(blobberPubKey) - - fr := reference.Ref{ - AllocationID: "exampleId", - } - - rootRefHash := encryption.Hash(encryption.Hash(fr.GetFileHashData())) - - wm := writemarker.WriteMarker{ - AllocationRoot: encryption.Hash(rootRefHash + ":" + strconv.FormatInt(int64(now), 10)), - PreviousAllocationRoot: "/", - AllocationID: "exampleId", - Size: 1337, - BlobberID: encryption.Hash(blobberPubKeyBytes), - Timestamp: now, - ClientID: clientId, - } - - wmSig, err := signScheme.Sign(encryption.Hash(wm.GetHashData())) - if err != nil { - t.Fatal(err) - } - - wm.Signature = wmSig - - if err := tdController.ClearDatabase(); err != nil { - t.Fatal(err) - } - if err := tdController.AddCommitTestData(allocationTx, pubKey, clientId, wmSig, now); err != nil { - t.Fatal(err) - } - - testCases := []struct { - name string - context metadata.MD - input *blobbergrpc.CommitMetaTxnRequest - expectedMessage string - expectingError bool - }{ - { - name: "Success", - context: metadata.New(map[string]string{ - common.ClientHeader: clientId, - }), - input: &blobbergrpc.CommitMetaTxnRequest{ - Path: "/some_file", - PathHash: "exampleId:examplePath", - AuthToken: "", - Allocation: allocationTx, - TxnId: "8", - }, - expectedMessage: "Added commitMetaTxn successfully", - expectingError: false, - }, - { - name: "Fail", - context: metadata.New(map[string]string{ - common.ClientHeader: clientId, - }), - input: &blobbergrpc.CommitMetaTxnRequest{ - Path: "/some_file", - PathHash: "exampleId:examplePath", - AuthToken: "", - Allocation: allocationTx, - TxnId: "", - }, - expectedMessage: "", - expectingError: true, - }, - } - - for _, tc := range testCases { - ctx := context.Background() - ctx = metadata.NewOutgoingContext(ctx, tc.context) - commitMetaTxnResponse, err := blobberClient.CommitMetaTxn(ctx, tc.input) - if err != nil { - if !tc.expectingError { - t.Fatal(err) - } - continue - } - - if tc.expectingError { - t.Fatal("expected error") - } - - if commitMetaTxnResponse.GetMessage() != tc.expectedMessage { - t.Fatal("failed!") - } - } - }) - - t.Run("TestCollaborator", func(t *testing.T) { - allocationTx := randString(32) - - pubKey, _, signScheme := GeneratePubPrivateKey(t) - clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) - pubKeyBytes, _ := hex.DecodeString(pubKey) - clientId := encryption.Hash(pubKeyBytes) - now := common.Timestamp(time.Now().UnixNano()) - - blobberPubKey := "de52c0a51872d5d2ec04dbc15a6f0696cba22657b80520e1d070e72de64c9b04e19ce3223cae3c743a20184158457582ffe9c369ca9218c04bfe83a26a62d88d" - blobberPubKeyBytes, _ := hex.DecodeString(blobberPubKey) - - fr := reference.Ref{ - AllocationID: "exampleId", - } - - rootRefHash := encryption.Hash(encryption.Hash(fr.GetFileHashData())) - - wm := writemarker.WriteMarker{ - AllocationRoot: encryption.Hash(rootRefHash + ":" + strconv.FormatInt(int64(now), 10)), - PreviousAllocationRoot: "/", - AllocationID: "exampleId", - Size: 1337, - BlobberID: encryption.Hash(blobberPubKeyBytes), - Timestamp: now, - ClientID: clientId, - } - - wmSig, err := signScheme.Sign(encryption.Hash(wm.GetHashData())) - if err != nil { - t.Fatal(err) - } - - wm.Signature = wmSig - - if err := tdController.ClearDatabase(); err != nil { - t.Fatal(err) - } - if err := tdController.AddCommitTestData(allocationTx, pubKey, clientId, wmSig, now); err != nil { - t.Fatal(err) - } - - testCases := []struct { - name string - context metadata.MD - input *blobbergrpc.CollaboratorRequest - expectedMessage string - expectingError bool - }{ - { - name: "Success", - context: metadata.New(map[string]string{ - common.ClientHeader: clientId, - common.ClientSignatureHeader: clientSignature, - common.ClientKeyHeader: pubKey, - }), - input: &blobbergrpc.CollaboratorRequest{ - Path: "/some_file", - PathHash: "exampleId:examplePath", - Allocation: allocationTx, - Method: http.MethodPost, - CollabId: "10", - }, - expectedMessage: "Added collaborator successfully", - expectingError: false, - }, - { - name: "Fail", - context: metadata.New(map[string]string{ - common.ClientHeader: clientId, - common.ClientSignatureHeader: clientSignature, - common.ClientKeyHeader: pubKey, - }), - input: &blobbergrpc.CollaboratorRequest{ - Path: "/some_file", - PathHash: "exampleId:examplePath", - Allocation: allocationTx, - Method: http.MethodPost, - }, - expectedMessage: "", - expectingError: true, - }, - } - - for _, tc := range testCases { - ctx := context.Background() - ctx = metadata.NewOutgoingContext(ctx, tc.context) - response, err := blobberClient.Collaborator(ctx, tc.input) - if err != nil { - if !tc.expectingError { - t.Fatal(err) - } - - continue - } - - if tc.expectingError { - t.Fatal("expected error") - } - - if response.GetMessage() != tc.expectedMessage { - t.Fatal("failed!") - } - } - }) - - t.Run("TestCalculateHash", func(t *testing.T) { - allocationTx := randString(32) - pubKey, _, signScheme := GeneratePubPrivateKey(t) - clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) - - err := tdController.ClearDatabase() - if err != nil { - t.Fatal(err) - } - err = tdController.AddGetReferencePathTestData(allocationTx, pubKey) - if err != nil { - t.Fatal(err) - } - - testCases := []struct { - name string - context metadata.MD - input *blobbergrpc.CalculateHashRequest - expectingError bool - }{ - { - name: "Success", - context: metadata.New(map[string]string{ - common.ClientHeader: "exampleOwnerId", - common.ClientSignatureHeader: clientSignature, - common.ClientKeyHeader: pubKey, - }), - input: &blobbergrpc.CalculateHashRequest{ - Paths: "", - Path: "/", - Allocation: allocationTx, - }, - expectingError: false, - }, - } - - for _, tc := range testCases { - ctx := context.Background() - ctx = metadata.NewOutgoingContext(ctx, tc.context) - _, err := blobberClient.CalculateHash(ctx, tc.input) - if err != nil { - if !tc.expectingError { - t.Fatal(err) - } - - continue - } - - if tc.expectingError { - t.Fatal("expected error") - } - } - }) - - t.Run("TestUpdateAttributes", func(t *testing.T) { - allocationTx := randString(32) - - pubKey, _, signScheme := GeneratePubPrivateKey(t) - clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) - pubKeyBytes, _ := hex.DecodeString(pubKey) - clientId := encryption.Hash(pubKeyBytes) - - if err := tdController.ClearDatabase(); err != nil { - t.Fatal(err) - } - if err := tdController.AddAttributesTestData(allocationTx, pubKey, clientId); err != nil { - t.Fatal(err) - } - - attr := &reference.Attributes{WhoPaysForReads: common.WhoPays3rdParty} - attrBytes, err := json.Marshal(attr) - if err != nil { - t.Fatal(err) - } - - testCases := []struct { - name string - context metadata.MD - input *blobbergrpc.UpdateObjectAttributesRequest - expectedMessage int - expectingError bool - }{ - { - name: "Success", - context: metadata.New(map[string]string{ - common.ClientHeader: clientId, - common.ClientSignatureHeader: clientSignature, - common.ClientKeyHeader: pubKey, - }), - input: &blobbergrpc.UpdateObjectAttributesRequest{ - Allocation: allocationTx, - Path: "/some_file", - PathHash: "exampleId:examplePath", - ConnectionId: "connection_id", - Attributes: string(attrBytes), - }, - expectedMessage: int(attr.WhoPaysForReads), - expectingError: false, - }, - { - name: "Fail", - context: metadata.New(map[string]string{ - common.ClientHeader: clientId, - common.ClientSignatureHeader: clientSignature, - common.ClientKeyHeader: pubKey, - }), - input: &blobbergrpc.UpdateObjectAttributesRequest{ - Allocation: "", - Path: "", - PathHash: "", - ConnectionId: "", - Attributes: "", - }, - expectedMessage: 0, - expectingError: true, - }, - } - - for _, tc := range testCases { - ctx := context.Background() - ctx = metadata.NewOutgoingContext(ctx, tc.context) - response, err := blobberClient.UpdateObjectAttributes(ctx, tc.input) - if err != nil { - if !tc.expectingError { - t.Fatal(err) - } - - continue - } - - if tc.expectingError { - t.Fatal("expected error") - } - - if response.GetWhoPaysForReads() != int64(tc.expectedMessage) { - t.Fatal("failed!") - } - } - }) - - t.Run("TestCopyObject", func(t *testing.T) { - allocationTx := randString(32) - - pubKey, _, signScheme := GeneratePubPrivateKey(t) - clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) - pubKeyBytes, _ := hex.DecodeString(pubKey) - clientId := encryption.Hash(pubKeyBytes) - - if err := tdController.ClearDatabase(); err != nil { - t.Fatal(err) - } - if err := tdController.AddCopyObjectData(allocationTx, pubKey, clientId); err != nil { - t.Fatal(err) - } - - testCases := []struct { - name string - context metadata.MD - input *blobbergrpc.CopyObjectRequest - expectedMessage string - expectingError bool - }{ - { - name: "Success", - context: metadata.New(map[string]string{ - common.ClientHeader: clientId, - common.ClientSignatureHeader: clientSignature, - common.ClientKeyHeader: pubKey, - }), - input: &blobbergrpc.CopyObjectRequest{ - Allocation: allocationTx, - Path: "/some_file", - PathHash: "exampleId:examplePath", - ConnectionId: "connection_id", - Dest: "/copy", - }, - expectedMessage: "some_file", - expectingError: false, - }, - { - name: "Fail", - context: metadata.New(map[string]string{ - common.ClientHeader: clientId, - common.ClientSignatureHeader: clientSignature, - common.ClientKeyHeader: pubKey, - }), - input: &blobbergrpc.CopyObjectRequest{ - Allocation: "", - Path: "", - PathHash: "", - ConnectionId: "", - Dest: "", - }, - expectedMessage: "", - expectingError: true, - }, - } - - for _, tc := range testCases { - ctx := context.Background() - ctx = metadata.NewOutgoingContext(ctx, tc.context) - response, err := blobberClient.CopyObject(ctx, tc.input) - if err != nil { - if !tc.expectingError { - t.Fatal(err) - } - - continue - } - - if tc.expectingError { - t.Fatal("expected error") - } - - if response.GetFilename() != tc.expectedMessage { - t.Fatal("failed!") - } - } - }) - - t.Run("TestRenameObject", func(t *testing.T) { - allocationTx := randString(32) - - pubKey, _, signScheme := GeneratePubPrivateKey(t) - clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) - pubKeyBytes, _ := hex.DecodeString(pubKey) - clientId := encryption.Hash(pubKeyBytes) - - if err := tdController.ClearDatabase(); err != nil { - t.Fatal(err) - } - if err := tdController.AddRenameTestData(allocationTx, pubKey, clientId); err != nil { - t.Fatal(err) - } - - testCases := []struct { - name string - context metadata.MD - input *blobbergrpc.RenameObjectRequest - expectedMessage string - expectingError bool - }{ - { - name: "Success", - context: metadata.New(map[string]string{ - common.ClientHeader: clientId, - common.ClientSignatureHeader: clientSignature, - common.ClientKeyHeader: pubKey, - }), - input: &blobbergrpc.RenameObjectRequest{ - Allocation: allocationTx, - Path: "/some_file", - PathHash: "exampleId:examplePath", - ConnectionId: "connection_id", - NewName: "some_new_file", - }, - expectedMessage: "some_new_file", - expectingError: false, - }, - { - name: "Fail", - context: metadata.New(map[string]string{ - common.ClientHeader: clientId, - common.ClientSignatureHeader: clientSignature, - common.ClientKeyHeader: pubKey, - }), - input: &blobbergrpc.RenameObjectRequest{ - Allocation: "", - Path: "", - PathHash: "", - ConnectionId: "", - NewName: "", - }, - expectedMessage: "", - expectingError: true, - }, - } - - for _, tc := range testCases { - ctx := context.Background() - ctx = metadata.NewOutgoingContext(ctx, tc.context) - response, err := blobberClient.RenameObject(ctx, tc.input) - if err != nil { - if !tc.expectingError { - t.Fatal(err) - } - - continue - } - - if tc.expectingError { - t.Fatal("expected error") - } - - if response.GetFilename() != tc.expectedMessage { - t.Fatal("failed!") - } - } - }) - - t.Run("TestDownload", func(t *testing.T) { - allocationTx := randString(32) - - root, _ := os.Getwd() - path := strings.Split(root, `code`) - - err = os.MkdirAll(path[0]+`docker.local/blobber1/files/files/exa/mpl/eId/objects/tmp/Mon/Wen`, os.ModePerm) - if err != nil { - t.Fatal(err) - } - defer func() { - err := os.RemoveAll(path[0] + `docker.local/blobber1/files/files/exa/mpl/eId/objects/tmp/Mon`) - if err != nil { - t.Fatal(err) - } - }() - - f, err := os.Create(path[0] + `docker.local/blobber1/files/files/exa/mpl/eId/objects/tmp/Mon/Wen/MyFile`) - if err != nil { - t.Fatal(err) - } - defer f.Close() - - file, err := os.Open(root + "/grpc_handler_integration_test.go") - if err != nil { - t.Fatal(err) - } - defer file.Close() - - _, err = io.Copy(f, file) - if err != nil { - t.Fatal(err) - } - - pubKey, _, signScheme := GeneratePubPrivateKey(t) - clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) - pubKeyBytes, _ := hex.DecodeString(pubKey) - clientId := encryption.Hash(pubKeyBytes) - now := common.Timestamp(time.Now().Unix()) - allocationId := `exampleId` - - if err := tdController.ClearDatabase(); err != nil { - t.Fatal(err) - } - - blobberPubKey := "de52c0a51872d5d2ec04dbc15a6f0696cba22657b80520e1d070e72de64c9b04e19ce3223cae3c743a20184158457582ffe9c369ca9218c04bfe83a26a62d88d" - blobberPubKeyBytes, _ := hex.DecodeString(blobberPubKey) - - rm := readmarker.ReadMarker{ - BlobberID: encryption.Hash(blobberPubKeyBytes), - AllocationID: allocationId, - ClientPublicKey: pubKey, - ClientID: clientId, - OwnerID: clientId, - Timestamp: now, - //ReadCounter: 1337, - } - - rmSig, err := signScheme.Sign(encryption.Hash(rm.GetHashData())) - if err != nil { - t.Fatal(err) - } - rm.Signature = rmSig - - rmString, err := json.Marshal(rm) - if err != nil { - t.Fatal(err) - } - - if err := tdController.AddDownloadTestData(allocationTx, pubKey, clientId, rmSig, now); err != nil { - t.Fatal(err) - } - - testCases := []struct { - name string - context metadata.MD - input *blobbergrpc.DownloadFileRequest - expectedMessage string - expectingError bool - }{ - { - name: "Success", - context: metadata.New(map[string]string{ - common.ClientHeader: clientId, - common.ClientSignatureHeader: clientSignature, - common.ClientKeyHeader: pubKey, - }), - input: &blobbergrpc.DownloadFileRequest{ - Allocation: allocationTx, - Path: "/some_file", - PathHash: "exampleId:examplePath", - ReadMarker: string(rmString), - BlockNum: "1", - }, - expectedMessage: "some_new_file", - expectingError: false, - }, - { - name: "Fail", - context: metadata.New(map[string]string{ - common.ClientHeader: clientId, - common.ClientSignatureHeader: clientSignature, - common.ClientKeyHeader: pubKey, - }), - input: &blobbergrpc.DownloadFileRequest{ - Allocation: "", - Path: "", - PathHash: "", - RxPay: "", - BlockNum: "", - NumBlocks: "", - ReadMarker: "", - AuthToken: "", - Content: "", - }, - expectedMessage: "", - expectingError: true, - }, - } - - for _, tc := range testCases { - ctx := context.Background() - ctx = metadata.NewOutgoingContext(ctx, tc.context) - _, err := blobberClient.DownloadFile(ctx, tc.input) - if err != nil { - if !tc.expectingError { - t.Fatal(err) - } - - continue - } - - if tc.expectingError { - t.Fatal("expected error") - } - } - }) - - t.Run("TestUpload", func(t *testing.T) { - allocationTx := randString(32) - - pubKey, _, signScheme := GeneratePubPrivateKey(t) - clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) - pubKeyBytes, _ := hex.DecodeString(pubKey) - clientId := encryption.Hash(pubKeyBytes) - - formFieldByt, err := json.Marshal(&allocation.UpdateFileChange{NewFileChange: allocation.NewFileChange{Filename: `grpc_handler_integration_test.go`}}) - if err != nil { - t.Fatal(err) - } - - if err := tdController.ClearDatabase(); err != nil { - t.Fatal(err) - } - if err := tdController.AddUploadTestData(allocationTx, pubKey, clientId); err != nil { - t.Fatal(err) - } - - root, _ := os.Getwd() - file, err := os.Open(root + "/grpc_handler_integration_test.go") - if err != nil { - t.Fatal(err) - } - stats, err := file.Stat() - if err != nil { - panic(err) - } - fileB := make([]byte, stats.Size()) - if _, err := io.ReadFull(file, fileB); err != nil { - t.Fatal(err) - } - - testCases := []struct { - name string - context metadata.MD - input *blobbergrpc.UploadFileRequest - expectedFileName string - expectingError bool - }{ - { - name: "Success", - context: metadata.New(map[string]string{ - common.ClientHeader: clientId, - common.ClientSignatureHeader: clientSignature, - common.ClientKeyHeader: pubKey, - }), - - input: &blobbergrpc.UploadFileRequest{ - Allocation: allocationTx, - Path: "/some_file", - ConnectionId: "connection_id", - Method: "POST", - UploadMeta: string(formFieldByt), - UpdateMeta: "", - UploadFile: fileB, - UploadThumbnailFile: []byte{}, - }, - expectedFileName: "grpc_handler_integration_test.go", - expectingError: false, - }, - { - name: "Fail", - context: metadata.New(map[string]string{ - common.ClientHeader: clientId, - common.ClientSignatureHeader: clientSignature, - common.ClientKeyHeader: pubKey, - }), - input: &blobbergrpc.UploadFileRequest{ - Allocation: "", - Path: "", - ConnectionId: "", - Method: "", - UploadMeta: "", - UpdateMeta: "", - UploadFile: nil, - UploadThumbnailFile: nil, - }, - expectedFileName: "", - expectingError: true, - }, - } - - for _, tc := range testCases { - ctx := context.Background() - ctx = metadata.NewOutgoingContext(ctx, tc.context) - response, err := blobberClient.UploadFile(ctx, tc.input) - if err != nil { - if !tc.expectingError { - t.Fatal(err) - } - - continue - } - - if tc.expectingError { - t.Fatal("expected error") - } - - if response.GetFilename() != tc.expectedFileName { - t.Fatal("failed!") - } - } - }) -} - -func randString(n int) string { - - const hexLetters = "abcdef0123456789" - - var sb strings.Builder - for i := 0; i < n; i++ { - sb.WriteByte(hexLetters[rand.Intn(len(hexLetters))]) - } - return sb.String() -} diff --git a/code/go/0chain.net/blobbercore/handler/grpc_handler_helper_unit_test.go b/code/go/0chain.net/blobbercore/handler/helper_integration_test.go similarity index 93% rename from code/go/0chain.net/blobbercore/handler/grpc_handler_helper_unit_test.go rename to code/go/0chain.net/blobbercore/handler/helper_integration_test.go index 4fd9d7936..643bad3c4 100644 --- a/code/go/0chain.net/blobbercore/handler/grpc_handler_helper_unit_test.go +++ b/code/go/0chain.net/blobbercore/handler/helper_integration_test.go @@ -5,10 +5,15 @@ import ( "database/sql" "fmt" "log" + "math/rand" "os" "strings" "time" + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" + "google.golang.org/grpc" + "gorm.io/driver/postgres" + "github.com/0chain/blobber/code/go/0chain.net/core/common" "github.com/0chain/blobber/code/go/0chain.net/blobbercore/config" @@ -21,6 +26,62 @@ import ( "github.com/0chain/gosdk/core/zcncrypto" ) +const BlobberTestAddr = "localhost:7031" +const RetryAttempts = 8 +const RetryTimeout = 3 + +func randString(n int) string { + + const hexLetters = "abcdef0123456789" + + var sb strings.Builder + for i := 0; i < n; i++ { + sb.WriteByte(hexLetters[rand.Intn(len(hexLetters))]) + } + return sb.String() +} + +func setupHandlerIntegrationTests(t *testing.T) (blobbergrpc.BlobberClient, *TestDataController) { + args := make(map[string]bool) + for _, arg := range os.Args { + args[arg] = true + } + if !args["integration"] { + t.Skip() + } + + var conn *grpc.ClientConn + var err error + for i := 0; i < RetryAttempts; i++ { + log.Println("Connection attempt - " + fmt.Sprint(i+1)) + conn, err = grpc.Dial(BlobberTestAddr, grpc.WithInsecure()) + if err != nil { + log.Println(err) + <-time.After(time.Second * RetryTimeout) + continue + } + break + } + if err != nil { + t.Fatal(err) + } + defer conn.Close() + bClient := blobbergrpc.NewBlobberClient(conn) + + setupIntegrationTestConfig(t) + db, err := gorm.Open(postgres.Open(fmt.Sprintf( + "host=%v port=%v user=%v dbname=%v password=%v sslmode=disable", + config.Configuration.DBHost, config.Configuration.DBPort, + config.Configuration.DBUserName, config.Configuration.DBName, + config.Configuration.DBPassword)), &gorm.Config{}) + if err != nil { + t.Fatal(err) + } + tdController := NewTestDataController(db) + + return bClient, tdController +} + type TestDataController struct { db *gorm.DB } From 2712e8ce97e6675a941ab6432aea6df3fd5fb22f Mon Sep 17 00:00:00 2001 From: Shravan Shetty Date: Wed, 7 Jul 2021 16:49:25 +0530 Subject: [PATCH 4/9] missing files from previous commit --- .../calculate_hash_integration_test.go | 66 ++++++++ .../handler/collaborator_integration_test.go | 124 ++++++++++++++ .../handler/commit_integration_test.go | 133 +++++++++++++++ .../commit_meta_txn_integration_test.go | 118 +++++++++++++ .../handler/copy_object_integration_test.go | 93 +++++++++++ .../handler/download_integration_test.go | 157 ++++++++++++++++++ .../getfilemetadata_integration_test.go | 78 +++++++++ .../handler/getfilestats_integration_test.go | 86 ++++++++++ .../handler/getobjectpath_integration_test.go | 71 ++++++++ .../handler/getobjecttree_integration_test.go | 84 ++++++++++ .../getreferencepath_integration_test.go | 72 ++++++++ .../handler/listentities_integration_test.go | 89 ++++++++++ .../handler/renameobject_integration_test.go | 93 +++++++++++ .../updateattributes_integration_test.go | 101 +++++++++++ .../handler/upload_integration_test.go | 123 ++++++++++++++ 15 files changed, 1488 insertions(+) create mode 100644 code/go/0chain.net/blobbercore/handler/calculate_hash_integration_test.go create mode 100644 code/go/0chain.net/blobbercore/handler/collaborator_integration_test.go create mode 100644 code/go/0chain.net/blobbercore/handler/commit_integration_test.go create mode 100644 code/go/0chain.net/blobbercore/handler/commit_meta_txn_integration_test.go create mode 100644 code/go/0chain.net/blobbercore/handler/copy_object_integration_test.go create mode 100644 code/go/0chain.net/blobbercore/handler/download_integration_test.go create mode 100644 code/go/0chain.net/blobbercore/handler/getfilemetadata_integration_test.go create mode 100644 code/go/0chain.net/blobbercore/handler/getfilestats_integration_test.go create mode 100644 code/go/0chain.net/blobbercore/handler/getobjectpath_integration_test.go create mode 100644 code/go/0chain.net/blobbercore/handler/getobjecttree_integration_test.go create mode 100644 code/go/0chain.net/blobbercore/handler/getreferencepath_integration_test.go create mode 100644 code/go/0chain.net/blobbercore/handler/listentities_integration_test.go create mode 100644 code/go/0chain.net/blobbercore/handler/renameobject_integration_test.go create mode 100644 code/go/0chain.net/blobbercore/handler/updateattributes_integration_test.go create mode 100644 code/go/0chain.net/blobbercore/handler/upload_integration_test.go diff --git a/code/go/0chain.net/blobbercore/handler/calculate_hash_integration_test.go b/code/go/0chain.net/blobbercore/handler/calculate_hash_integration_test.go new file mode 100644 index 000000000..a4d273c3e --- /dev/null +++ b/code/go/0chain.net/blobbercore/handler/calculate_hash_integration_test.go @@ -0,0 +1,66 @@ +package handler + +import ( + "context" + "testing" + + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" + "github.com/0chain/blobber/code/go/0chain.net/core/common" + "github.com/0chain/blobber/code/go/0chain.net/core/encryption" + "google.golang.org/grpc/metadata" +) + +func TestBlobberGRPCService_CalculateHash(t *testing.T) { + bClient, tdController := setupHandlerIntegrationTests(t) + allocationTx := randString(32) + pubKey, _, signScheme := GeneratePubPrivateKey(t) + clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) + + err := tdController.ClearDatabase() + if err != nil { + t.Fatal(err) + } + err = tdController.AddGetReferencePathTestData(allocationTx, pubKey) + if err != nil { + t.Fatal(err) + } + + testCases := []struct { + name string + context metadata.MD + input *blobbergrpc.CalculateHashRequest + expectingError bool + }{ + { + name: "Success", + context: metadata.New(map[string]string{ + common.ClientHeader: "exampleOwnerId", + common.ClientSignatureHeader: clientSignature, + common.ClientKeyHeader: pubKey, + }), + input: &blobbergrpc.CalculateHashRequest{ + Paths: "", + Path: "/", + Allocation: allocationTx, + }, + expectingError: false, + }, + } + + for _, tc := range testCases { + ctx := context.Background() + ctx = metadata.NewOutgoingContext(ctx, tc.context) + _, err := bClient.CalculateHash(ctx, tc.input) + if err != nil { + if !tc.expectingError { + t.Fatal(err) + } + + continue + } + + if tc.expectingError { + t.Fatal("expected error") + } + } +} diff --git a/code/go/0chain.net/blobbercore/handler/collaborator_integration_test.go b/code/go/0chain.net/blobbercore/handler/collaborator_integration_test.go new file mode 100644 index 000000000..f03c7e36c --- /dev/null +++ b/code/go/0chain.net/blobbercore/handler/collaborator_integration_test.go @@ -0,0 +1,124 @@ +package handler + +import ( + "context" + "encoding/hex" + "net/http" + "strconv" + "testing" + "time" + + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/reference" + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/writemarker" + "github.com/0chain/blobber/code/go/0chain.net/core/common" + "github.com/0chain/blobber/code/go/0chain.net/core/encryption" + "google.golang.org/grpc/metadata" +) + +func TestBlobberGRPCService_Collaborator(t *testing.T) { + bClient, tdController := setupHandlerIntegrationTests(t) + allocationTx := randString(32) + + pubKey, _, signScheme := GeneratePubPrivateKey(t) + clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) + pubKeyBytes, _ := hex.DecodeString(pubKey) + clientId := encryption.Hash(pubKeyBytes) + now := common.Timestamp(time.Now().UnixNano()) + + blobberPubKey := "de52c0a51872d5d2ec04dbc15a6f0696cba22657b80520e1d070e72de64c9b04e19ce3223cae3c743a20184158457582ffe9c369ca9218c04bfe83a26a62d88d" + blobberPubKeyBytes, _ := hex.DecodeString(blobberPubKey) + + fr := reference.Ref{ + AllocationID: "exampleId", + } + + rootRefHash := encryption.Hash(encryption.Hash(fr.GetFileHashData())) + + wm := writemarker.WriteMarker{ + AllocationRoot: encryption.Hash(rootRefHash + ":" + strconv.FormatInt(int64(now), 10)), + PreviousAllocationRoot: "/", + AllocationID: "exampleId", + Size: 1337, + BlobberID: encryption.Hash(blobberPubKeyBytes), + Timestamp: now, + ClientID: clientId, + } + + wmSig, err := signScheme.Sign(encryption.Hash(wm.GetHashData())) + if err != nil { + t.Fatal(err) + } + + wm.Signature = wmSig + + if err := tdController.ClearDatabase(); err != nil { + t.Fatal(err) + } + if err := tdController.AddCommitTestData(allocationTx, pubKey, clientId, wmSig, now); err != nil { + t.Fatal(err) + } + + testCases := []struct { + name string + context metadata.MD + input *blobbergrpc.CollaboratorRequest + expectedMessage string + expectingError bool + }{ + { + name: "Success", + context: metadata.New(map[string]string{ + common.ClientHeader: clientId, + common.ClientSignatureHeader: clientSignature, + common.ClientKeyHeader: pubKey, + }), + input: &blobbergrpc.CollaboratorRequest{ + Path: "/some_file", + PathHash: "exampleId:examplePath", + Allocation: allocationTx, + Method: http.MethodPost, + CollabId: "10", + }, + expectedMessage: "Added collaborator successfully", + expectingError: false, + }, + { + name: "Fail", + context: metadata.New(map[string]string{ + common.ClientHeader: clientId, + common.ClientSignatureHeader: clientSignature, + common.ClientKeyHeader: pubKey, + }), + input: &blobbergrpc.CollaboratorRequest{ + Path: "/some_file", + PathHash: "exampleId:examplePath", + Allocation: allocationTx, + Method: http.MethodPost, + }, + expectedMessage: "", + expectingError: true, + }, + } + + for _, tc := range testCases { + ctx := context.Background() + ctx = metadata.NewOutgoingContext(ctx, tc.context) + response, err := bClient.Collaborator(ctx, tc.input) + if err != nil { + if !tc.expectingError { + t.Fatal(err) + } + + continue + } + + if tc.expectingError { + t.Fatal("expected error") + } + + if response.GetMessage() != tc.expectedMessage { + t.Fatal("failed!") + } + } +} diff --git a/code/go/0chain.net/blobbercore/handler/commit_integration_test.go b/code/go/0chain.net/blobbercore/handler/commit_integration_test.go new file mode 100644 index 000000000..e782d8097 --- /dev/null +++ b/code/go/0chain.net/blobbercore/handler/commit_integration_test.go @@ -0,0 +1,133 @@ +package handler + +import ( + "context" + "encoding/hex" + "encoding/json" + "strconv" + "testing" + "time" + + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/reference" + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/writemarker" + "github.com/0chain/blobber/code/go/0chain.net/core/common" + "github.com/0chain/blobber/code/go/0chain.net/core/encryption" + "google.golang.org/grpc/metadata" +) + +func TestBlobberGRPCService_Commit(t *testing.T) { + bClient, tdController := setupHandlerIntegrationTests(t) + allocationTx := randString(32) + + pubKey, _, signScheme := GeneratePubPrivateKey(t) + clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) + pubKeyBytes, _ := hex.DecodeString(pubKey) + clientId := encryption.Hash(pubKeyBytes) + now := common.Timestamp(time.Now().UnixNano()) + + blobberPubKey := "de52c0a51872d5d2ec04dbc15a6f0696cba22657b80520e1d070e72de64c9b04e19ce3223cae3c743a20184158457582ffe9c369ca9218c04bfe83a26a62d88d" + blobberPubKeyBytes, _ := hex.DecodeString(blobberPubKey) + + fr := reference.Ref{ + AllocationID: "exampleId", + Type: "f", + Name: "new_name", + Path: "/new_name", + ContentHash: "contentHash", + MerkleRoot: "merkleRoot", + ActualFileHash: "actualFileHash", + } + + rootRefHash := encryption.Hash(encryption.Hash(fr.GetFileHashData())) + + wm := writemarker.WriteMarker{ + AllocationRoot: encryption.Hash(rootRefHash + ":" + strconv.FormatInt(int64(now), 10)), + PreviousAllocationRoot: "/", + AllocationID: "exampleId", + Size: 1337, + BlobberID: encryption.Hash(blobberPubKeyBytes), + Timestamp: now, + ClientID: clientId, + } + + wmSig, err := signScheme.Sign(encryption.Hash(wm.GetHashData())) + if err != nil { + t.Fatal(err) + } + + wm.Signature = wmSig + + wmRaw, err := json.Marshal(wm) + if err != nil { + t.Fatal(err) + } + + err = tdController.ClearDatabase() + if err != nil { + t.Fatal(err) + } + err = tdController.AddCommitTestData(allocationTx, pubKey, clientId, wmSig, now) + if err != nil { + t.Fatal(err) + } + + testCases := []struct { + name string + context metadata.MD + input *blobbergrpc.CommitRequest + expectedAllocation string + expectingError bool + }{ + { + name: "Success", + context: metadata.New(map[string]string{ + common.ClientHeader: clientId, + common.ClientSignatureHeader: clientSignature, + common.ClientKeyHeader: pubKey, + }), + input: &blobbergrpc.CommitRequest{ + Allocation: allocationTx, + ConnectionId: "connection_id", + WriteMarker: string(wmRaw), + }, + expectedAllocation: "exampleId", + expectingError: false, + }, + { + name: "invalid write_marker", + context: metadata.New(map[string]string{ + common.ClientHeader: clientId, + common.ClientSignatureHeader: clientSignature, + common.ClientKeyHeader: pubKey, + }), + input: &blobbergrpc.CommitRequest{ + Allocation: allocationTx, + ConnectionId: "invalid", + WriteMarker: "invalid", + }, + expectedAllocation: "", + expectingError: true, + }, + } + + for _, tc := range testCases { + ctx := context.Background() + ctx = metadata.NewOutgoingContext(ctx, tc.context) + getCommiteResp, err := bClient.Commit(ctx, tc.input) + if err != nil { + if !tc.expectingError { + t.Fatal(err) + } + continue + } + + if tc.expectingError { + t.Fatal("expected error") + } + + if getCommiteResp.WriteMarker.AllocationID != tc.expectedAllocation { + t.Fatal("unexpected root name from GetObject") + } + } +} diff --git a/code/go/0chain.net/blobbercore/handler/commit_meta_txn_integration_test.go b/code/go/0chain.net/blobbercore/handler/commit_meta_txn_integration_test.go new file mode 100644 index 000000000..20c238c8a --- /dev/null +++ b/code/go/0chain.net/blobbercore/handler/commit_meta_txn_integration_test.go @@ -0,0 +1,118 @@ +package handler + +import ( + "context" + "encoding/hex" + "strconv" + "testing" + "time" + + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/reference" + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/writemarker" + "github.com/0chain/blobber/code/go/0chain.net/core/common" + "github.com/0chain/blobber/code/go/0chain.net/core/encryption" + "google.golang.org/grpc/metadata" +) + +func TestBlobberGRPCService_CommitMetaTxn(t *testing.T) { + bClient, tdController := setupHandlerIntegrationTests(t) + allocationTx := randString(32) + + pubKey, _, signScheme := GeneratePubPrivateKey(t) + pubKeyBytes, _ := hex.DecodeString(pubKey) + clientId := encryption.Hash(pubKeyBytes) + now := common.Timestamp(time.Now().UnixNano()) + + blobberPubKey := "de52c0a51872d5d2ec04dbc15a6f0696cba22657b80520e1d070e72de64c9b04e19ce3223cae3c743a20184158457582ffe9c369ca9218c04bfe83a26a62d88d" + blobberPubKeyBytes, _ := hex.DecodeString(blobberPubKey) + + fr := reference.Ref{ + AllocationID: "exampleId", + } + + rootRefHash := encryption.Hash(encryption.Hash(fr.GetFileHashData())) + + wm := writemarker.WriteMarker{ + AllocationRoot: encryption.Hash(rootRefHash + ":" + strconv.FormatInt(int64(now), 10)), + PreviousAllocationRoot: "/", + AllocationID: "exampleId", + Size: 1337, + BlobberID: encryption.Hash(blobberPubKeyBytes), + Timestamp: now, + ClientID: clientId, + } + + wmSig, err := signScheme.Sign(encryption.Hash(wm.GetHashData())) + if err != nil { + t.Fatal(err) + } + + wm.Signature = wmSig + + if err := tdController.ClearDatabase(); err != nil { + t.Fatal(err) + } + if err := tdController.AddCommitTestData(allocationTx, pubKey, clientId, wmSig, now); err != nil { + t.Fatal(err) + } + + testCases := []struct { + name string + context metadata.MD + input *blobbergrpc.CommitMetaTxnRequest + expectedMessage string + expectingError bool + }{ + { + name: "Success", + context: metadata.New(map[string]string{ + common.ClientHeader: clientId, + }), + input: &blobbergrpc.CommitMetaTxnRequest{ + Path: "/some_file", + PathHash: "exampleId:examplePath", + AuthToken: "", + Allocation: allocationTx, + TxnId: "8", + }, + expectedMessage: "Added commitMetaTxn successfully", + expectingError: false, + }, + { + name: "Fail", + context: metadata.New(map[string]string{ + common.ClientHeader: clientId, + }), + input: &blobbergrpc.CommitMetaTxnRequest{ + Path: "/some_file", + PathHash: "exampleId:examplePath", + AuthToken: "", + Allocation: allocationTx, + TxnId: "", + }, + expectedMessage: "", + expectingError: true, + }, + } + + for _, tc := range testCases { + ctx := context.Background() + ctx = metadata.NewOutgoingContext(ctx, tc.context) + commitMetaTxnResponse, err := bClient.CommitMetaTxn(ctx, tc.input) + if err != nil { + if !tc.expectingError { + t.Fatal(err) + } + continue + } + + if tc.expectingError { + t.Fatal("expected error") + } + + if commitMetaTxnResponse.GetMessage() != tc.expectedMessage { + t.Fatal("failed!") + } + } +} diff --git a/code/go/0chain.net/blobbercore/handler/copy_object_integration_test.go b/code/go/0chain.net/blobbercore/handler/copy_object_integration_test.go new file mode 100644 index 000000000..8b1a26062 --- /dev/null +++ b/code/go/0chain.net/blobbercore/handler/copy_object_integration_test.go @@ -0,0 +1,93 @@ +package handler + +import ( + "context" + "encoding/hex" + "testing" + + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" + "github.com/0chain/blobber/code/go/0chain.net/core/common" + "github.com/0chain/blobber/code/go/0chain.net/core/encryption" + "google.golang.org/grpc/metadata" +) + +func TestBlobberGRPCService_CopyObject(t *testing.T) { + bClient, tdController := setupHandlerIntegrationTests(t) + allocationTx := randString(32) + + pubKey, _, signScheme := GeneratePubPrivateKey(t) + clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) + pubKeyBytes, _ := hex.DecodeString(pubKey) + clientId := encryption.Hash(pubKeyBytes) + + if err := tdController.ClearDatabase(); err != nil { + t.Fatal(err) + } + if err := tdController.AddCopyObjectData(allocationTx, pubKey, clientId); err != nil { + t.Fatal(err) + } + + testCases := []struct { + name string + context metadata.MD + input *blobbergrpc.CopyObjectRequest + expectedMessage string + expectingError bool + }{ + { + name: "Success", + context: metadata.New(map[string]string{ + common.ClientHeader: clientId, + common.ClientSignatureHeader: clientSignature, + common.ClientKeyHeader: pubKey, + }), + input: &blobbergrpc.CopyObjectRequest{ + Allocation: allocationTx, + Path: "/some_file", + PathHash: "exampleId:examplePath", + ConnectionId: "connection_id", + Dest: "/copy", + }, + expectedMessage: "some_file", + expectingError: false, + }, + { + name: "Fail", + context: metadata.New(map[string]string{ + common.ClientHeader: clientId, + common.ClientSignatureHeader: clientSignature, + common.ClientKeyHeader: pubKey, + }), + input: &blobbergrpc.CopyObjectRequest{ + Allocation: "", + Path: "", + PathHash: "", + ConnectionId: "", + Dest: "", + }, + expectedMessage: "", + expectingError: true, + }, + } + + for _, tc := range testCases { + ctx := context.Background() + ctx = metadata.NewOutgoingContext(ctx, tc.context) + response, err := bClient.CopyObject(ctx, tc.input) + if err != nil { + if !tc.expectingError { + t.Fatal(err) + } + + continue + } + + if tc.expectingError { + t.Fatal("expected error") + } + + if response.GetFilename() != tc.expectedMessage { + t.Fatal("failed!") + } + } +} diff --git a/code/go/0chain.net/blobbercore/handler/download_integration_test.go b/code/go/0chain.net/blobbercore/handler/download_integration_test.go new file mode 100644 index 000000000..5792abb6e --- /dev/null +++ b/code/go/0chain.net/blobbercore/handler/download_integration_test.go @@ -0,0 +1,157 @@ +package handler + +import ( + "context" + "encoding/hex" + "encoding/json" + "io" + "os" + "strings" + "testing" + "time" + + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/readmarker" + "github.com/0chain/blobber/code/go/0chain.net/core/common" + "github.com/0chain/blobber/code/go/0chain.net/core/encryption" + "google.golang.org/grpc/metadata" +) + +func TestBlobberGRPCService_DownloadFile(t *testing.T) { + bClient, tdController := setupHandlerIntegrationTests(t) + allocationTx := randString(32) + + root, _ := os.Getwd() + path := strings.Split(root, `code`) + + err := os.MkdirAll(path[0]+`docker.local/blobber1/files/files/exa/mpl/eId/objects/tmp/Mon/Wen`, os.ModePerm) + if err != nil { + t.Fatal(err) + } + defer func() { + err := os.RemoveAll(path[0] + `docker.local/blobber1/files/files/exa/mpl/eId/objects/tmp/Mon`) + if err != nil { + t.Fatal(err) + } + }() + + f, err := os.Create(path[0] + `docker.local/blobber1/files/files/exa/mpl/eId/objects/tmp/Mon/Wen/MyFile`) + if err != nil { + t.Fatal(err) + } + defer f.Close() + + file, err := os.Open(root + "/grpc_handler_integration_test.go") + if err != nil { + t.Fatal(err) + } + defer file.Close() + + _, err = io.Copy(f, file) + if err != nil { + t.Fatal(err) + } + + pubKey, _, signScheme := GeneratePubPrivateKey(t) + clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) + pubKeyBytes, _ := hex.DecodeString(pubKey) + clientId := encryption.Hash(pubKeyBytes) + now := common.Timestamp(time.Now().Unix()) + allocationId := `exampleId` + + if err := tdController.ClearDatabase(); err != nil { + t.Fatal(err) + } + + blobberPubKey := "de52c0a51872d5d2ec04dbc15a6f0696cba22657b80520e1d070e72de64c9b04e19ce3223cae3c743a20184158457582ffe9c369ca9218c04bfe83a26a62d88d" + blobberPubKeyBytes, _ := hex.DecodeString(blobberPubKey) + + rm := readmarker.ReadMarker{ + BlobberID: encryption.Hash(blobberPubKeyBytes), + AllocationID: allocationId, + ClientPublicKey: pubKey, + ClientID: clientId, + OwnerID: clientId, + Timestamp: now, + //ReadCounter: 1337, + } + + rmSig, err := signScheme.Sign(encryption.Hash(rm.GetHashData())) + if err != nil { + t.Fatal(err) + } + rm.Signature = rmSig + + rmString, err := json.Marshal(rm) + if err != nil { + t.Fatal(err) + } + + if err := tdController.AddDownloadTestData(allocationTx, pubKey, clientId, rmSig, now); err != nil { + t.Fatal(err) + } + + testCases := []struct { + name string + context metadata.MD + input *blobbergrpc.DownloadFileRequest + expectedMessage string + expectingError bool + }{ + { + name: "Success", + context: metadata.New(map[string]string{ + common.ClientHeader: clientId, + common.ClientSignatureHeader: clientSignature, + common.ClientKeyHeader: pubKey, + }), + input: &blobbergrpc.DownloadFileRequest{ + Allocation: allocationTx, + Path: "/some_file", + PathHash: "exampleId:examplePath", + ReadMarker: string(rmString), + BlockNum: "1", + }, + expectedMessage: "some_new_file", + expectingError: false, + }, + { + name: "Fail", + context: metadata.New(map[string]string{ + common.ClientHeader: clientId, + common.ClientSignatureHeader: clientSignature, + common.ClientKeyHeader: pubKey, + }), + input: &blobbergrpc.DownloadFileRequest{ + Allocation: "", + Path: "", + PathHash: "", + RxPay: "", + BlockNum: "", + NumBlocks: "", + ReadMarker: "", + AuthToken: "", + Content: "", + }, + expectedMessage: "", + expectingError: true, + }, + } + + for _, tc := range testCases { + ctx := context.Background() + ctx = metadata.NewOutgoingContext(ctx, tc.context) + _, err := bClient.DownloadFile(ctx, tc.input) + if err != nil { + if !tc.expectingError { + t.Fatal(err) + } + + continue + } + + if tc.expectingError { + t.Fatal("expected error") + } + } +} diff --git a/code/go/0chain.net/blobbercore/handler/getfilemetadata_integration_test.go b/code/go/0chain.net/blobbercore/handler/getfilemetadata_integration_test.go new file mode 100644 index 000000000..436da99c5 --- /dev/null +++ b/code/go/0chain.net/blobbercore/handler/getfilemetadata_integration_test.go @@ -0,0 +1,78 @@ +package handler + +import ( + "context" + "testing" + + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" + "github.com/0chain/blobber/code/go/0chain.net/core/common" + "google.golang.org/grpc/metadata" +) + +func TestGetFileMetaData_IntegrationTest(t *testing.T) { + bClient, tdController := setupHandlerIntegrationTests(t) + + err := tdController.ClearDatabase() + if err != nil { + t.Fatal(err) + } + err = tdController.AddGetFileMetaDataTestData() + if err != nil { + t.Fatal(err) + } + + testCases := []struct { + name string + context metadata.MD + input *blobbergrpc.GetFileMetaDataRequest + expectedFileName string + expectingError bool + }{ + { + name: "Success", + context: metadata.New(map[string]string{ + common.ClientHeader: "exampleOwnerId", + }), + input: &blobbergrpc.GetFileMetaDataRequest{ + Path: "examplePath", + PathHash: "exampleId:examplePath", + Allocation: "exampleTransaction", + }, + expectedFileName: "filename", + expectingError: false, + }, + { + name: "Unknown file path", + context: metadata.New(map[string]string{ + common.ClientHeader: "exampleOwnerId", + }), + input: &blobbergrpc.GetFileMetaDataRequest{ + Path: "examplePath", + PathHash: "exampleId:examplePath123", + Allocation: "exampleTransaction", + }, + expectedFileName: "", + expectingError: true, + }, + } + + for _, tc := range testCases { + ctx := context.Background() + ctx = metadata.NewOutgoingContext(ctx, tc.context) + getFileMetaDataResp, err := bClient.GetFileMetaData(ctx, tc.input) + if err != nil { + if !tc.expectingError { + t.Fatal(err) + } + continue + } + + if tc.expectingError { + t.Fatal("expected error") + } + + if getFileMetaDataResp.MetaData.FileMetaData.Name != tc.expectedFileName { + t.Fatal("unexpected file name from GetFileMetaData rpc") + } + } +} diff --git a/code/go/0chain.net/blobbercore/handler/getfilestats_integration_test.go b/code/go/0chain.net/blobbercore/handler/getfilestats_integration_test.go new file mode 100644 index 000000000..a018e735c --- /dev/null +++ b/code/go/0chain.net/blobbercore/handler/getfilestats_integration_test.go @@ -0,0 +1,86 @@ +package handler + +import ( + "context" + "testing" + + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" + "github.com/0chain/blobber/code/go/0chain.net/core/common" + "github.com/0chain/blobber/code/go/0chain.net/core/encryption" + "google.golang.org/grpc/metadata" +) + +func TestGetFilestats_IntegrationTest(t *testing.T) { + bClient, tdController := setupHandlerIntegrationTests(t) + allocationTx := randString(32) + + pubKey, _, signScheme := GeneratePubPrivateKey(t) + clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) + + err := tdController.ClearDatabase() + if err != nil { + t.Fatal(err) + } + err = tdController.AddGetFileStatsTestData(allocationTx, pubKey) + if err != nil { + t.Fatal(err) + } + + testCases := []struct { + name string + context metadata.MD + input *blobbergrpc.GetFileStatsRequest + expectedFileName string + expectingError bool + }{ + { + name: "Success", + context: metadata.New(map[string]string{ + common.ClientHeader: "exampleOwnerId", + common.ClientSignatureHeader: clientSignature, + }), + input: &blobbergrpc.GetFileStatsRequest{ + Path: "examplePath", + PathHash: "exampleId:examplePath", + Allocation: allocationTx, + }, + expectedFileName: "filename", + expectingError: false, + }, + { + name: "Unknown Path", + context: metadata.New(map[string]string{ + common.ClientHeader: "exampleOwnerId", + common.ClientSignatureHeader: clientSignature, + }), + input: &blobbergrpc.GetFileStatsRequest{ + Path: "examplePath", + PathHash: "exampleId:examplePath123", + Allocation: allocationTx, + }, + expectedFileName: "", + expectingError: true, + }, + } + + for _, tc := range testCases { + ctx := context.Background() + ctx = metadata.NewOutgoingContext(ctx, tc.context) + getFileStatsResp, err := bClient.GetFileStats(ctx, tc.input) + if err != nil { + if !tc.expectingError { + t.Fatal(err) + } + continue + } + + if tc.expectingError { + t.Fatal("expected error") + } + + if getFileStatsResp.MetaData.FileMetaData.Name != tc.expectedFileName { + t.Fatal("unexpected file name from GetFileStats rpc") + } + } + +} diff --git a/code/go/0chain.net/blobbercore/handler/getobjectpath_integration_test.go b/code/go/0chain.net/blobbercore/handler/getobjectpath_integration_test.go new file mode 100644 index 000000000..e16bf27cd --- /dev/null +++ b/code/go/0chain.net/blobbercore/handler/getobjectpath_integration_test.go @@ -0,0 +1,71 @@ +package handler + +import ( + "context" + "testing" + + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" + "github.com/0chain/blobber/code/go/0chain.net/core/common" + "github.com/0chain/blobber/code/go/0chain.net/core/encryption" + "google.golang.org/grpc/metadata" +) + +func TestBlobberGRPCService_GetObjectPath(t *testing.T) { + bClient, tdController := setupHandlerIntegrationTests(t) + allocationTx := randString(32) + + pubKey, _, signScheme := GeneratePubPrivateKey(t) + clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) + + err := tdController.ClearDatabase() + if err != nil { + t.Fatal(err) + } + err = tdController.AddGetObjectPathTestData(allocationTx, pubKey) + if err != nil { + t.Fatal(err) + } + + testCases := []struct { + name string + context metadata.MD + input *blobbergrpc.GetObjectPathRequest + expectedPath string + expectingError bool + }{ + { + name: "Success", + context: metadata.New(map[string]string{ + common.ClientHeader: "exampleOwnerId", + common.ClientSignatureHeader: clientSignature, + }), + input: &blobbergrpc.GetObjectPathRequest{ + Allocation: allocationTx, + Path: "examplePath", + BlockNum: "0", + }, + expectedPath: "/", + expectingError: false, + }, + } + + for _, tc := range testCases { + ctx := context.Background() + ctx = metadata.NewOutgoingContext(ctx, tc.context) + getObjectPathResp, err := bClient.GetObjectPath(ctx, tc.input) + if err != nil { + if !tc.expectingError { + t.Fatal(err) + } + continue + } + + if tc.expectingError { + t.Fatal("expected error") + } + + if getObjectPathResp.ObjectPath.Path.DirMetaData.Path != tc.expectedPath { + t.Fatal("unexpected root hash from GetObjectPath rpc") + } + } +} diff --git a/code/go/0chain.net/blobbercore/handler/getobjecttree_integration_test.go b/code/go/0chain.net/blobbercore/handler/getobjecttree_integration_test.go new file mode 100644 index 000000000..223697c8b --- /dev/null +++ b/code/go/0chain.net/blobbercore/handler/getobjecttree_integration_test.go @@ -0,0 +1,84 @@ +package handler + +import ( + "context" + "testing" + + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" + "github.com/0chain/blobber/code/go/0chain.net/core/common" + "github.com/0chain/blobber/code/go/0chain.net/core/encryption" + "google.golang.org/grpc/metadata" +) + +func TestBlobberGRPCService_GetObjectTree(t *testing.T) { + bClient, tdController := setupHandlerIntegrationTests(t) + allocationTx := randString(32) + + pubKey, _, signScheme := GeneratePubPrivateKey(t) + clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) + + err := tdController.ClearDatabase() + if err != nil { + t.Fatal(err) + } + err = tdController.AddGetObjectTreeTestData(allocationTx, pubKey) + if err != nil { + t.Fatal(err) + } + + testCases := []struct { + name string + context metadata.MD + input *blobbergrpc.GetObjectTreeRequest + expectedFileName string + expectingError bool + }{ + { + name: "Success", + context: metadata.New(map[string]string{ + common.ClientHeader: "exampleOwnerId", + common.ClientSignatureHeader: clientSignature, + }), + input: &blobbergrpc.GetObjectTreeRequest{ + Path: "/", + Allocation: allocationTx, + }, + expectedFileName: "root", + expectingError: false, + }, + { + name: "bad path", + context: metadata.New(map[string]string{ + common.ClientHeader: "exampleOwnerId", + common.ClientSignatureHeader: clientSignature, + }), + input: &blobbergrpc.GetObjectTreeRequest{ + Path: "/2", + Allocation: "", + }, + expectedFileName: "root", + expectingError: true, + }, + } + + for _, tc := range testCases { + ctx := context.Background() + ctx = metadata.NewOutgoingContext(ctx, tc.context) + getObjectTreeResp, err := bClient.GetObjectTree(ctx, tc.input) + if err != nil { + if !tc.expectingError { + t.Fatal(err) + } + continue + } + + if tc.expectingError { + t.Fatal("expected error") + } + + if getObjectTreeResp.ReferencePath.MetaData.DirMetaData.Name != tc.expectedFileName { + t.Fatal("unexpected root name from GetObject") + } + } + +} diff --git a/code/go/0chain.net/blobbercore/handler/getreferencepath_integration_test.go b/code/go/0chain.net/blobbercore/handler/getreferencepath_integration_test.go new file mode 100644 index 000000000..f12ffaaef --- /dev/null +++ b/code/go/0chain.net/blobbercore/handler/getreferencepath_integration_test.go @@ -0,0 +1,72 @@ +package handler + +import ( + "context" + "testing" + + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" + "github.com/0chain/blobber/code/go/0chain.net/core/common" + "github.com/0chain/blobber/code/go/0chain.net/core/encryption" + "google.golang.org/grpc/metadata" +) + +func TestBlobberGRPCService_GetReferencePath(t *testing.T) { + + bClient, tdController := setupHandlerIntegrationTests(t) + allocationTx := randString(32) + + pubKey, _, signScheme := GeneratePubPrivateKey(t) + clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) + + err := tdController.ClearDatabase() + if err != nil { + t.Fatal(err) + } + err = tdController.AddGetReferencePathTestData(allocationTx, pubKey) + if err != nil { + t.Fatal(err) + } + + testCases := []struct { + name string + context metadata.MD + input *blobbergrpc.GetReferencePathRequest + expectedPath string + expectingError bool + }{ + { + name: "Success", + context: metadata.New(map[string]string{ + common.ClientHeader: "exampleOwnerId", + common.ClientSignatureHeader: clientSignature, + }), + input: &blobbergrpc.GetReferencePathRequest{ + Paths: "", + Path: "/", + Allocation: allocationTx, + }, + expectedPath: "/", + expectingError: false, + }, + } + + for _, tc := range testCases { + ctx := context.Background() + ctx = metadata.NewOutgoingContext(ctx, tc.context) + getReferencePathResp, err := bClient.GetReferencePath(ctx, tc.input) + if err != nil { + if !tc.expectingError { + t.Fatal(err) + } + continue + } + + if tc.expectingError { + t.Fatal("expected error") + } + + if getReferencePathResp.ReferencePath.MetaData.DirMetaData.Path != tc.expectedPath { + t.Fatal("unexpected path from GetReferencePath rpc") + } + } +} diff --git a/code/go/0chain.net/blobbercore/handler/listentities_integration_test.go b/code/go/0chain.net/blobbercore/handler/listentities_integration_test.go new file mode 100644 index 000000000..f0a83e4b0 --- /dev/null +++ b/code/go/0chain.net/blobbercore/handler/listentities_integration_test.go @@ -0,0 +1,89 @@ +package handler + +import ( + "context" + "testing" + + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" + "github.com/0chain/blobber/code/go/0chain.net/core/common" + "github.com/0chain/blobber/code/go/0chain.net/core/encryption" + "google.golang.org/grpc/metadata" +) + +func TestBlobberGRPCService_ListEntities(t *testing.T) { + bClient, tdController := setupHandlerIntegrationTests(t) + + allocationTx := randString(32) + + pubKey, _, signScheme := GeneratePubPrivateKey(t) + clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) + + err := tdController.ClearDatabase() + if err != nil { + t.Fatal(err) + } + err = tdController.AddListEntitiesTestData(allocationTx, pubKey) + if err != nil { + t.Fatal(err) + } + + testCases := []struct { + name string + context metadata.MD + input *blobbergrpc.ListEntitiesRequest + expectedPath string + expectingError bool + }{ + { + name: "Success", + context: metadata.New(map[string]string{ + common.ClientHeader: "exampleOwnerId", + common.ClientSignatureHeader: clientSignature, + }), + input: &blobbergrpc.ListEntitiesRequest{ + Path: "examplePath", + PathHash: "exampleId:examplePath", + AuthToken: "", + Allocation: allocationTx, + }, + expectedPath: "examplePath", + expectingError: false, + }, + { + name: "bad path", + context: metadata.New(map[string]string{ + common.ClientHeader: "exampleOwnerId", + common.ClientSignatureHeader: clientSignature, + }), + input: &blobbergrpc.ListEntitiesRequest{ + Path: "examplePath", + PathHash: "exampleId:examplePath123", + AuthToken: "", + Allocation: allocationTx, + }, + expectedPath: "", + expectingError: true, + }, + } + + for _, tc := range testCases { + ctx := context.Background() + ctx = metadata.NewOutgoingContext(ctx, tc.context) + listEntitiesResp, err := bClient.ListEntities(ctx, tc.input) + if err != nil { + if !tc.expectingError { + t.Fatal(err) + } + continue + } + + if tc.expectingError { + t.Fatal("expected error") + } + + if listEntitiesResp.MetaData.DirMetaData.Path != tc.expectedPath { + t.Fatal("unexpected path from ListEntities rpc") + } + } + +} diff --git a/code/go/0chain.net/blobbercore/handler/renameobject_integration_test.go b/code/go/0chain.net/blobbercore/handler/renameobject_integration_test.go new file mode 100644 index 000000000..bbbd2233e --- /dev/null +++ b/code/go/0chain.net/blobbercore/handler/renameobject_integration_test.go @@ -0,0 +1,93 @@ +package handler + +import ( + "context" + "encoding/hex" + "testing" + + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" + "github.com/0chain/blobber/code/go/0chain.net/core/common" + "github.com/0chain/blobber/code/go/0chain.net/core/encryption" + "google.golang.org/grpc/metadata" +) + +func TestBlobberGRPCService_RenameObject(t *testing.T) { + bClient, tdController := setupHandlerIntegrationTests(t) + allocationTx := randString(32) + + pubKey, _, signScheme := GeneratePubPrivateKey(t) + clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) + pubKeyBytes, _ := hex.DecodeString(pubKey) + clientId := encryption.Hash(pubKeyBytes) + + if err := tdController.ClearDatabase(); err != nil { + t.Fatal(err) + } + if err := tdController.AddRenameTestData(allocationTx, pubKey, clientId); err != nil { + t.Fatal(err) + } + + testCases := []struct { + name string + context metadata.MD + input *blobbergrpc.RenameObjectRequest + expectedMessage string + expectingError bool + }{ + { + name: "Success", + context: metadata.New(map[string]string{ + common.ClientHeader: clientId, + common.ClientSignatureHeader: clientSignature, + common.ClientKeyHeader: pubKey, + }), + input: &blobbergrpc.RenameObjectRequest{ + Allocation: allocationTx, + Path: "/some_file", + PathHash: "exampleId:examplePath", + ConnectionId: "connection_id", + NewName: "some_new_file", + }, + expectedMessage: "some_new_file", + expectingError: false, + }, + { + name: "Fail", + context: metadata.New(map[string]string{ + common.ClientHeader: clientId, + common.ClientSignatureHeader: clientSignature, + common.ClientKeyHeader: pubKey, + }), + input: &blobbergrpc.RenameObjectRequest{ + Allocation: "", + Path: "", + PathHash: "", + ConnectionId: "", + NewName: "", + }, + expectedMessage: "", + expectingError: true, + }, + } + + for _, tc := range testCases { + ctx := context.Background() + ctx = metadata.NewOutgoingContext(ctx, tc.context) + response, err := bClient.RenameObject(ctx, tc.input) + if err != nil { + if !tc.expectingError { + t.Fatal(err) + } + + continue + } + + if tc.expectingError { + t.Fatal("expected error") + } + + if response.GetFilename() != tc.expectedMessage { + t.Fatal("failed!") + } + } +} diff --git a/code/go/0chain.net/blobbercore/handler/updateattributes_integration_test.go b/code/go/0chain.net/blobbercore/handler/updateattributes_integration_test.go new file mode 100644 index 000000000..be10a3c74 --- /dev/null +++ b/code/go/0chain.net/blobbercore/handler/updateattributes_integration_test.go @@ -0,0 +1,101 @@ +package handler + +import ( + "context" + "encoding/hex" + "encoding/json" + "testing" + + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/reference" + "github.com/0chain/blobber/code/go/0chain.net/core/common" + "github.com/0chain/blobber/code/go/0chain.net/core/encryption" + "google.golang.org/grpc/metadata" +) + +func TestBlobberGRPCService_UpdateObjectAttributes(t *testing.T) { + bClient, tdController := setupHandlerIntegrationTests(t) + allocationTx := randString(32) + + pubKey, _, signScheme := GeneratePubPrivateKey(t) + clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) + pubKeyBytes, _ := hex.DecodeString(pubKey) + clientId := encryption.Hash(pubKeyBytes) + + if err := tdController.ClearDatabase(); err != nil { + t.Fatal(err) + } + if err := tdController.AddAttributesTestData(allocationTx, pubKey, clientId); err != nil { + t.Fatal(err) + } + + attr := &reference.Attributes{WhoPaysForReads: common.WhoPays3rdParty} + attrBytes, err := json.Marshal(attr) + if err != nil { + t.Fatal(err) + } + + testCases := []struct { + name string + context metadata.MD + input *blobbergrpc.UpdateObjectAttributesRequest + expectedMessage int + expectingError bool + }{ + { + name: "Success", + context: metadata.New(map[string]string{ + common.ClientHeader: clientId, + common.ClientSignatureHeader: clientSignature, + common.ClientKeyHeader: pubKey, + }), + input: &blobbergrpc.UpdateObjectAttributesRequest{ + Allocation: allocationTx, + Path: "/some_file", + PathHash: "exampleId:examplePath", + ConnectionId: "connection_id", + Attributes: string(attrBytes), + }, + expectedMessage: int(attr.WhoPaysForReads), + expectingError: false, + }, + { + name: "Fail", + context: metadata.New(map[string]string{ + common.ClientHeader: clientId, + common.ClientSignatureHeader: clientSignature, + common.ClientKeyHeader: pubKey, + }), + input: &blobbergrpc.UpdateObjectAttributesRequest{ + Allocation: "", + Path: "", + PathHash: "", + ConnectionId: "", + Attributes: "", + }, + expectedMessage: 0, + expectingError: true, + }, + } + + for _, tc := range testCases { + ctx := context.Background() + ctx = metadata.NewOutgoingContext(ctx, tc.context) + response, err := bClient.UpdateObjectAttributes(ctx, tc.input) + if err != nil { + if !tc.expectingError { + t.Fatal(err) + } + + continue + } + + if tc.expectingError { + t.Fatal("expected error") + } + + if response.GetWhoPaysForReads() != int64(tc.expectedMessage) { + t.Fatal("failed!") + } + } +} diff --git a/code/go/0chain.net/blobbercore/handler/upload_integration_test.go b/code/go/0chain.net/blobbercore/handler/upload_integration_test.go new file mode 100644 index 000000000..3bf5bef7e --- /dev/null +++ b/code/go/0chain.net/blobbercore/handler/upload_integration_test.go @@ -0,0 +1,123 @@ +package handler + +import ( + "context" + "encoding/hex" + "encoding/json" + "io" + "os" + "testing" + + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/allocation" + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" + "github.com/0chain/blobber/code/go/0chain.net/core/common" + "github.com/0chain/blobber/code/go/0chain.net/core/encryption" + "google.golang.org/grpc/metadata" +) + +func TestBlobberGRPCService_UploadFile(t *testing.T) { + bClient, tdController := setupHandlerIntegrationTests(t) + allocationTx := randString(32) + + pubKey, _, signScheme := GeneratePubPrivateKey(t) + clientSignature, _ := signScheme.Sign(encryption.Hash(allocationTx)) + pubKeyBytes, _ := hex.DecodeString(pubKey) + clientId := encryption.Hash(pubKeyBytes) + + formFieldByt, err := json.Marshal(&allocation.UpdateFileChange{NewFileChange: allocation.NewFileChange{Filename: `grpc_handler_integration_test.go`}}) + if err != nil { + t.Fatal(err) + } + + if err := tdController.ClearDatabase(); err != nil { + t.Fatal(err) + } + if err := tdController.AddUploadTestData(allocationTx, pubKey, clientId); err != nil { + t.Fatal(err) + } + + root, _ := os.Getwd() + file, err := os.Open(root + "/grpc_handler_integration_test.go") + if err != nil { + t.Fatal(err) + } + stats, err := file.Stat() + if err != nil { + panic(err) + } + fileB := make([]byte, stats.Size()) + if _, err := io.ReadFull(file, fileB); err != nil { + t.Fatal(err) + } + + testCases := []struct { + name string + context metadata.MD + input *blobbergrpc.UploadFileRequest + expectedFileName string + expectingError bool + }{ + { + name: "Success", + context: metadata.New(map[string]string{ + common.ClientHeader: clientId, + common.ClientSignatureHeader: clientSignature, + common.ClientKeyHeader: pubKey, + }), + + input: &blobbergrpc.UploadFileRequest{ + Allocation: allocationTx, + Path: "/some_file", + ConnectionId: "connection_id", + Method: "POST", + UploadMeta: string(formFieldByt), + UpdateMeta: "", + UploadFile: fileB, + UploadThumbnailFile: []byte{}, + }, + expectedFileName: "grpc_handler_integration_test.go", + expectingError: false, + }, + { + name: "Fail", + context: metadata.New(map[string]string{ + common.ClientHeader: clientId, + common.ClientSignatureHeader: clientSignature, + common.ClientKeyHeader: pubKey, + }), + input: &blobbergrpc.UploadFileRequest{ + Allocation: "", + Path: "", + ConnectionId: "", + Method: "", + UploadMeta: "", + UpdateMeta: "", + UploadFile: nil, + UploadThumbnailFile: nil, + }, + expectedFileName: "", + expectingError: true, + }, + } + + for _, tc := range testCases { + ctx := context.Background() + ctx = metadata.NewOutgoingContext(ctx, tc.context) + response, err := bClient.UploadFile(ctx, tc.input) + if err != nil { + if !tc.expectingError { + t.Fatal(err) + } + + continue + } + + if tc.expectingError { + t.Fatal("expected error") + } + + if response.GetFilename() != tc.expectedFileName { + t.Fatal("failed!") + } + } +} From a2480a5343bcb21e3c8f873d07c9a3a0179be40f Mon Sep 17 00:00:00 2001 From: Shravan Shetty Date: Wed, 7 Jul 2021 16:59:48 +0530 Subject: [PATCH 5/9] :bug: fixing tests --- .../blobbercore/handler/helper_integration_test.go | 1 - .../blobbercore/handler/upload_integration_test.go | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/code/go/0chain.net/blobbercore/handler/helper_integration_test.go b/code/go/0chain.net/blobbercore/handler/helper_integration_test.go index 643bad3c4..0ebc8375f 100644 --- a/code/go/0chain.net/blobbercore/handler/helper_integration_test.go +++ b/code/go/0chain.net/blobbercore/handler/helper_integration_test.go @@ -65,7 +65,6 @@ func setupHandlerIntegrationTests(t *testing.T) (blobbergrpc.BlobberClient, *Tes if err != nil { t.Fatal(err) } - defer conn.Close() bClient := blobbergrpc.NewBlobberClient(conn) setupIntegrationTestConfig(t) diff --git a/code/go/0chain.net/blobbercore/handler/upload_integration_test.go b/code/go/0chain.net/blobbercore/handler/upload_integration_test.go index 3bf5bef7e..479a8ceac 100644 --- a/code/go/0chain.net/blobbercore/handler/upload_integration_test.go +++ b/code/go/0chain.net/blobbercore/handler/upload_integration_test.go @@ -24,7 +24,7 @@ func TestBlobberGRPCService_UploadFile(t *testing.T) { pubKeyBytes, _ := hex.DecodeString(pubKey) clientId := encryption.Hash(pubKeyBytes) - formFieldByt, err := json.Marshal(&allocation.UpdateFileChange{NewFileChange: allocation.NewFileChange{Filename: `grpc_handler_integration_test.go`}}) + formFieldByt, err := json.Marshal(&allocation.UpdateFileChange{NewFileChange: allocation.NewFileChange{Filename: `helper_integration_test.go`}}) if err != nil { t.Fatal(err) } @@ -37,7 +37,7 @@ func TestBlobberGRPCService_UploadFile(t *testing.T) { } root, _ := os.Getwd() - file, err := os.Open(root + "/grpc_handler_integration_test.go") + file, err := os.Open(root + "/helper_integration_test.go") if err != nil { t.Fatal(err) } @@ -75,7 +75,7 @@ func TestBlobberGRPCService_UploadFile(t *testing.T) { UploadFile: fileB, UploadThumbnailFile: []byte{}, }, - expectedFileName: "grpc_handler_integration_test.go", + expectedFileName: "helper_integration_test.go", expectingError: false, }, { From e6e2c1b1e0039c3d255174814e356d43b462887c Mon Sep 17 00:00:00 2001 From: Shravan Shetty Date: Wed, 7 Jul 2021 17:12:06 +0530 Subject: [PATCH 6/9] :green_heart: fixing tests --- .../0chain.net/blobbercore/handler/download_integration_test.go | 2 +- .../0chain.net/blobbercore/handler/helper_integration_test.go | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/code/go/0chain.net/blobbercore/handler/download_integration_test.go b/code/go/0chain.net/blobbercore/handler/download_integration_test.go index 5792abb6e..af32f9b2e 100644 --- a/code/go/0chain.net/blobbercore/handler/download_integration_test.go +++ b/code/go/0chain.net/blobbercore/handler/download_integration_test.go @@ -41,7 +41,7 @@ func TestBlobberGRPCService_DownloadFile(t *testing.T) { } defer f.Close() - file, err := os.Open(root + "/grpc_handler_integration_test.go") + file, err := os.Open(root + "/helper_integration_test.go") if err != nil { t.Fatal(err) } diff --git a/code/go/0chain.net/blobbercore/handler/helper_integration_test.go b/code/go/0chain.net/blobbercore/handler/helper_integration_test.go index 0ebc8375f..ceaeede39 100644 --- a/code/go/0chain.net/blobbercore/handler/helper_integration_test.go +++ b/code/go/0chain.net/blobbercore/handler/helper_integration_test.go @@ -53,7 +53,6 @@ func setupHandlerIntegrationTests(t *testing.T) (blobbergrpc.BlobberClient, *Tes var conn *grpc.ClientConn var err error for i := 0; i < RetryAttempts; i++ { - log.Println("Connection attempt - " + fmt.Sprint(i+1)) conn, err = grpc.Dial(BlobberTestAddr, grpc.WithInsecure()) if err != nil { log.Println(err) From 2650d79a8810f3d3fac4976dc20e3fac4e997151 Mon Sep 17 00:00:00 2001 From: Shravan Shetty Date: Wed, 7 Jul 2021 17:55:46 +0530 Subject: [PATCH 7/9] :art: reformatted proto file according to convention --- .../blobbercore/blobbergrpc/blobber.pb.go | 1508 +++++++++-------- .../blobbergrpc/proto/blobber.proto | 218 +-- .../0chain.net/blobbercore/convert/convert.go | 51 +- .../blobbercore/convert/responseHandler.go | 8 +- .../blobbercore/openapi/blobber.swagger.json | 218 +-- 5 files changed, 1005 insertions(+), 998 deletions(-) diff --git a/code/go/0chain.net/blobbercore/blobbergrpc/blobber.pb.go b/code/go/0chain.net/blobbercore/blobbergrpc/blobber.pb.go index 5d294e6b1..c5723434b 100644 --- a/code/go/0chain.net/blobbercore/blobbergrpc/blobber.pb.go +++ b/code/go/0chain.net/blobbercore/blobbergrpc/blobber.pb.go @@ -106,7 +106,7 @@ type CollaboratorResponse struct { unknownFields protoimpl.UnknownFields Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` - Collaborators []*Collaborator `protobuf:"bytes,2,rep,name=Collaborators,proto3" json:"Collaborators,omitempty"` + Collaborators []*Collaborator `protobuf:"bytes,2,rep,name=collaborators,proto3" json:"collaborators,omitempty"` } func (x *CollaboratorResponse) Reset() { @@ -585,8 +585,8 @@ type GetObjectTreeResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ReferencePath *ReferencePath `protobuf:"bytes,1,opt,name=ReferencePath,proto3" json:"ReferencePath,omitempty"` - LatestWM *WriteMarker `protobuf:"bytes,2,opt,name=LatestWM,proto3" json:"LatestWM,omitempty"` + ReferencePath *ReferencePath `protobuf:"bytes,1,opt,name=reference_path,json=referencePath,proto3" json:"reference_path,omitempty"` + LatestWm *WriteMarker `protobuf:"bytes,2,opt,name=latest_wm,json=latestWm,proto3" json:"latest_wm,omitempty"` } func (x *GetObjectTreeResponse) Reset() { @@ -628,9 +628,9 @@ func (x *GetObjectTreeResponse) GetReferencePath() *ReferencePath { return nil } -func (x *GetObjectTreeResponse) GetLatestWM() *WriteMarker { +func (x *GetObjectTreeResponse) GetLatestWm() *WriteMarker { if x != nil { - return x.LatestWM + return x.LatestWm } return nil } @@ -640,8 +640,8 @@ type GetReferencePathRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Paths string `protobuf:"bytes,1,opt,name=Paths,proto3" json:"Paths,omitempty"` - Path string `protobuf:"bytes,2,opt,name=Path,proto3" json:"Path,omitempty"` + Paths string `protobuf:"bytes,1,opt,name=paths,proto3" json:"paths,omitempty"` + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` Allocation string `protobuf:"bytes,3,opt,name=allocation,proto3" json:"allocation,omitempty"` } @@ -703,8 +703,8 @@ type GetReferencePathResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ReferencePath *ReferencePath `protobuf:"bytes,1,opt,name=ReferencePath,proto3" json:"ReferencePath,omitempty"` - LatestWM *WriteMarker `protobuf:"bytes,2,opt,name=LatestWM,proto3" json:"LatestWM,omitempty"` + ReferencePath *ReferencePath `protobuf:"bytes,1,opt,name=reference_path,json=referencePath,proto3" json:"reference_path,omitempty"` + LatestWm *WriteMarker `protobuf:"bytes,2,opt,name=latest_wm,json=latestWm,proto3" json:"latest_wm,omitempty"` } func (x *GetReferencePathResponse) Reset() { @@ -746,9 +746,9 @@ func (x *GetReferencePathResponse) GetReferencePath() *ReferencePath { return nil } -func (x *GetReferencePathResponse) GetLatestWM() *WriteMarker { +func (x *GetReferencePathResponse) GetLatestWm() *WriteMarker { if x != nil { - return x.LatestWM + return x.LatestWm } return nil } @@ -758,8 +758,8 @@ type ReferencePath struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MetaData *FileRef `protobuf:"bytes,1,opt,name=MetaData,proto3" json:"MetaData,omitempty"` - List []*ReferencePath `protobuf:"bytes,2,rep,name=List,proto3" json:"List,omitempty"` + MetaData *FileRef `protobuf:"bytes,1,opt,name=meta_data,json=metaData,proto3" json:"meta_data,omitempty"` + List []*ReferencePath `protobuf:"bytes,2,rep,name=list,proto3" json:"list,omitempty"` } func (x *ReferencePath) Reset() { @@ -814,8 +814,8 @@ type GetObjectPathRequest struct { unknownFields protoimpl.UnknownFields Allocation string `protobuf:"bytes,1,opt,name=allocation,proto3" json:"allocation,omitempty"` - Path string `protobuf:"bytes,2,opt,name=Path,proto3" json:"Path,omitempty"` - BlockNum string `protobuf:"bytes,3,opt,name=BlockNum,proto3" json:"BlockNum,omitempty"` + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + BlockNum string `protobuf:"bytes,3,opt,name=block_num,json=blockNum,proto3" json:"block_num,omitempty"` } func (x *GetObjectPathRequest) Reset() { @@ -876,8 +876,8 @@ type GetObjectPathResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ObjectPath *ObjectPath `protobuf:"bytes,1,opt,name=ObjectPath,proto3" json:"ObjectPath,omitempty"` - LatestWriteMarker *WriteMarker `protobuf:"bytes,2,opt,name=LatestWriteMarker,proto3" json:"LatestWriteMarker,omitempty"` + ObjectPath *ObjectPath `protobuf:"bytes,1,opt,name=object_path,json=objectPath,proto3" json:"object_path,omitempty"` + LatestWriteMarker *WriteMarker `protobuf:"bytes,2,opt,name=latest_write_marker,json=latestWriteMarker,proto3" json:"latest_write_marker,omitempty"` } func (x *GetObjectPathResponse) Reset() { @@ -931,11 +931,11 @@ type ObjectPath struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RootHash string `protobuf:"bytes,1,opt,name=RootHash,proto3" json:"RootHash,omitempty"` - Meta *FileRef `protobuf:"bytes,2,opt,name=Meta,proto3" json:"Meta,omitempty"` - Path *FileRef `protobuf:"bytes,3,opt,name=Path,proto3" json:"Path,omitempty"` - PathList []*FileRef `protobuf:"bytes,4,rep,name=PathList,proto3" json:"PathList,omitempty"` - FileBlockNum int64 `protobuf:"varint,5,opt,name=FileBlockNum,proto3" json:"FileBlockNum,omitempty"` + RootHash string `protobuf:"bytes,1,opt,name=root_hash,json=rootHash,proto3" json:"root_hash,omitempty"` + Meta *FileRef `protobuf:"bytes,2,opt,name=meta,proto3" json:"meta,omitempty"` + Path *FileRef `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` + PathList []*FileRef `protobuf:"bytes,4,rep,name=path_list,json=pathList,proto3" json:"path_list,omitempty"` + FileBlockNum int64 `protobuf:"varint,5,opt,name=file_block_num,json=fileBlockNum,proto3" json:"file_block_num,omitempty"` } func (x *ObjectPath) Reset() { @@ -1010,14 +1010,14 @@ type WriteMarker struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - AllocationRoot string `protobuf:"bytes,1,opt,name=AllocationRoot,proto3" json:"AllocationRoot,omitempty"` - PreviousAllocationRoot string `protobuf:"bytes,2,opt,name=PreviousAllocationRoot,proto3" json:"PreviousAllocationRoot,omitempty"` - AllocationID string `protobuf:"bytes,3,opt,name=AllocationID,proto3" json:"AllocationID,omitempty"` - Size int64 `protobuf:"varint,4,opt,name=Size,proto3" json:"Size,omitempty"` - BlobberID string `protobuf:"bytes,5,opt,name=BlobberID,proto3" json:"BlobberID,omitempty"` - Timestamp int64 `protobuf:"varint,6,opt,name=Timestamp,proto3" json:"Timestamp,omitempty"` - ClientID string `protobuf:"bytes,7,opt,name=ClientID,proto3" json:"ClientID,omitempty"` - Signature string `protobuf:"bytes,8,opt,name=Signature,proto3" json:"Signature,omitempty"` + AllocationRoot string `protobuf:"bytes,1,opt,name=allocation_root,json=allocationRoot,proto3" json:"allocation_root,omitempty"` + PreviousAllocationRoot string `protobuf:"bytes,2,opt,name=previous_allocation_root,json=previousAllocationRoot,proto3" json:"previous_allocation_root,omitempty"` + AllocationId string `protobuf:"bytes,3,opt,name=allocation_id,json=allocationId,proto3" json:"allocation_id,omitempty"` + Size int64 `protobuf:"varint,4,opt,name=size,proto3" json:"size,omitempty"` + BlobberId string `protobuf:"bytes,5,opt,name=blobber_id,json=blobberId,proto3" json:"blobber_id,omitempty"` + Timestamp int64 `protobuf:"varint,6,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + ClientId string `protobuf:"bytes,7,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` + Signature string `protobuf:"bytes,8,opt,name=signature,proto3" json:"signature,omitempty"` } func (x *WriteMarker) Reset() { @@ -1066,9 +1066,9 @@ func (x *WriteMarker) GetPreviousAllocationRoot() string { return "" } -func (x *WriteMarker) GetAllocationID() string { +func (x *WriteMarker) GetAllocationId() string { if x != nil { - return x.AllocationID + return x.AllocationId } return "" } @@ -1080,9 +1080,9 @@ func (x *WriteMarker) GetSize() int64 { return 0 } -func (x *WriteMarker) GetBlobberID() string { +func (x *WriteMarker) GetBlobberId() string { if x != nil { - return x.BlobberID + return x.BlobberId } return "" } @@ -1094,9 +1094,9 @@ func (x *WriteMarker) GetTimestamp() int64 { return 0 } -func (x *WriteMarker) GetClientID() string { +func (x *WriteMarker) GetClientId() string { if x != nil { - return x.ClientID + return x.ClientId } return "" } @@ -1184,9 +1184,9 @@ type ListEntitiesResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - AllocationRoot string `protobuf:"bytes,1,opt,name=AllocationRoot,proto3" json:"AllocationRoot,omitempty"` - MetaData *FileRef `protobuf:"bytes,2,opt,name=MetaData,proto3" json:"MetaData,omitempty"` - Entities []*FileRef `protobuf:"bytes,3,rep,name=Entities,proto3" json:"Entities,omitempty"` + AllocationRoot string `protobuf:"bytes,1,opt,name=allocation_root,json=allocationRoot,proto3" json:"allocation_root,omitempty"` + MetaData *FileRef `protobuf:"bytes,2,opt,name=meta_data,json=metaData,proto3" json:"meta_data,omitempty"` + Entities []*FileRef `protobuf:"bytes,3,rep,name=entities,proto3" json:"entities,omitempty"` } func (x *ListEntitiesResponse) Reset() { @@ -1310,8 +1310,8 @@ type GetFileStatsResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MetaData *FileRef `protobuf:"bytes,1,opt,name=MetaData,proto3" json:"MetaData,omitempty"` - Stats *FileStats `protobuf:"bytes,2,opt,name=Stats,proto3" json:"Stats,omitempty"` + MetaData *FileRef `protobuf:"bytes,1,opt,name=meta_data,json=metaData,proto3" json:"meta_data,omitempty"` + Stats *FileStats `protobuf:"bytes,2,opt,name=stats,proto3" json:"stats,omitempty"` } func (x *GetFileStatsResponse) Reset() { @@ -1365,16 +1365,16 @@ type FileStats struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ID int64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` - RefID int64 `protobuf:"varint,2,opt,name=RefID,proto3" json:"RefID,omitempty"` - NumUpdates int64 `protobuf:"varint,3,opt,name=NumUpdates,proto3" json:"NumUpdates,omitempty"` - NumBlockDownloads int64 `protobuf:"varint,4,opt,name=NumBlockDownloads,proto3" json:"NumBlockDownloads,omitempty"` - SuccessChallenges int64 `protobuf:"varint,5,opt,name=SuccessChallenges,proto3" json:"SuccessChallenges,omitempty"` - FailedChallenges int64 `protobuf:"varint,6,opt,name=FailedChallenges,proto3" json:"FailedChallenges,omitempty"` - LastChallengeResponseTxn string `protobuf:"bytes,7,opt,name=LastChallengeResponseTxn,proto3" json:"LastChallengeResponseTxn,omitempty"` - WriteMarkerRedeemTxn string `protobuf:"bytes,8,opt,name=WriteMarkerRedeemTxn,proto3" json:"WriteMarkerRedeemTxn,omitempty"` - CreatedAt int64 `protobuf:"varint,9,opt,name=CreatedAt,proto3" json:"CreatedAt,omitempty"` - UpdatedAt int64 `protobuf:"varint,10,opt,name=UpdatedAt,proto3" json:"UpdatedAt,omitempty"` + Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + RefId int64 `protobuf:"varint,2,opt,name=ref_id,json=refId,proto3" json:"ref_id,omitempty"` + NumUpdates int64 `protobuf:"varint,3,opt,name=num_updates,json=numUpdates,proto3" json:"num_updates,omitempty"` + NumBlockDownloads int64 `protobuf:"varint,4,opt,name=num_block_downloads,json=numBlockDownloads,proto3" json:"num_block_downloads,omitempty"` + SuccessChallenges int64 `protobuf:"varint,5,opt,name=success_challenges,json=successChallenges,proto3" json:"success_challenges,omitempty"` + FailedChallenges int64 `protobuf:"varint,6,opt,name=failed_challenges,json=failedChallenges,proto3" json:"failed_challenges,omitempty"` + LastChallengeResponseTxn string `protobuf:"bytes,7,opt,name=last_challenge_response_txn,json=lastChallengeResponseTxn,proto3" json:"last_challenge_response_txn,omitempty"` + WriteMarkerRedeemTxn string `protobuf:"bytes,8,opt,name=write_marker_redeem_txn,json=writeMarkerRedeemTxn,proto3" json:"write_marker_redeem_txn,omitempty"` + CreatedAt int64 `protobuf:"varint,9,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt int64 `protobuf:"varint,10,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` } func (x *FileStats) Reset() { @@ -1409,16 +1409,16 @@ func (*FileStats) Descriptor() ([]byte, []int) { return file_blobber_proto_rawDescGZIP(), []int{21} } -func (x *FileStats) GetID() int64 { +func (x *FileStats) GetId() int64 { if x != nil { - return x.ID + return x.Id } return 0 } -func (x *FileStats) GetRefID() int64 { +func (x *FileStats) GetRefId() int64 { if x != nil { - return x.RefID + return x.RefId } return 0 } @@ -1555,8 +1555,8 @@ type GetFileMetaDataResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MetaData *FileRef `protobuf:"bytes,1,opt,name=MetaData,proto3" json:"MetaData,omitempty"` - Collaborators []*Collaborator `protobuf:"bytes,2,rep,name=Collaborators,proto3" json:"Collaborators,omitempty"` + MetaData *FileRef `protobuf:"bytes,1,opt,name=meta_data,json=metaData,proto3" json:"meta_data,omitempty"` + Collaborators []*Collaborator `protobuf:"bytes,2,rep,name=collaborators,proto3" json:"collaborators,omitempty"` } func (x *GetFileMetaDataResponse) Reset() { @@ -1610,9 +1610,9 @@ type CommitMetaTxn struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RefId int64 `protobuf:"varint,1,opt,name=RefId,proto3" json:"RefId,omitempty"` - TxnId string `protobuf:"bytes,2,opt,name=TxnId,proto3" json:"TxnId,omitempty"` - CreatedAt int64 `protobuf:"varint,3,opt,name=CreatedAt,proto3" json:"CreatedAt,omitempty"` + RefId int64 `protobuf:"varint,1,opt,name=ref_id,json=refId,proto3" json:"ref_id,omitempty"` + TxnId string `protobuf:"bytes,2,opt,name=txn_id,json=txnId,proto3" json:"txn_id,omitempty"` + CreatedAt int64 `protobuf:"varint,3,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` } func (x *CommitMetaTxn) Reset() { @@ -1673,9 +1673,9 @@ type Collaborator struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RefId int64 `protobuf:"varint,1,opt,name=RefId,proto3" json:"RefId,omitempty"` - ClientId string `protobuf:"bytes,2,opt,name=ClientId,proto3" json:"ClientId,omitempty"` - CreatedAt int64 `protobuf:"varint,3,opt,name=CreatedAt,proto3" json:"CreatedAt,omitempty"` + RefId int64 `protobuf:"varint,1,opt,name=ref_id,json=refId,proto3" json:"ref_id,omitempty"` + ClientId string `protobuf:"bytes,2,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` + CreatedAt int64 `protobuf:"varint,3,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` } func (x *Collaborator) Reset() { @@ -2801,24 +2801,24 @@ type Allocation struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ID string `protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"` - Tx string `protobuf:"bytes,2,opt,name=Tx,proto3" json:"Tx,omitempty"` - TotalSize int64 `protobuf:"varint,3,opt,name=TotalSize,proto3" json:"TotalSize,omitempty"` - UsedSize int64 `protobuf:"varint,4,opt,name=UsedSize,proto3" json:"UsedSize,omitempty"` - OwnerID string `protobuf:"bytes,5,opt,name=OwnerID,proto3" json:"OwnerID,omitempty"` - OwnerPublicKey string `protobuf:"bytes,6,opt,name=OwnerPublicKey,proto3" json:"OwnerPublicKey,omitempty"` - RepairerID string `protobuf:"bytes,7,opt,name=RepairerID,proto3" json:"RepairerID,omitempty"` - PayerID string `protobuf:"bytes,8,opt,name=PayerID,proto3" json:"PayerID,omitempty"` - Expiration int64 `protobuf:"varint,9,opt,name=Expiration,proto3" json:"Expiration,omitempty"` - AllocationRoot string `protobuf:"bytes,10,opt,name=AllocationRoot,proto3" json:"AllocationRoot,omitempty"` - BlobberSize int64 `protobuf:"varint,11,opt,name=BlobberSize,proto3" json:"BlobberSize,omitempty"` - BlobberSizeUsed int64 `protobuf:"varint,12,opt,name=BlobberSizeUsed,proto3" json:"BlobberSizeUsed,omitempty"` - LatestRedeemedWM string `protobuf:"bytes,13,opt,name=LatestRedeemedWM,proto3" json:"LatestRedeemedWM,omitempty"` - IsRedeemRequired bool `protobuf:"varint,14,opt,name=IsRedeemRequired,proto3" json:"IsRedeemRequired,omitempty"` - TimeUnit int64 `protobuf:"varint,15,opt,name=TimeUnit,proto3" json:"TimeUnit,omitempty"` - CleanedUp bool `protobuf:"varint,16,opt,name=CleanedUp,proto3" json:"CleanedUp,omitempty"` - Finalized bool `protobuf:"varint,17,opt,name=Finalized,proto3" json:"Finalized,omitempty"` - Terms []*Term `protobuf:"bytes,18,rep,name=Terms,proto3" json:"Terms,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Tx string `protobuf:"bytes,2,opt,name=tx,proto3" json:"tx,omitempty"` + TotalSize int64 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + UsedSize int64 `protobuf:"varint,4,opt,name=used_size,json=usedSize,proto3" json:"used_size,omitempty"` + OwnerId string `protobuf:"bytes,5,opt,name=owner_id,json=ownerId,proto3" json:"owner_id,omitempty"` + OwnerPublicKey string `protobuf:"bytes,6,opt,name=owner_public_key,json=ownerPublicKey,proto3" json:"owner_public_key,omitempty"` + RepairerId string `protobuf:"bytes,7,opt,name=repairer_id,json=repairerId,proto3" json:"repairer_id,omitempty"` + PayerId string `protobuf:"bytes,8,opt,name=payer_id,json=payerId,proto3" json:"payer_id,omitempty"` + Expiration int64 `protobuf:"varint,9,opt,name=expiration,proto3" json:"expiration,omitempty"` + AllocationRoot string `protobuf:"bytes,10,opt,name=allocation_root,json=allocationRoot,proto3" json:"allocation_root,omitempty"` + BlobberSize int64 `protobuf:"varint,11,opt,name=blobber_size,json=blobberSize,proto3" json:"blobber_size,omitempty"` + BlobberSizeUsed int64 `protobuf:"varint,12,opt,name=blobber_size_used,json=blobberSizeUsed,proto3" json:"blobber_size_used,omitempty"` + LatestRedeemedWm string `protobuf:"bytes,13,opt,name=latest_redeemed_wm,json=latestRedeemedWm,proto3" json:"latest_redeemed_wm,omitempty"` + IsRedeemRequired bool `protobuf:"varint,14,opt,name=is_redeem_required,json=isRedeemRequired,proto3" json:"is_redeem_required,omitempty"` + TimeUnit int64 `protobuf:"varint,15,opt,name=time_unit,json=timeUnit,proto3" json:"time_unit,omitempty"` + CleanedUp bool `protobuf:"varint,16,opt,name=cleaned_up,json=cleanedUp,proto3" json:"cleaned_up,omitempty"` + Finalized bool `protobuf:"varint,17,opt,name=finalized,proto3" json:"finalized,omitempty"` + Terms []*Term `protobuf:"bytes,18,rep,name=terms,proto3" json:"terms,omitempty"` } func (x *Allocation) Reset() { @@ -2853,9 +2853,9 @@ func (*Allocation) Descriptor() ([]byte, []int) { return file_blobber_proto_rawDescGZIP(), []int{39} } -func (x *Allocation) GetID() string { +func (x *Allocation) GetId() string { if x != nil { - return x.ID + return x.Id } return "" } @@ -2881,9 +2881,9 @@ func (x *Allocation) GetUsedSize() int64 { return 0 } -func (x *Allocation) GetOwnerID() string { +func (x *Allocation) GetOwnerId() string { if x != nil { - return x.OwnerID + return x.OwnerId } return "" } @@ -2895,16 +2895,16 @@ func (x *Allocation) GetOwnerPublicKey() string { return "" } -func (x *Allocation) GetRepairerID() string { +func (x *Allocation) GetRepairerId() string { if x != nil { - return x.RepairerID + return x.RepairerId } return "" } -func (x *Allocation) GetPayerID() string { +func (x *Allocation) GetPayerId() string { if x != nil { - return x.PayerID + return x.PayerId } return "" } @@ -2937,9 +2937,9 @@ func (x *Allocation) GetBlobberSizeUsed() int64 { return 0 } -func (x *Allocation) GetLatestRedeemedWM() string { +func (x *Allocation) GetLatestRedeemedWm() string { if x != nil { - return x.LatestRedeemedWM + return x.LatestRedeemedWm } return "" } @@ -2984,11 +2984,11 @@ type Term struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ID int64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` - BlobberID string `protobuf:"bytes,2,opt,name=BlobberID,proto3" json:"BlobberID,omitempty"` - AllocationID string `protobuf:"bytes,3,opt,name=AllocationID,proto3" json:"AllocationID,omitempty"` - ReadPrice int64 `protobuf:"varint,4,opt,name=ReadPrice,proto3" json:"ReadPrice,omitempty"` - WritePrice int64 `protobuf:"varint,5,opt,name=WritePrice,proto3" json:"WritePrice,omitempty"` + Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + BlobberId string `protobuf:"bytes,2,opt,name=blobber_id,json=blobberId,proto3" json:"blobber_id,omitempty"` + AllocationId string `protobuf:"bytes,3,opt,name=allocation_id,json=allocationId,proto3" json:"allocation_id,omitempty"` + ReadPrice int64 `protobuf:"varint,4,opt,name=read_price,json=readPrice,proto3" json:"read_price,omitempty"` + WritePrice int64 `protobuf:"varint,5,opt,name=write_price,json=writePrice,proto3" json:"write_price,omitempty"` } func (x *Term) Reset() { @@ -3023,23 +3023,23 @@ func (*Term) Descriptor() ([]byte, []int) { return file_blobber_proto_rawDescGZIP(), []int{40} } -func (x *Term) GetID() int64 { +func (x *Term) GetId() int64 { if x != nil { - return x.ID + return x.Id } return 0 } -func (x *Term) GetBlobberID() string { +func (x *Term) GetBlobberId() string { if x != nil { - return x.BlobberID + return x.BlobberId } return "" } -func (x *Term) GetAllocationID() string { +func (x *Term) GetAllocationId() string { if x != nil { - return x.AllocationID + return x.AllocationId } return "" } @@ -3063,9 +3063,9 @@ type FileRef struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=Type,proto3" json:"Type,omitempty"` - FileMetaData *FileMetaData `protobuf:"bytes,2,opt,name=FileMetaData,proto3" json:"FileMetaData,omitempty"` - DirMetaData *DirMetaData `protobuf:"bytes,3,opt,name=DirMetaData,proto3" json:"DirMetaData,omitempty"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + FileMetaData *FileMetaData `protobuf:"bytes,2,opt,name=file_meta_data,json=fileMetaData,proto3" json:"file_meta_data,omitempty"` + DirMetaData *DirMetaData `protobuf:"bytes,3,opt,name=dir_meta_data,json=dirMetaData,proto3" json:"dir_meta_data,omitempty"` } func (x *FileRef) Reset() { @@ -3126,30 +3126,30 @@ type FileMetaData struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=Type,proto3" json:"Type,omitempty"` - LookupHash string `protobuf:"bytes,2,opt,name=LookupHash,proto3" json:"LookupHash,omitempty"` - Name string `protobuf:"bytes,3,opt,name=Name,proto3" json:"Name,omitempty"` - Path string `protobuf:"bytes,4,opt,name=Path,proto3" json:"Path,omitempty"` - Hash string `protobuf:"bytes,5,opt,name=Hash,proto3" json:"Hash,omitempty"` - NumBlocks int64 `protobuf:"varint,6,opt,name=NumBlocks,proto3" json:"NumBlocks,omitempty"` - PathHash string `protobuf:"bytes,7,opt,name=PathHash,proto3" json:"PathHash,omitempty"` - CustomMeta string `protobuf:"bytes,8,opt,name=CustomMeta,proto3" json:"CustomMeta,omitempty"` - ContentHash string `protobuf:"bytes,9,opt,name=ContentHash,proto3" json:"ContentHash,omitempty"` - Size int64 `protobuf:"varint,10,opt,name=Size,proto3" json:"Size,omitempty"` - MerkleRoot string `protobuf:"bytes,11,opt,name=MerkleRoot,proto3" json:"MerkleRoot,omitempty"` - ActualFileSize int64 `protobuf:"varint,12,opt,name=ActualFileSize,proto3" json:"ActualFileSize,omitempty"` - ActualFileHash string `protobuf:"bytes,13,opt,name=ActualFileHash,proto3" json:"ActualFileHash,omitempty"` - MimeType string `protobuf:"bytes,14,opt,name=MimeType,proto3" json:"MimeType,omitempty"` - ThumbnailSize int64 `protobuf:"varint,15,opt,name=ThumbnailSize,proto3" json:"ThumbnailSize,omitempty"` - ThumbnailHash string `protobuf:"bytes,16,opt,name=ThumbnailHash,proto3" json:"ThumbnailHash,omitempty"` - ActualThumbnailSize int64 `protobuf:"varint,17,opt,name=ActualThumbnailSize,proto3" json:"ActualThumbnailSize,omitempty"` - ActualThumbnailHash string `protobuf:"bytes,18,opt,name=ActualThumbnailHash,proto3" json:"ActualThumbnailHash,omitempty"` - EncryptedKey string `protobuf:"bytes,19,opt,name=EncryptedKey,proto3" json:"EncryptedKey,omitempty"` - Attributes []byte `protobuf:"bytes,20,opt,name=Attributes,proto3" json:"Attributes,omitempty"` - OnCloud bool `protobuf:"varint,21,opt,name=OnCloud,proto3" json:"OnCloud,omitempty"` - CommitMetaTxns []*CommitMetaTxn `protobuf:"bytes,22,rep,name=CommitMetaTxns,proto3" json:"CommitMetaTxns,omitempty"` - CreatedAt int64 `protobuf:"varint,23,opt,name=CreatedAt,proto3" json:"CreatedAt,omitempty"` - UpdatedAt int64 `protobuf:"varint,24,opt,name=UpdatedAt,proto3" json:"UpdatedAt,omitempty"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + LookupHash string `protobuf:"bytes,2,opt,name=lookup_hash,json=lookupHash,proto3" json:"lookup_hash,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Path string `protobuf:"bytes,4,opt,name=path,proto3" json:"path,omitempty"` + Hash string `protobuf:"bytes,5,opt,name=hash,proto3" json:"hash,omitempty"` + NumBlocks int64 `protobuf:"varint,6,opt,name=num_blocks,json=numBlocks,proto3" json:"num_blocks,omitempty"` + PathHash string `protobuf:"bytes,7,opt,name=path_hash,json=pathHash,proto3" json:"path_hash,omitempty"` + CustomMeta string `protobuf:"bytes,8,opt,name=custom_meta,json=customMeta,proto3" json:"custom_meta,omitempty"` + ContentHash string `protobuf:"bytes,9,opt,name=content_hash,json=contentHash,proto3" json:"content_hash,omitempty"` + Size int64 `protobuf:"varint,10,opt,name=size,proto3" json:"size,omitempty"` + MerkleRoot string `protobuf:"bytes,11,opt,name=merkle_root,json=merkleRoot,proto3" json:"merkle_root,omitempty"` + ActualFileSize int64 `protobuf:"varint,12,opt,name=actual_file_size,json=actualFileSize,proto3" json:"actual_file_size,omitempty"` + ActualFileHash string `protobuf:"bytes,13,opt,name=actual_file_hash,json=actualFileHash,proto3" json:"actual_file_hash,omitempty"` + MimeType string `protobuf:"bytes,14,opt,name=mime_type,json=mimeType,proto3" json:"mime_type,omitempty"` + ThumbnailSize int64 `protobuf:"varint,15,opt,name=thumbnail_size,json=thumbnailSize,proto3" json:"thumbnail_size,omitempty"` + ThumbnailHash string `protobuf:"bytes,16,opt,name=thumbnail_hash,json=thumbnailHash,proto3" json:"thumbnail_hash,omitempty"` + ActualThumbnailSize int64 `protobuf:"varint,17,opt,name=actual_thumbnail_size,json=actualThumbnailSize,proto3" json:"actual_thumbnail_size,omitempty"` + ActualThumbnailHash string `protobuf:"bytes,18,opt,name=actual_thumbnail_hash,json=actualThumbnailHash,proto3" json:"actual_thumbnail_hash,omitempty"` + EncryptedKey string `protobuf:"bytes,19,opt,name=encrypted_key,json=encryptedKey,proto3" json:"encrypted_key,omitempty"` + Attributes []byte `protobuf:"bytes,20,opt,name=attributes,proto3" json:"attributes,omitempty"` + OnCloud bool `protobuf:"varint,21,opt,name=on_cloud,json=onCloud,proto3" json:"on_cloud,omitempty"` + CommitMetaTxns []*CommitMetaTxn `protobuf:"bytes,22,rep,name=commit_meta_txns,json=commitMetaTxns,proto3" json:"commit_meta_txns,omitempty"` + CreatedAt int64 `protobuf:"varint,23,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt int64 `protobuf:"varint,24,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` } func (x *FileMetaData) Reset() { @@ -3357,16 +3357,16 @@ type DirMetaData struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=Type,proto3" json:"Type,omitempty"` - LookupHash string `protobuf:"bytes,2,opt,name=LookupHash,proto3" json:"LookupHash,omitempty"` - Name string `protobuf:"bytes,3,opt,name=Name,proto3" json:"Name,omitempty"` - Path string `protobuf:"bytes,4,opt,name=Path,proto3" json:"Path,omitempty"` - Hash string `protobuf:"bytes,5,opt,name=Hash,proto3" json:"Hash,omitempty"` - NumBlocks int64 `protobuf:"varint,6,opt,name=NumBlocks,proto3" json:"NumBlocks,omitempty"` - PathHash string `protobuf:"bytes,7,opt,name=PathHash,proto3" json:"PathHash,omitempty"` - Size int64 `protobuf:"varint,8,opt,name=Size,proto3" json:"Size,omitempty"` - CreatedAt int64 `protobuf:"varint,9,opt,name=CreatedAt,proto3" json:"CreatedAt,omitempty"` - UpdatedAt int64 `protobuf:"varint,10,opt,name=UpdatedAt,proto3" json:"UpdatedAt,omitempty"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + LookupHash string `protobuf:"bytes,2,opt,name=lookup_hash,json=lookupHash,proto3" json:"lookup_hash,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Path string `protobuf:"bytes,4,opt,name=path,proto3" json:"path,omitempty"` + Hash string `protobuf:"bytes,5,opt,name=hash,proto3" json:"hash,omitempty"` + NumBlocks int64 `protobuf:"varint,6,opt,name=num_blocks,json=numBlocks,proto3" json:"num_blocks,omitempty"` + PathHash string `protobuf:"bytes,7,opt,name=path_hash,json=pathHash,proto3" json:"path_hash,omitempty"` + Size int64 `protobuf:"varint,8,opt,name=size,proto3" json:"size,omitempty"` + CreatedAt int64 `protobuf:"varint,9,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt int64 `protobuf:"varint,10,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` } func (x *DirMetaData) Reset() { @@ -3491,10 +3491,10 @@ var file_blobber_proto_rawDesc = []byte{ 0x78, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x46, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, + 0x65, 0x12, 0x46, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, + 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x60, 0x0a, 0x14, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, @@ -3542,612 +3542,618 @@ var file_blobber_proto_rawDesc = []byte{ 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9d, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x47, 0x0a, 0x0d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, - 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x0d, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x3b, 0x0a, 0x08, 0x4c, 0x61, 0x74, 0x65, - 0x73, 0x74, 0x57, 0x4d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x6c, 0x6f, - 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x08, 0x4c, 0x61, 0x74, - 0x65, 0x73, 0x74, 0x57, 0x4d, 0x22, 0x63, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6c, - 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa0, 0x01, 0x0a, 0x18, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0d, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, - 0x68, 0x52, 0x0d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, - 0x12, 0x3b, 0x0a, 0x08, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x57, 0x4d, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x72, 0x52, 0x08, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x57, 0x4d, 0x22, 0x7f, 0x0a, - 0x0d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x37, - 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x52, 0x08, 0x4d, - 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x35, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x66, - 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x22, 0xa6, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3e, 0x0a, 0x0a, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x50, 0x61, 0x74, 0x68, 0x52, 0x0a, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, - 0x12, 0x4d, 0x0a, 0x11, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x6c, + 0x48, 0x0a, 0x0e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, + 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x3c, 0x0a, 0x09, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x74, 0x5f, 0x77, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, + 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x08, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x74, 0x57, 0x6d, 0x22, 0x63, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x0a, 0x0a, + 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa2, 0x01, 0x0a, + 0x18, 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, + 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0e, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x50, 0x61, 0x74, 0x68, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, + 0x61, 0x74, 0x68, 0x12, 0x3c, 0x0a, 0x09, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x77, 0x6d, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, + 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x57, + 0x6d, 0x22, 0x80, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, + 0x61, 0x74, 0x68, 0x12, 0x38, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, + 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, + 0x52, 0x65, 0x66, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x35, 0x0a, + 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x11, 0x4c, 0x61, - 0x74, 0x65, 0x73, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x22, - 0xe7, 0x01, 0x0a, 0x0a, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, - 0x0a, 0x08, 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2f, 0x0a, 0x04, 0x4d, 0x65, + 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x04, + 0x6c, 0x69, 0x73, 0x74, 0x22, 0x67, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, + 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, + 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x22, 0xa9, 0x01, + 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x62, + 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x0a, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x4f, 0x0a, 0x13, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x74, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x11, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x22, 0xeb, 0x01, 0x0a, 0x0a, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x74, + 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, + 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2f, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x66, + 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x2f, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, + 0x66, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x38, 0x0a, 0x09, 0x70, 0x61, 0x74, 0x68, 0x5f, + 0x6c, 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x6c, 0x6f, + 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x4c, 0x69, 0x73, + 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x6e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x66, 0x69, 0x6c, 0x65, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x22, 0xa1, 0x02, 0x0a, 0x0b, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6f, 0x74, + 0x12, 0x38, 0x0a, 0x18, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x61, 0x6c, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x16, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x41, 0x6c, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, + 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, + 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x13, + 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x74, 0x68, 0x5f, + 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, + 0x48, 0x61, 0x73, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0xb2, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, + 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, - 0x6c, 0x65, 0x52, 0x65, 0x66, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x2f, 0x0a, 0x04, 0x50, - 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x6c, 0x6f, 0x62, - 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, - 0x69, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x37, 0x0a, 0x08, - 0x50, 0x61, 0x74, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x52, 0x08, 0x50, 0x61, 0x74, - 0x68, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x6c, - 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x22, 0x9b, 0x02, 0x0a, 0x0b, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x41, 0x6c, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6f, - 0x74, 0x12, 0x36, 0x0a, 0x16, 0x50, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x41, 0x6c, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x16, 0x50, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x41, 0x6c, 0x6c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x6c, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x12, 0x0a, - 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x49, 0x44, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x42, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x49, 0x44, 0x12, - 0x1c, 0x0a, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1a, 0x0a, - 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, - 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x6c, 0x65, 0x52, 0x65, 0x66, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x37, 0x0a, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x52, 0x08, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x66, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, + 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x48, 0x61, 0x73, 0x68, - 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x1e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0xb0, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x41, 0x6c, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6f, 0x74, - 0x12, 0x37, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x52, - 0x08, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x37, 0x0a, 0x08, 0x45, 0x6e, 0x74, - 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x6c, - 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x52, 0x08, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, - 0x65, 0x73, 0x22, 0x66, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, + 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x85, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x6d, 0x65, 0x74, + 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, + 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, 0x93, 0x03, 0x0a, 0x09, 0x46, 0x69, 0x6c, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x65, 0x66, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x72, 0x65, 0x66, 0x49, 0x64, 0x12, 0x1f, 0x0a, + 0x0b, 0x6e, 0x75, 0x6d, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0a, 0x6e, 0x75, 0x6d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x2e, + 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x64, 0x6f, 0x77, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6e, 0x75, 0x6d, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x2d, + 0x0a, 0x12, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, + 0x6e, 0x67, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x2b, 0x0a, + 0x11, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, + 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x1b, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x74, 0x78, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x18, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x78, 0x6e, 0x12, 0x35, 0x0a, 0x17, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x64, 0x65, 0x65, 0x6d, + 0x5f, 0x74, 0x78, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x64, 0x65, 0x65, 0x6d, 0x54, 0x78, 0x6e, + 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x88, + 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6c, - 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x84, 0x01, 0x0a, 0x14, 0x47, - 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, - 0x65, 0x66, 0x52, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x05, - 0x53, 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x62, 0x6c, - 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x22, 0x85, 0x03, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, - 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x49, 0x44, 0x12, - 0x14, 0x0a, 0x05, 0x52, 0x65, 0x66, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, - 0x52, 0x65, 0x66, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x4e, 0x75, 0x6d, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x4e, 0x75, 0x6d, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x4e, 0x75, 0x6d, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x11, 0x4e, 0x75, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, - 0x61, 0x64, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x68, - 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, - 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, - 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6c, 0x6c, - 0x65, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x46, 0x61, 0x69, - 0x6c, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x3a, 0x0a, - 0x18, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x78, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x18, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x78, 0x6e, 0x12, 0x32, 0x0a, 0x14, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x64, 0x65, 0x65, 0x6d, 0x54, 0x78, - 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x64, 0x65, 0x65, 0x6d, 0x54, 0x78, 0x6e, 0x12, 0x1c, 0x0a, - 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x88, 0x01, 0x0a, 0x16, 0x47, 0x65, - 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x74, 0x68, - 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, - 0x68, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9a, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x37, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x52, - 0x08, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x46, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, - 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x52, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x73, 0x22, 0x59, 0x0a, 0x0d, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x54, - 0x78, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x52, 0x65, 0x66, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x05, 0x52, 0x65, 0x66, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x78, 0x6e, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x78, 0x6e, 0x49, 0x64, 0x12, 0x1c, - 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x5e, 0x0a, 0x0c, - 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, - 0x52, 0x65, 0x66, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x52, 0x65, 0x66, - 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, - 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x26, 0x0a, 0x14, - 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x22, 0x57, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, - 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x02, - 0x0a, 0x13, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x74, - 0x68, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, - 0x74, 0x68, 0x48, 0x61, 0x73, 0x68, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x78, 0x5f, 0x70, 0x61, 0x79, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x78, 0x50, 0x61, 0x79, 0x12, 0x1b, 0x0a, - 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x75, - 0x6d, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6e, 0x75, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x61, - 0x64, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, - 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x22, 0xb9, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, - 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, - 0x61, 0x74, 0x68, 0x12, 0x3a, 0x0a, 0x09, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x6d, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, - 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, - 0x4d, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x6d, 0x22, - 0xdf, 0x02, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x6b, 0x65, 0x72, 0x12, 0x1b, 0x0a, - 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x62, - 0x62, 0x65, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x6c, - 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x77, - 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x77, - 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x1c, 0x0a, - 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, - 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x75, - 0x73, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x79, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x54, 0x69, 0x63, 0x6b, 0x65, - 0x74, 0x22, 0xb5, 0x01, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x74, 0x68, 0x5f, - 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, - 0x48, 0x61, 0x73, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x22, 0x4d, 0x0a, 0x1e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x12, 0x77, - 0x68, 0x6f, 0x5f, 0x70, 0x61, 0x79, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x77, 0x68, 0x6f, 0x50, 0x61, 0x79, 0x73, - 0x46, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x64, 0x73, 0x22, 0x9d, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x70, - 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, - 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, - 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x48, 0x61, 0x73, 0x68, 0x12, - 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x74, 0x22, 0xd2, 0x01, 0x0a, 0x12, 0x43, 0x6f, 0x70, - 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, - 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x61, - 0x73, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x6f, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, - 0x6f, 0x6f, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6c, 0x65, - 0x6e, 0x67, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x75, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0c, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0xa6, 0x01, - 0x0a, 0x13, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x74, - 0x68, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, - 0x74, 0x68, 0x48, 0x61, 0x73, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6e, - 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, - 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xd4, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, - 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x61, - 0x73, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x6f, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, - 0x6f, 0x6f, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6c, 0x65, - 0x6e, 0x67, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x75, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0c, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x9b, 0x02, - 0x0a, 0x11, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 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, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, - 0x65, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, - 0x6d, 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x75, 0x70, 0x6c, - 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x75, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x66, 0x69, 0x6c, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x13, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x68, - 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xd2, 0x01, 0x0a, 0x12, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, - 0x7a, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, - 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, - 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x6b, - 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x75, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x75, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0c, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, - 0x22, 0xd6, 0x04, 0x0a, 0x0a, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, - 0x0e, 0x0a, 0x02, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x54, 0x78, 0x12, - 0x1c, 0x0a, 0x09, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x55, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x08, 0x55, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x4f, 0x77, 0x6e, - 0x65, 0x72, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4f, 0x77, 0x6e, 0x65, - 0x72, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x77, 0x6e, - 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x52, - 0x65, 0x70, 0x61, 0x69, 0x72, 0x65, 0x72, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x52, 0x65, 0x70, 0x61, 0x69, 0x72, 0x65, 0x72, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x50, - 0x61, 0x79, 0x65, 0x72, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, - 0x79, 0x65, 0x72, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x45, 0x78, 0x70, 0x69, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x41, - 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x20, 0x0a, - 0x0b, 0x42, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0b, 0x42, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x28, 0x0a, 0x0f, 0x42, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x55, 0x73, - 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x42, 0x6c, 0x6f, 0x62, 0x62, 0x65, - 0x72, 0x53, 0x69, 0x7a, 0x65, 0x55, 0x73, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x4c, 0x61, 0x74, - 0x65, 0x73, 0x74, 0x52, 0x65, 0x64, 0x65, 0x65, 0x6d, 0x65, 0x64, 0x57, 0x4d, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x64, 0x65, 0x65, - 0x6d, 0x65, 0x64, 0x57, 0x4d, 0x12, 0x2a, 0x0a, 0x10, 0x49, 0x73, 0x52, 0x65, 0x64, 0x65, 0x65, - 0x6d, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x10, 0x49, 0x73, 0x52, 0x65, 0x64, 0x65, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x74, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x08, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x74, 0x12, 0x1c, 0x0a, - 0x09, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x65, 0x64, 0x55, 0x70, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x65, 0x64, 0x55, 0x70, 0x12, 0x1c, 0x0a, 0x09, 0x46, - 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x05, 0x54, 0x65, 0x72, - 0x6d, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, - 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, - 0x72, 0x6d, 0x52, 0x05, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x22, 0x96, 0x01, 0x0a, 0x04, 0x54, 0x65, - 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, - 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x49, 0x44, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x42, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x49, 0x44, - 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x50, 0x72, 0x69, 0x63, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x52, 0x65, 0x61, 0x64, 0x50, 0x72, 0x69, - 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x57, 0x72, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x57, 0x72, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, - 0x63, 0x65, 0x22, 0xa6, 0x01, 0x0a, 0x07, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x12, 0x12, - 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x44, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, - 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, + 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, + 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, + 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9b, 0x01, 0x0a, 0x17, 0x47, 0x65, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, - 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0c, 0x46, 0x69, 0x6c, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x41, 0x0a, 0x0b, 0x44, 0x69, 0x72, 0x4d, - 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x6c, 0x65, 0x52, 0x65, 0x66, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x46, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, + 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, + 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x5c, 0x0a, 0x0d, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x4d, 0x65, 0x74, 0x61, 0x54, 0x78, 0x6e, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x65, 0x66, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x72, 0x65, 0x66, 0x49, 0x64, 0x12, + 0x15, 0x0a, 0x06, 0x74, 0x78, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x74, 0x78, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x61, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x65, 0x66, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x72, 0x65, 0x66, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x26, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, + 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x22, 0x57, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x69, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0b, - 0x44, 0x69, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x22, 0xaf, 0x06, 0x0a, 0x0c, - 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, - 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x1e, 0x0a, 0x0a, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x48, 0x61, 0x73, 0x68, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1c, 0x0a, 0x09, - 0x4e, 0x75, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x09, 0x4e, 0x75, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x61, - 0x74, 0x68, 0x48, 0x61, 0x73, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x61, - 0x74, 0x68, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x4d, 0x65, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1e, 0x0a, 0x0a, - 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x26, 0x0a, 0x0e, - 0x41, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x41, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x46, 0x69, 0x6c, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x41, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x46, 0x69, - 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x41, 0x63, - 0x74, 0x75, 0x61, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1a, 0x0a, 0x08, - 0x4d, 0x69, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x4d, 0x69, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x68, 0x75, 0x6d, - 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0d, 0x54, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x24, - 0x0a, 0x0d, 0x54, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x48, 0x61, 0x73, 0x68, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x54, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, - 0x48, 0x61, 0x73, 0x68, 0x12, 0x30, 0x0a, 0x13, 0x41, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x54, 0x68, - 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x13, 0x41, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x54, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, - 0x69, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x41, 0x63, 0x74, 0x75, 0x61, 0x6c, - 0x54, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x48, 0x61, 0x73, 0x68, 0x18, 0x12, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x13, 0x41, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x54, 0x68, 0x75, 0x6d, 0x62, - 0x6e, 0x61, 0x69, 0x6c, 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x45, 0x6e, 0x63, 0x72, - 0x79, 0x70, 0x74, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x0a, 0x0a, - 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0a, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, - 0x4f, 0x6e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x4f, - 0x6e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x12, 0x49, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x4d, 0x65, 0x74, 0x61, 0x54, 0x78, 0x6e, 0x73, 0x18, 0x16, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x54, 0x78, - 0x6e, 0x52, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x54, 0x78, 0x6e, - 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x17, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x18, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x87, 0x02, - 0x0a, 0x0b, 0x44, 0x69, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, - 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x48, 0x61, 0x73, 0x68, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x48, 0x61, 0x73, - 0x68, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, - 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1c, 0x0a, - 0x09, 0x4e, 0x75, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x4e, 0x75, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x50, - 0x61, 0x74, 0x68, 0x48, 0x61, 0x73, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, - 0x61, 0x74, 0x68, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x32, 0xcc, 0x12, 0x0a, 0x07, 0x42, 0x6c, 0x6f, 0x62, - 0x62, 0x65, 0x72, 0x12, 0x7c, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, - 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x10, 0x12, 0x0e, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x91, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, - 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2b, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x22, 0x1a, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, - 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x89, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, + 0x76, 0x31, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x61, + 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x02, 0x0a, 0x13, 0x44, 0x6f, + 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x68, 0x61, + 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x48, 0x61, + 0x73, 0x68, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x78, 0x5f, 0x70, 0x61, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x72, 0x78, 0x50, 0x61, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x75, 0x6d, 0x5f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x75, 0x6d, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0xb9, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, + 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, + 0x3a, 0x0a, 0x09, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x6d, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x6b, 0x65, + 0x72, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x6d, 0x22, 0xdf, 0x02, 0x0a, 0x09, + 0x52, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x6b, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, + 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, + 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x73, 0x70, 0x65, + 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, + 0x64, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x79, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, + 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x22, 0xb5, 0x01, + 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x68, 0x61, 0x73, 0x68, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x48, 0x61, 0x73, 0x68, + 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x22, 0x4d, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x12, 0x77, 0x68, 0x6f, 0x5f, 0x70, + 0x61, 0x79, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0f, 0x77, 0x68, 0x6f, 0x50, 0x61, 0x79, 0x73, 0x46, 0x6f, 0x72, 0x52, + 0x65, 0x61, 0x64, 0x73, 0x22, 0x9d, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6c, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1b, + 0x0a, 0x09, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x48, 0x61, 0x73, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x64, 0x65, 0x73, 0x74, 0x22, 0xd2, 0x01, 0x0a, 0x12, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1f, + 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, + 0x23, 0x0a, 0x0d, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x75, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0xa6, 0x01, 0x0a, 0x13, 0x52, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x68, 0x61, + 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x48, 0x61, + 0x73, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0xd4, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1f, + 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, + 0x23, 0x0a, 0x0d, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x75, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x9b, 0x02, 0x0a, 0x11, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 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, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, + 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, + 0x69, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, 0x68, + 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x13, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x68, 0x75, 0x6d, 0x62, 0x6e, + 0x61, 0x69, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xd2, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x21, + 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, + 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, + 0x6f, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x75, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, + 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0xe7, 0x04, 0x0a, + 0x0a, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x74, + 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x74, 0x78, 0x12, 0x1d, 0x0a, 0x0a, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, + 0x65, 0x64, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x75, + 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x77, 0x6e, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x77, + 0x6e, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, + 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x65, 0x72, 0x49, 0x64, 0x12, 0x19, 0x0a, + 0x08, 0x70, 0x61, 0x79, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x70, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6f, + 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0f, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x55, 0x73, 0x65, 0x64, + 0x12, 0x2c, 0x0a, 0x12, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x64, 0x65, 0x65, + 0x6d, 0x65, 0x64, 0x5f, 0x77, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x64, 0x65, 0x65, 0x6d, 0x65, 0x64, 0x57, 0x6d, 0x12, 0x2c, + 0x0a, 0x12, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x64, 0x65, 0x65, 0x6d, 0x5f, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x52, 0x65, + 0x64, 0x65, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x08, 0x74, 0x69, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x65, + 0x61, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x70, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, + 0x6c, 0x65, 0x61, 0x6e, 0x65, 0x64, 0x55, 0x70, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x69, 0x6e, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x66, 0x69, 0x6e, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, + 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x52, + 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, 0x9a, 0x01, 0x0a, 0x04, 0x54, 0x65, 0x72, 0x6d, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x49, 0x64, 0x12, 0x23, + 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x65, 0x61, 0x64, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x22, 0xaa, 0x01, 0x0a, 0x07, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x46, 0x0a, 0x0e, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x62, 0x6c, + 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0c, 0x66, + 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x43, 0x0a, 0x0d, 0x64, + 0x69, 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x44, + 0x61, 0x74, 0x61, 0x52, 0x0b, 0x64, 0x69, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, + 0x22, 0xc6, 0x06, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x5f, + 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6c, 0x6f, 0x6f, 0x6b, + 0x75, 0x70, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, + 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, + 0x73, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x75, 0x6d, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6e, 0x75, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1f, + 0x0a, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x12, + 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x61, + 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, + 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x72, + 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x63, 0x74, 0x75, 0x61, + 0x6c, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x74, + 0x75, 0x61, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x6d, + 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6d, 0x69, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x68, 0x75, 0x6d, + 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x25, 0x0a, 0x0e, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x68, 0x61, 0x73, + 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, + 0x69, 0x6c, 0x48, 0x61, 0x73, 0x68, 0x12, 0x32, 0x0a, 0x15, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, + 0x5f, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x54, 0x68, 0x75, + 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x61, 0x63, + 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x68, + 0x61, 0x73, 0x68, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x61, 0x63, 0x74, 0x75, 0x61, + 0x6c, 0x54, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x48, 0x61, 0x73, 0x68, 0x12, 0x23, + 0x0a, 0x0d, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, + 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x6e, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x18, + 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x6f, 0x6e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x12, 0x4b, + 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x74, 0x78, + 0x6e, 0x73, 0x18, 0x16, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, + 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x54, 0x78, 0x6e, 0x52, 0x0e, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x54, 0x78, 0x6e, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x18, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x8c, 0x02, 0x0a, 0x0b, 0x44, 0x69, + 0x72, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, + 0x0b, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x75, + 0x6d, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x6e, 0x75, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x74, + 0x68, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, + 0x74, 0x68, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x32, 0xcc, 0x12, 0x0a, 0x07, 0x42, 0x6c, 0x6f, + 0x62, 0x62, 0x65, 0x72, 0x12, 0x7c, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x29, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x91, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, - 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x28, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x20, 0x22, 0x1b, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, - 0x73, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x3a, 0x01, - 0x2a, 0x12, 0x85, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, - 0x65, 0x73, 0x12, 0x27, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, - 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x6c, + 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4d, + 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x22, 0x1a, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, + 0x65, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x89, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, 0x69, + 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, + 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x46, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x28, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x73, 0x74, 0x61, + 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x3a, + 0x01, 0x2a, 0x12, 0x85, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x12, 0x27, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, + 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, + 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x7b, 0x61, + 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0x8e, 0x01, 0x0a, 0x0d, 0x47, + 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x28, 0x2e, 0x62, + 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, + 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x76, 0x32, 0x2f, 0x66, + 0x69, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x70, 0x61, 0x74, 0x68, 0x2f, 0x7b, + 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0x9a, 0x01, 0x0a, 0x10, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x2b, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, + 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, + 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x70, 0x61, 0x74, 0x68, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0x8e, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x72, 0x65, 0x65, 0x12, 0x28, 0x2e, 0x62, 0x6c, 0x6f, + 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, + 0x65, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x74, 0x72, 0x65, 0x65, 0x2f, 0x7b, 0x61, 0x6c, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0x8c, 0x01, 0x0a, 0x0c, 0x44, 0x6f, + 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x27, 0x2e, 0x62, 0x6c, 0x6f, + 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x22, 0x1e, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x2f, + 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x8a, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x2e, 0x62, 0x6c, 0x6f, 0x62, + 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x21, 0x22, 0x1c, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x72, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0xca, 0x01, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x46, 0x69, 0x6c, 0x65, 0x12, 0x25, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, - 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x7b, 0x61, 0x6c, - 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0x8e, 0x01, 0x0a, 0x0d, 0x47, 0x65, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x28, 0x2e, 0x62, 0x6c, + 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x6d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x67, 0x22, 0x1c, 0x2f, 0x76, 0x32, + 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x2f, 0x7b, 0x61, 0x6c, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x3a, 0x01, 0x2a, 0x5a, 0x21, 0x1a, 0x1c, + 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x2f, + 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x3a, 0x01, 0x2a, 0x5a, + 0x21, 0x2a, 0x1c, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x75, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x3a, + 0x01, 0x2a, 0x12, 0x7e, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x21, 0x2e, 0x62, + 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, 0x22, 0x2f, 0x76, 0x32, + 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x3a, + 0x01, 0x2a, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, + 0x48, 0x61, 0x73, 0x68, 0x12, 0x28, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, + 0x61, 0x74, 0x65, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, + 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x48, 0x61, 0x73, + 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x28, 0x22, 0x23, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x63, 0x61, 0x6c, 0x63, + 0x75, 0x6c, 0x61, 0x74, 0x65, 0x68, 0x61, 0x73, 0x68, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x54, 0x78, 0x6e, 0x12, 0x28, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x54, 0x78, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, - 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x70, 0x61, 0x74, 0x68, 0x2f, 0x7b, 0x61, - 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0x9a, 0x01, 0x0a, 0x10, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, - 0x2b, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x62, - 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, - 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x25, 0x12, 0x23, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x70, 0x61, 0x74, 0x68, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0x8e, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x72, 0x65, 0x65, 0x12, 0x28, 0x2e, 0x62, 0x6c, 0x6f, 0x62, - 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, - 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x74, 0x72, 0x65, 0x65, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0x8c, 0x01, 0x0a, 0x0c, 0x44, 0x6f, 0x77, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x27, 0x2e, 0x62, 0x6c, 0x6f, 0x62, - 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x23, 0x22, 0x1e, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x64, - 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x8a, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, - 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x21, 0x22, 0x1c, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x72, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0xca, 0x01, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, - 0x69, 0x6c, 0x65, 0x12, 0x25, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, - 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x62, 0x6c, 0x6f, - 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x6d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x67, 0x22, 0x1c, 0x2f, 0x76, 0x32, 0x2f, - 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x3a, 0x01, 0x2a, 0x5a, 0x21, 0x1a, 0x1c, 0x2f, - 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x2f, 0x7b, - 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x3a, 0x01, 0x2a, 0x5a, 0x21, - 0x2a, 0x1c, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x75, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x3a, 0x01, - 0x2a, 0x12, 0x7e, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x21, 0x2e, 0x62, 0x6c, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x4d, 0x65, 0x74, 0x61, 0x54, 0x78, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x22, 0x23, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, + 0x6c, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x78, 0x6e, + 0x2f, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x3a, 0x01, 0x2a, + 0x12, 0xac, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x31, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, 0x22, 0x2f, 0x76, 0x32, 0x2f, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x3a, 0x01, - 0x2a, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x48, - 0x61, 0x73, 0x68, 0x12, 0x28, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, - 0x74, 0x65, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, - 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x48, 0x61, 0x73, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, - 0x22, 0x23, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x63, 0x61, 0x6c, 0x63, 0x75, - 0x6c, 0x61, 0x74, 0x65, 0x68, 0x61, 0x73, 0x68, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x54, 0x78, 0x6e, 0x12, 0x28, 0x2e, 0x62, 0x6c, 0x6f, - 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x54, 0x78, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x4d, 0x65, 0x74, 0x61, 0x54, 0x78, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x22, 0x23, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, - 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x78, 0x6e, 0x2f, + 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x76, 0x32, 0x2f, + 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x3a, 0x01, 0x2a, 0x12, - 0xac, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x31, 0x2e, 0x62, 0x6c, 0x6f, - 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x74, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, - 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x76, 0x32, 0x2f, 0x66, - 0x69, 0x6c, 0x65, 0x2f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x2f, 0x7b, - 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x82, - 0x01, 0x0a, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x2e, - 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x1f, 0x22, 0x1a, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x63, - 0x6f, 0x70, 0x79, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, - 0x3a, 0x01, 0x2a, 0x12, 0x90, 0x01, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x12, 0x27, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, - 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, - 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, - 0x22, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, - 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x7d, 0x3a, 0x01, 0x2a, 0x42, 0x2c, 0x5a, 0x2a, 0x63, 0x6f, 0x64, 0x65, 0x2f, 0x67, - 0x6f, 0x2f, 0x30, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x62, 0x6c, 0x6f, - 0x62, 0x62, 0x65, 0x72, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, - 0x67, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x82, 0x01, 0x0a, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, + 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x22, 0x1a, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x2f, + 0x63, 0x6f, 0x70, 0x79, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x90, 0x01, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x27, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x61, + 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, + 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, + 0x22, 0x22, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x61, + 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x7d, 0x3a, 0x01, 0x2a, 0x42, 0x2c, 0x5a, 0x2a, 0x63, 0x6f, 0x64, 0x65, 0x2f, + 0x67, 0x6f, 0x2f, 0x30, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x62, 0x6c, + 0x6f, 0x62, 0x62, 0x65, 0x72, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x62, 0x65, + 0x72, 0x67, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4210,31 +4216,31 @@ var file_blobber_proto_goTypes = []interface{}{ (*DirMetaData)(nil), // 43: blobber.service.v1.DirMetaData } var file_blobber_proto_depIdxs = []int32{ - 25, // 0: blobber.service.v1.CollaboratorResponse.Collaborators:type_name -> blobber.service.v1.Collaborator + 25, // 0: blobber.service.v1.CollaboratorResponse.collaborators:type_name -> blobber.service.v1.Collaborator 16, // 1: blobber.service.v1.CommitResponse.write_marker:type_name -> blobber.service.v1.WriteMarker - 12, // 2: blobber.service.v1.GetObjectTreeResponse.ReferencePath:type_name -> blobber.service.v1.ReferencePath - 16, // 3: blobber.service.v1.GetObjectTreeResponse.LatestWM:type_name -> blobber.service.v1.WriteMarker - 12, // 4: blobber.service.v1.GetReferencePathResponse.ReferencePath:type_name -> blobber.service.v1.ReferencePath - 16, // 5: blobber.service.v1.GetReferencePathResponse.LatestWM:type_name -> blobber.service.v1.WriteMarker - 41, // 6: blobber.service.v1.ReferencePath.MetaData:type_name -> blobber.service.v1.FileRef - 12, // 7: blobber.service.v1.ReferencePath.List:type_name -> blobber.service.v1.ReferencePath - 15, // 8: blobber.service.v1.GetObjectPathResponse.ObjectPath:type_name -> blobber.service.v1.ObjectPath - 16, // 9: blobber.service.v1.GetObjectPathResponse.LatestWriteMarker:type_name -> blobber.service.v1.WriteMarker - 41, // 10: blobber.service.v1.ObjectPath.Meta:type_name -> blobber.service.v1.FileRef - 41, // 11: blobber.service.v1.ObjectPath.Path:type_name -> blobber.service.v1.FileRef - 41, // 12: blobber.service.v1.ObjectPath.PathList:type_name -> blobber.service.v1.FileRef - 41, // 13: blobber.service.v1.ListEntitiesResponse.MetaData:type_name -> blobber.service.v1.FileRef - 41, // 14: blobber.service.v1.ListEntitiesResponse.Entities:type_name -> blobber.service.v1.FileRef - 41, // 15: blobber.service.v1.GetFileStatsResponse.MetaData:type_name -> blobber.service.v1.FileRef - 21, // 16: blobber.service.v1.GetFileStatsResponse.Stats:type_name -> blobber.service.v1.FileStats - 41, // 17: blobber.service.v1.GetFileMetaDataResponse.MetaData:type_name -> blobber.service.v1.FileRef - 25, // 18: blobber.service.v1.GetFileMetaDataResponse.Collaborators:type_name -> blobber.service.v1.Collaborator + 12, // 2: blobber.service.v1.GetObjectTreeResponse.reference_path:type_name -> blobber.service.v1.ReferencePath + 16, // 3: blobber.service.v1.GetObjectTreeResponse.latest_wm:type_name -> blobber.service.v1.WriteMarker + 12, // 4: blobber.service.v1.GetReferencePathResponse.reference_path:type_name -> blobber.service.v1.ReferencePath + 16, // 5: blobber.service.v1.GetReferencePathResponse.latest_wm:type_name -> blobber.service.v1.WriteMarker + 41, // 6: blobber.service.v1.ReferencePath.meta_data:type_name -> blobber.service.v1.FileRef + 12, // 7: blobber.service.v1.ReferencePath.list:type_name -> blobber.service.v1.ReferencePath + 15, // 8: blobber.service.v1.GetObjectPathResponse.object_path:type_name -> blobber.service.v1.ObjectPath + 16, // 9: blobber.service.v1.GetObjectPathResponse.latest_write_marker:type_name -> blobber.service.v1.WriteMarker + 41, // 10: blobber.service.v1.ObjectPath.meta:type_name -> blobber.service.v1.FileRef + 41, // 11: blobber.service.v1.ObjectPath.path:type_name -> blobber.service.v1.FileRef + 41, // 12: blobber.service.v1.ObjectPath.path_list:type_name -> blobber.service.v1.FileRef + 41, // 13: blobber.service.v1.ListEntitiesResponse.meta_data:type_name -> blobber.service.v1.FileRef + 41, // 14: blobber.service.v1.ListEntitiesResponse.entities:type_name -> blobber.service.v1.FileRef + 41, // 15: blobber.service.v1.GetFileStatsResponse.meta_data:type_name -> blobber.service.v1.FileRef + 21, // 16: blobber.service.v1.GetFileStatsResponse.stats:type_name -> blobber.service.v1.FileStats + 41, // 17: blobber.service.v1.GetFileMetaDataResponse.meta_data:type_name -> blobber.service.v1.FileRef + 25, // 18: blobber.service.v1.GetFileMetaDataResponse.collaborators:type_name -> blobber.service.v1.Collaborator 39, // 19: blobber.service.v1.GetAllocationResponse.allocation:type_name -> blobber.service.v1.Allocation 30, // 20: blobber.service.v1.DownloadFileResponse.latest_rm:type_name -> blobber.service.v1.ReadMaker - 40, // 21: blobber.service.v1.Allocation.Terms:type_name -> blobber.service.v1.Term - 42, // 22: blobber.service.v1.FileRef.FileMetaData:type_name -> blobber.service.v1.FileMetaData - 43, // 23: blobber.service.v1.FileRef.DirMetaData:type_name -> blobber.service.v1.DirMetaData - 24, // 24: blobber.service.v1.FileMetaData.CommitMetaTxns:type_name -> blobber.service.v1.CommitMetaTxn + 40, // 21: blobber.service.v1.Allocation.terms:type_name -> blobber.service.v1.Term + 42, // 22: blobber.service.v1.FileRef.file_meta_data:type_name -> blobber.service.v1.FileMetaData + 43, // 23: blobber.service.v1.FileRef.dir_meta_data:type_name -> blobber.service.v1.DirMetaData + 24, // 24: blobber.service.v1.FileMetaData.commit_meta_txns:type_name -> blobber.service.v1.CommitMetaTxn 26, // 25: blobber.service.v1.Blobber.GetAllocation:input_type -> blobber.service.v1.GetAllocationRequest 22, // 26: blobber.service.v1.Blobber.GetFileMetaData:input_type -> blobber.service.v1.GetFileMetaDataRequest 19, // 27: blobber.service.v1.Blobber.GetFileStats:input_type -> blobber.service.v1.GetFileStatsRequest diff --git a/code/go/0chain.net/blobbercore/blobbergrpc/proto/blobber.proto b/code/go/0chain.net/blobbercore/blobbergrpc/proto/blobber.proto index 387832b98..96cfa07c1 100644 --- a/code/go/0chain.net/blobbercore/blobbergrpc/proto/blobber.proto +++ b/code/go/0chain.net/blobbercore/blobbergrpc/proto/blobber.proto @@ -124,7 +124,7 @@ message CollaboratorRequest { message CollaboratorResponse { string message = 1; - repeated Collaborator Collaborators = 2; + repeated Collaborator collaborators = 2; } message CalculateHashRequest { @@ -168,52 +168,52 @@ message GetObjectTreeRequest { string allocation = 2; } message GetObjectTreeResponse { - ReferencePath ReferencePath = 1; - WriteMarker LatestWM = 2; + ReferencePath reference_path = 1; + WriteMarker latest_wm = 2; } message GetReferencePathRequest { - string Paths = 1; - string Path = 2; + string paths = 1; + string path = 2; string allocation = 3; } message GetReferencePathResponse { - ReferencePath ReferencePath = 1; - WriteMarker LatestWM = 2; + ReferencePath reference_path = 1; + WriteMarker latest_wm = 2; } message ReferencePath { - FileRef MetaData = 1; - repeated ReferencePath List = 2; + FileRef meta_data = 1; + repeated ReferencePath list = 2; } message GetObjectPathRequest { string allocation = 1; - string Path = 2; - string BlockNum = 3; + string path = 2; + string block_num = 3; } message GetObjectPathResponse { - ObjectPath ObjectPath = 1; - WriteMarker LatestWriteMarker = 2; + ObjectPath object_path = 1; + WriteMarker latest_write_marker = 2; } message ObjectPath { - string RootHash = 1; - FileRef Meta = 2; - FileRef Path = 3; - repeated FileRef PathList = 4; - int64 FileBlockNum = 5; + string root_hash = 1; + FileRef meta = 2; + FileRef path = 3; + repeated FileRef path_list = 4; + int64 file_block_num = 5; } message WriteMarker { - string AllocationRoot = 1; - string PreviousAllocationRoot = 2; - string AllocationID = 3; - int64 Size = 4; - string BlobberID = 5; - int64 Timestamp = 6; - string ClientID = 7; - string Signature = 8; + string allocation_root = 1; + string previous_allocation_root = 2; + string allocation_id = 3; + int64 size = 4; + string blobber_id = 5; + int64 timestamp = 6; + string client_id = 7; + string signature = 8; } message ListEntitiesRequest { @@ -224,9 +224,9 @@ message ListEntitiesRequest { } message ListEntitiesResponse { - string AllocationRoot = 1; - FileRef MetaData = 2; - repeated FileRef Entities = 3; + string allocation_root = 1; + FileRef meta_data = 2; + repeated FileRef entities = 3; } message GetFileStatsRequest { @@ -236,21 +236,21 @@ message GetFileStatsRequest { } message GetFileStatsResponse { - FileRef MetaData = 1; - FileStats Stats = 2; + FileRef meta_data = 1; + FileStats stats = 2; } message FileStats { - int64 ID = 1; - int64 RefID = 2; - int64 NumUpdates = 3; - int64 NumBlockDownloads = 4; - int64 SuccessChallenges = 5; - int64 FailedChallenges = 6; - string LastChallengeResponseTxn = 7; - string WriteMarkerRedeemTxn = 8; - int64 CreatedAt = 9; - int64 UpdatedAt = 10; + int64 id = 1; + int64 ref_id = 2; + int64 num_updates = 3; + int64 num_block_downloads = 4; + int64 success_challenges = 5; + int64 failed_challenges = 6; + string last_challenge_response_txn = 7; + string write_marker_redeem_txn = 8; + int64 created_at = 9; + int64 updated_at = 10; } message GetFileMetaDataRequest { @@ -261,20 +261,20 @@ message GetFileMetaDataRequest { } message GetFileMetaDataResponse { - FileRef MetaData = 1; - repeated Collaborator Collaborators = 2; + FileRef meta_data = 1; + repeated Collaborator collaborators = 2; } message CommitMetaTxn { - int64 RefId = 1; - string TxnId = 2; - int64 CreatedAt = 3; + int64 ref_id = 1; + string txn_id = 2; + int64 created_at = 3; } message Collaborator { - int64 RefId = 1; - string ClientId = 2; - int64 CreatedAt = 3; + int64 ref_id = 1; + string client_id = 2; + int64 created_at = 3; } message GetAllocationRequest { @@ -387,76 +387,76 @@ message UploadFileResponse { } message Allocation { - string ID = 1; - string Tx = 2; - int64 TotalSize = 3; - int64 UsedSize = 4; - string OwnerID = 5; - string OwnerPublicKey = 6; - string RepairerID = 7; - string PayerID = 8; - int64 Expiration = 9; - string AllocationRoot = 10; - int64 BlobberSize = 11; - int64 BlobberSizeUsed = 12; - string LatestRedeemedWM = 13; - bool IsRedeemRequired = 14; - int64 TimeUnit = 15; - bool CleanedUp = 16; - bool Finalized = 17; - repeated Term Terms = 18; + string id = 1; + string tx = 2; + int64 total_size = 3; + int64 used_size = 4; + string owner_id = 5; + string owner_public_key = 6; + string repairer_id = 7; + string payer_id = 8; + int64 expiration = 9; + string allocation_root = 10; + int64 blobber_size = 11; + int64 blobber_size_used = 12; + string latest_redeemed_wm = 13; + bool is_redeem_required = 14; + int64 time_unit = 15; + bool cleaned_up = 16; + bool finalized = 17; + repeated Term terms = 18; } message Term { - int64 ID = 1; - string BlobberID = 2; - string AllocationID = 3; - int64 ReadPrice = 4; - int64 WritePrice = 5; + int64 id = 1; + string blobber_id = 2; + string allocation_id = 3; + int64 read_price = 4; + int64 write_price = 5; } message FileRef { - string Type = 1; - FileMetaData FileMetaData = 2; - DirMetaData DirMetaData = 3; + string type = 1; + FileMetaData file_meta_data = 2; + DirMetaData dir_meta_data = 3; } message FileMetaData { - string Type = 1; - string LookupHash = 2; - string Name = 3; - string Path = 4; - string Hash = 5; - int64 NumBlocks = 6; - string PathHash = 7; - string CustomMeta = 8; - string ContentHash = 9; - int64 Size = 10; - string MerkleRoot = 11; - int64 ActualFileSize = 12; - string ActualFileHash = 13; - string MimeType = 14; - int64 ThumbnailSize = 15; - string ThumbnailHash = 16; - int64 ActualThumbnailSize = 17; - string ActualThumbnailHash = 18; - string EncryptedKey = 19; - bytes Attributes = 20; - bool OnCloud = 21; - repeated CommitMetaTxn CommitMetaTxns = 22; - int64 CreatedAt = 23; - int64 UpdatedAt = 24; + string type = 1; + string lookup_hash = 2; + string name = 3; + string path = 4; + string hash = 5; + int64 num_blocks = 6; + string path_hash = 7; + string custom_meta = 8; + string content_hash = 9; + int64 size = 10; + string merkle_root = 11; + int64 actual_file_size = 12; + string actual_file_hash = 13; + string mime_type = 14; + int64 thumbnail_size = 15; + string thumbnail_hash = 16; + int64 actual_thumbnail_size = 17; + string actual_thumbnail_hash = 18; + string encrypted_key = 19; + bytes attributes = 20; + bool on_cloud = 21; + repeated CommitMetaTxn commit_meta_txns = 22; + int64 created_at = 23; + int64 updated_at = 24; } message DirMetaData { - string Type = 1; - string LookupHash = 2; - string Name = 3; - string Path = 4; - string Hash = 5; - int64 NumBlocks = 6; - string PathHash = 7; - int64 Size = 8; - int64 CreatedAt = 9; - int64 UpdatedAt = 10; + string type = 1; + string lookup_hash = 2; + string name = 3; + string path = 4; + string hash = 5; + int64 num_blocks = 6; + string path_hash = 7; + int64 size = 8; + int64 created_at = 9; + int64 updated_at = 10; } \ No newline at end of file diff --git a/code/go/0chain.net/blobbercore/convert/convert.go b/code/go/0chain.net/blobbercore/convert/convert.go index 4670703cd..7e5867596 100644 --- a/code/go/0chain.net/blobbercore/convert/convert.go +++ b/code/go/0chain.net/blobbercore/convert/convert.go @@ -4,12 +4,13 @@ import ( "bytes" "context" "encoding/json" - "github.com/0chain/blobber/code/go/0chain.net/blobbercore/readmarker" "mime/multipart" "net/http" "strings" "time" + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/readmarker" + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/allocation" "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" "github.com/0chain/blobber/code/go/0chain.net/blobbercore/datastore" @@ -27,31 +28,31 @@ func AllocationToGRPCAllocation(alloc *allocation.Allocation) *blobbergrpc.Alloc terms := make([]*blobbergrpc.Term, 0, len(alloc.Terms)) for _, t := range alloc.Terms { terms = append(terms, &blobbergrpc.Term{ - ID: t.ID, - BlobberID: t.BlobberID, - AllocationID: t.AllocationID, + Id: t.ID, + BlobberId: t.BlobberID, + AllocationId: t.AllocationID, ReadPrice: t.ReadPrice, WritePrice: t.WritePrice, }) } return &blobbergrpc.Allocation{ - ID: alloc.ID, + Id: alloc.ID, Tx: alloc.Tx, TotalSize: alloc.TotalSize, UsedSize: alloc.UsedSize, - OwnerID: alloc.OwnerID, + OwnerId: alloc.OwnerID, OwnerPublicKey: alloc.OwnerPublicKey, Expiration: int64(alloc.Expiration), AllocationRoot: alloc.AllocationRoot, BlobberSize: alloc.BlobberSize, BlobberSizeUsed: alloc.BlobberSizeUsed, - LatestRedeemedWM: alloc.LatestRedeemedWM, + LatestRedeemedWm: alloc.LatestRedeemedWM, IsRedeemRequired: alloc.IsRedeemRequired, TimeUnit: int64(alloc.TimeUnit), CleanedUp: alloc.CleanedUp, Finalized: alloc.Finalized, Terms: terms, - PayerID: alloc.PayerID, + PayerId: alloc.PayerID, } } @@ -63,31 +64,31 @@ func GRPCAllocationToAllocation(alloc *blobbergrpc.Allocation) *allocation.Alloc terms := make([]*allocation.Terms, 0, len(alloc.Terms)) for _, t := range alloc.Terms { terms = append(terms, &allocation.Terms{ - ID: t.ID, - BlobberID: t.BlobberID, - AllocationID: t.AllocationID, + ID: t.Id, + BlobberID: t.BlobberId, + AllocationID: t.AllocationId, ReadPrice: t.ReadPrice, WritePrice: t.WritePrice, }) } return &allocation.Allocation{ - ID: alloc.ID, + ID: alloc.Id, Tx: alloc.Tx, TotalSize: alloc.TotalSize, UsedSize: alloc.UsedSize, - OwnerID: alloc.OwnerID, + OwnerID: alloc.OwnerId, OwnerPublicKey: alloc.OwnerPublicKey, Expiration: common.Timestamp(alloc.Expiration), AllocationRoot: alloc.AllocationRoot, BlobberSize: alloc.BlobberSize, BlobberSizeUsed: alloc.BlobberSizeUsed, - LatestRedeemedWM: alloc.LatestRedeemedWM, + LatestRedeemedWM: alloc.LatestRedeemedWm, IsRedeemRequired: alloc.IsRedeemRequired, TimeUnit: time.Duration(alloc.TimeUnit), CleanedUp: alloc.CleanedUp, Finalized: alloc.Finalized, Terms: terms, - PayerID: alloc.PayerID, + PayerID: alloc.PayerId, } } @@ -97,8 +98,8 @@ func FileStatsToFileStatsGRPC(fileStats *stats.FileStats) *blobbergrpc.FileStats } return &blobbergrpc.FileStats{ - ID: fileStats.ID, - RefID: fileStats.RefID, + Id: fileStats.ID, + RefId: fileStats.RefID, NumUpdates: fileStats.NumUpdates, NumBlockDownloads: fileStats.NumBlockDownloads, SuccessChallenges: fileStats.SuccessChallenges, @@ -118,11 +119,11 @@ func WriteMarkerToWriteMarkerGRPC(wm *writemarker.WriteMarker) *blobbergrpc.Writ return &blobbergrpc.WriteMarker{ AllocationRoot: wm.AllocationRoot, PreviousAllocationRoot: wm.PreviousAllocationRoot, - AllocationID: wm.AllocationID, + AllocationId: wm.AllocationID, Size: wm.Size, - BlobberID: wm.BlobberID, + BlobberId: wm.BlobberID, Timestamp: int64(wm.Timestamp), - ClientID: wm.ClientID, + ClientId: wm.ClientID, Signature: wm.Signature, } } @@ -135,11 +136,11 @@ func WriteMarkerGRPCToWriteMarker(wm *blobbergrpc.WriteMarker) *writemarker.Writ return &writemarker.WriteMarker{ AllocationRoot: wm.AllocationRoot, PreviousAllocationRoot: wm.PreviousAllocationRoot, - AllocationID: wm.AllocationID, + AllocationID: wm.AllocationId, Size: wm.Size, - BlobberID: wm.BlobberID, + BlobberID: wm.BlobberId, Timestamp: common.Timestamp(wm.Timestamp), - ClientID: wm.ClientID, + ClientID: wm.ClientId, Signature: wm.Signature, } } @@ -190,8 +191,8 @@ func FileStatsGRPCToFileStats(fileStats *blobbergrpc.FileStats) *stats.FileStats } return &stats.FileStats{ - ID: fileStats.ID, - RefID: fileStats.RefID, + ID: fileStats.Id, + RefID: fileStats.RefId, NumUpdates: fileStats.NumUpdates, NumBlockDownloads: fileStats.NumBlockDownloads, SuccessChallenges: fileStats.SuccessChallenges, diff --git a/code/go/0chain.net/blobbercore/convert/responseHandler.go b/code/go/0chain.net/blobbercore/convert/responseHandler.go index 602a21dbb..951fbdb0b 100644 --- a/code/go/0chain.net/blobbercore/convert/responseHandler.go +++ b/code/go/0chain.net/blobbercore/convert/responseHandler.go @@ -84,7 +84,7 @@ func GetReferencePathResponseCreator(r interface{}) *blobbergrpc.GetReferencePat var resp blobbergrpc.GetReferencePathResponse var recursionCount int - resp.LatestWM = WriteMarkerToWriteMarkerGRPC(httpResp.LatestWM) + resp.LatestWm = WriteMarkerToWriteMarkerGRPC(httpResp.LatestWM) resp.ReferencePath = ReferencePathToReferencePathGRPC(&recursionCount, httpResp.ReferencePath) return &resp } @@ -98,7 +98,7 @@ func GetObjectTreeResponseCreator(r interface{}) *blobbergrpc.GetObjectTreeRespo var resp blobbergrpc.GetObjectTreeResponse var recursionCount int - resp.LatestWM = WriteMarkerToWriteMarkerGRPC(httpResp.LatestWM) + resp.LatestWm = WriteMarkerToWriteMarkerGRPC(httpResp.LatestWM) resp.ReferencePath = ReferencePathToReferencePathGRPC(&recursionCount, httpResp.ReferencePath) return &resp } @@ -255,7 +255,7 @@ func GetReferencePathResponseHandler(getReferencePathResponse *blobbergrpc.GetRe var recursionCount int return &blobberhttp.ReferencePathResult{ ReferencePath: ReferencePathGRPCToReferencePath(&recursionCount, getReferencePathResponse.ReferencePath), - LatestWM: WriteMarkerGRPCToWriteMarker(getReferencePathResponse.LatestWM), + LatestWM: WriteMarkerGRPCToWriteMarker(getReferencePathResponse.LatestWm), } } @@ -283,7 +283,7 @@ func GetObjectTreeResponseHandler(getObjectTreeResponse *blobbergrpc.GetObjectTr var recursionCount int return &blobberhttp.ReferencePathResult{ ReferencePath: ReferencePathGRPCToReferencePath(&recursionCount, getObjectTreeResponse.ReferencePath), - LatestWM: WriteMarkerGRPCToWriteMarker(getObjectTreeResponse.LatestWM), + LatestWM: WriteMarkerGRPCToWriteMarker(getObjectTreeResponse.LatestWm), } } diff --git a/code/go/0chain.net/blobbercore/openapi/blobber.swagger.json b/code/go/0chain.net/blobbercore/openapi/blobber.swagger.json index e144b150c..782dac581 100644 --- a/code/go/0chain.net/blobbercore/openapi/blobber.swagger.json +++ b/code/go/0chain.net/blobbercore/openapi/blobber.swagger.json @@ -423,13 +423,13 @@ "type": "string" }, { - "name": "Path", + "name": "path", "in": "query", "required": false, "type": "string" }, { - "name": "BlockNum", + "name": "blockNum", "in": "query", "required": false, "type": "string" @@ -501,13 +501,13 @@ "type": "string" }, { - "name": "Paths", + "name": "paths", "in": "query", "required": false, "type": "string" }, { - "name": "Path", + "name": "path", "in": "query", "required": false, "type": "string" @@ -739,64 +739,64 @@ "v1Allocation": { "type": "object", "properties": { - "ID": { + "id": { "type": "string" }, - "Tx": { + "tx": { "type": "string" }, - "TotalSize": { + "totalSize": { "type": "string", "format": "int64" }, - "UsedSize": { + "usedSize": { "type": "string", "format": "int64" }, - "OwnerID": { + "ownerId": { "type": "string" }, - "OwnerPublicKey": { + "ownerPublicKey": { "type": "string" }, - "RepairerID": { + "repairerId": { "type": "string" }, - "PayerID": { + "payerId": { "type": "string" }, - "Expiration": { + "expiration": { "type": "string", "format": "int64" }, - "AllocationRoot": { + "allocationRoot": { "type": "string" }, - "BlobberSize": { + "blobberSize": { "type": "string", "format": "int64" }, - "BlobberSizeUsed": { + "blobberSizeUsed": { "type": "string", "format": "int64" }, - "LatestRedeemedWM": { + "latestRedeemedWm": { "type": "string" }, - "IsRedeemRequired": { + "isRedeemRequired": { "type": "boolean" }, - "TimeUnit": { + "timeUnit": { "type": "string", "format": "int64" }, - "CleanedUp": { + "cleanedUp": { "type": "boolean" }, - "Finalized": { + "finalized": { "type": "boolean" }, - "Terms": { + "terms": { "type": "array", "items": { "$ref": "#/definitions/v1Term" @@ -829,14 +829,14 @@ "v1Collaborator": { "type": "object", "properties": { - "RefId": { + "refId": { "type": "string", "format": "int64" }, - "ClientId": { + "clientId": { "type": "string" }, - "CreatedAt": { + "createdAt": { "type": "string", "format": "int64" } @@ -868,7 +868,7 @@ "message": { "type": "string" }, - "Collaborators": { + "collaborators": { "type": "array", "items": { "$ref": "#/definitions/v1Collaborator" @@ -879,14 +879,14 @@ "v1CommitMetaTxn": { "type": "object", "properties": { - "RefId": { + "refId": { "type": "string", "format": "int64" }, - "TxnId": { + "txnId": { "type": "string" }, - "CreatedAt": { + "createdAt": { "type": "string", "format": "int64" } @@ -1002,37 +1002,37 @@ "v1DirMetaData": { "type": "object", "properties": { - "Type": { + "type": { "type": "string" }, - "LookupHash": { + "lookupHash": { "type": "string" }, - "Name": { + "name": { "type": "string" }, - "Path": { + "path": { "type": "string" }, - "Hash": { + "hash": { "type": "string" }, - "NumBlocks": { + "numBlocks": { "type": "string", "format": "int64" }, - "PathHash": { + "pathHash": { "type": "string" }, - "Size": { + "size": { "type": "string", "format": "int64" }, - "CreatedAt": { + "createdAt": { "type": "string", "format": "int64" }, - "UpdatedAt": { + "updatedAt": { "type": "string", "format": "int64" } @@ -1094,86 +1094,86 @@ "v1FileMetaData": { "type": "object", "properties": { - "Type": { + "type": { "type": "string" }, - "LookupHash": { + "lookupHash": { "type": "string" }, - "Name": { + "name": { "type": "string" }, - "Path": { + "path": { "type": "string" }, - "Hash": { + "hash": { "type": "string" }, - "NumBlocks": { + "numBlocks": { "type": "string", "format": "int64" }, - "PathHash": { + "pathHash": { "type": "string" }, - "CustomMeta": { + "customMeta": { "type": "string" }, - "ContentHash": { + "contentHash": { "type": "string" }, - "Size": { + "size": { "type": "string", "format": "int64" }, - "MerkleRoot": { + "merkleRoot": { "type": "string" }, - "ActualFileSize": { + "actualFileSize": { "type": "string", "format": "int64" }, - "ActualFileHash": { + "actualFileHash": { "type": "string" }, - "MimeType": { + "mimeType": { "type": "string" }, - "ThumbnailSize": { + "thumbnailSize": { "type": "string", "format": "int64" }, - "ThumbnailHash": { + "thumbnailHash": { "type": "string" }, - "ActualThumbnailSize": { + "actualThumbnailSize": { "type": "string", "format": "int64" }, - "ActualThumbnailHash": { + "actualThumbnailHash": { "type": "string" }, - "EncryptedKey": { + "encryptedKey": { "type": "string" }, - "Attributes": { + "attributes": { "type": "string", "format": "byte" }, - "OnCloud": { + "onCloud": { "type": "boolean" }, - "CommitMetaTxns": { + "commitMetaTxns": { "type": "array", "items": { "$ref": "#/definitions/v1CommitMetaTxn" } }, - "CreatedAt": { + "createdAt": { "type": "string", "format": "int64" }, - "UpdatedAt": { + "updatedAt": { "type": "string", "format": "int64" } @@ -1182,13 +1182,13 @@ "v1FileRef": { "type": "object", "properties": { - "Type": { + "type": { "type": "string" }, - "FileMetaData": { + "fileMetaData": { "$ref": "#/definitions/v1FileMetaData" }, - "DirMetaData": { + "dirMetaData": { "$ref": "#/definitions/v1DirMetaData" } } @@ -1196,41 +1196,41 @@ "v1FileStats": { "type": "object", "properties": { - "ID": { + "id": { "type": "string", "format": "int64" }, - "RefID": { + "refId": { "type": "string", "format": "int64" }, - "NumUpdates": { + "numUpdates": { "type": "string", "format": "int64" }, - "NumBlockDownloads": { + "numBlockDownloads": { "type": "string", "format": "int64" }, - "SuccessChallenges": { + "successChallenges": { "type": "string", "format": "int64" }, - "FailedChallenges": { + "failedChallenges": { "type": "string", "format": "int64" }, - "LastChallengeResponseTxn": { + "lastChallengeResponseTxn": { "type": "string" }, - "WriteMarkerRedeemTxn": { + "writeMarkerRedeemTxn": { "type": "string" }, - "CreatedAt": { + "createdAt": { "type": "string", "format": "int64" }, - "UpdatedAt": { + "updatedAt": { "type": "string", "format": "int64" } @@ -1264,10 +1264,10 @@ "v1GetFileMetaDataResponse": { "type": "object", "properties": { - "MetaData": { + "metaData": { "$ref": "#/definitions/v1FileRef" }, - "Collaborators": { + "collaborators": { "type": "array", "items": { "$ref": "#/definitions/v1Collaborator" @@ -1292,10 +1292,10 @@ "v1GetFileStatsResponse": { "type": "object", "properties": { - "MetaData": { + "metaData": { "$ref": "#/definitions/v1FileRef" }, - "Stats": { + "stats": { "$ref": "#/definitions/v1FileStats" } } @@ -1303,10 +1303,10 @@ "v1GetObjectPathResponse": { "type": "object", "properties": { - "ObjectPath": { + "objectPath": { "$ref": "#/definitions/v1ObjectPath" }, - "LatestWriteMarker": { + "latestWriteMarker": { "$ref": "#/definitions/v1WriteMarker" } } @@ -1314,10 +1314,10 @@ "v1GetObjectTreeResponse": { "type": "object", "properties": { - "ReferencePath": { + "referencePath": { "$ref": "#/definitions/v1ReferencePath" }, - "LatestWM": { + "latestWm": { "$ref": "#/definitions/v1WriteMarker" } } @@ -1325,10 +1325,10 @@ "v1GetReferencePathResponse": { "type": "object", "properties": { - "ReferencePath": { + "referencePath": { "$ref": "#/definitions/v1ReferencePath" }, - "LatestWM": { + "latestWm": { "$ref": "#/definitions/v1WriteMarker" } } @@ -1336,13 +1336,13 @@ "v1ListEntitiesResponse": { "type": "object", "properties": { - "AllocationRoot": { + "allocationRoot": { "type": "string" }, - "MetaData": { + "metaData": { "$ref": "#/definitions/v1FileRef" }, - "Entities": { + "entities": { "type": "array", "items": { "$ref": "#/definitions/v1FileRef" @@ -1353,22 +1353,22 @@ "v1ObjectPath": { "type": "object", "properties": { - "RootHash": { + "rootHash": { "type": "string" }, - "Meta": { + "meta": { "$ref": "#/definitions/v1FileRef" }, - "Path": { + "path": { "$ref": "#/definitions/v1FileRef" }, - "PathList": { + "pathList": { "type": "array", "items": { "$ref": "#/definitions/v1FileRef" } }, - "FileBlockNum": { + "fileBlockNum": { "type": "string", "format": "int64" } @@ -1419,10 +1419,10 @@ "v1ReferencePath": { "type": "object", "properties": { - "MetaData": { + "metaData": { "$ref": "#/definitions/v1FileRef" }, - "List": { + "list": { "type": "array", "items": { "$ref": "#/definitions/v1ReferencePath" @@ -1481,21 +1481,21 @@ "v1Term": { "type": "object", "properties": { - "ID": { + "id": { "type": "string", "format": "int64" }, - "BlobberID": { + "blobberId": { "type": "string" }, - "AllocationID": { + "allocationId": { "type": "string" }, - "ReadPrice": { + "readPrice": { "type": "string", "format": "int64" }, - "WritePrice": { + "writePrice": { "type": "string", "format": "int64" } @@ -1592,30 +1592,30 @@ "v1WriteMarker": { "type": "object", "properties": { - "AllocationRoot": { + "allocationRoot": { "type": "string" }, - "PreviousAllocationRoot": { + "previousAllocationRoot": { "type": "string" }, - "AllocationID": { + "allocationId": { "type": "string" }, - "Size": { + "size": { "type": "string", "format": "int64" }, - "BlobberID": { + "blobberId": { "type": "string" }, - "Timestamp": { + "timestamp": { "type": "string", "format": "int64" }, - "ClientID": { + "clientId": { "type": "string" }, - "Signature": { + "signature": { "type": "string" } } From 70cb70a37d1ac00963c8a39596ba69d18a219570 Mon Sep 17 00:00:00 2001 From: Shravan Shetty Date: Wed, 7 Jul 2021 17:59:26 +0530 Subject: [PATCH 8/9] :art: created new file for response creator functions --- ...responseHandler.go => response_creator.go} | 155 +---------------- .../blobbercore/convert/response_handler.go | 162 ++++++++++++++++++ 2 files changed, 163 insertions(+), 154 deletions(-) rename code/go/0chain.net/blobbercore/convert/{responseHandler.go => response_creator.go} (58%) create mode 100644 code/go/0chain.net/blobbercore/convert/response_handler.go diff --git a/code/go/0chain.net/blobbercore/convert/responseHandler.go b/code/go/0chain.net/blobbercore/convert/response_creator.go similarity index 58% rename from code/go/0chain.net/blobbercore/convert/responseHandler.go rename to code/go/0chain.net/blobbercore/convert/response_creator.go index 951fbdb0b..74e98f320 100644 --- a/code/go/0chain.net/blobbercore/convert/responseHandler.go +++ b/code/go/0chain.net/blobbercore/convert/response_creator.go @@ -1,17 +1,13 @@ package convert import ( - "context" "encoding/json" - "github.com/0chain/blobber/code/go/0chain.net/core/common" - - stats2 "github.com/0chain/blobber/code/go/0chain.net/blobbercore/stats" - "github.com/0chain/blobber/code/go/0chain.net/blobbercore/allocation" "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobberhttp" "github.com/0chain/blobber/code/go/0chain.net/blobbercore/reference" + stats2 "github.com/0chain/blobber/code/go/0chain.net/blobbercore/stats" ) func GetAllocationResponseCreator(resp interface{}) *blobbergrpc.GetAllocationResponse { @@ -207,155 +203,6 @@ func CopyObjectResponseCreator(r interface{}) *blobbergrpc.CopyObjectResponse { } } -func GetAllocationResponseHandler(resp *blobbergrpc.GetAllocationResponse) *allocation.Allocation { - return GRPCAllocationToAllocation(resp.Allocation) -} - -func GetFileMetaDataResponseHandler(resp *blobbergrpc.GetFileMetaDataResponse) map[string]interface{} { - var collaborators []reference.Collaborator - for _, c := range resp.Collaborators { - collaborators = append(collaborators, *GRPCCollaboratorToCollaborator(c)) - } - - result := FileRefGRPCToFileRef(resp.MetaData).GetListingData(context.Background()) - result["collaborators"] = collaborators - return result -} - -func GetFileStatsResponseHandler(resp *blobbergrpc.GetFileStatsResponse) map[string]interface{} { - ctx := context.Background() - result := FileRefGRPCToFileRef(resp.MetaData).GetListingData(ctx) - - statsMap := make(map[string]interface{}) - statsBytes, _ := json.Marshal(FileStatsGRPCToFileStats(resp.Stats)) - _ = json.Unmarshal(statsBytes, &statsMap) - - for k, v := range statsMap { - result[k] = v - } - - return result -} - -func ListEntitesResponseHandler(resp *blobbergrpc.ListEntitiesResponse) *blobberhttp.ListResult { - ctx := context.Background() - var entities []map[string]interface{} - for i := range resp.Entities { - entities = append(entities, FileRefGRPCToFileRef(resp.Entities[i]).GetListingData(ctx)) - } - - return &blobberhttp.ListResult{ - AllocationRoot: resp.AllocationRoot, - Meta: FileRefGRPCToFileRef(resp.MetaData).GetListingData(ctx), - Entities: entities, - } -} - -func GetReferencePathResponseHandler(getReferencePathResponse *blobbergrpc.GetReferencePathResponse) *blobberhttp.ReferencePathResult { - var recursionCount int - return &blobberhttp.ReferencePathResult{ - ReferencePath: ReferencePathGRPCToReferencePath(&recursionCount, getReferencePathResponse.ReferencePath), - LatestWM: WriteMarkerGRPCToWriteMarker(getReferencePathResponse.LatestWm), - } -} - -func GetObjectPathResponseHandler(getObjectPathResponse *blobbergrpc.GetObjectPathResponse) *blobberhttp.ObjectPathResult { - ctx := context.Background() - path := FileRefGRPCToFileRef(getObjectPathResponse.ObjectPath.Path).GetListingData(ctx) - var pathList []map[string]interface{} - for _, pl := range getObjectPathResponse.ObjectPath.PathList { - pathList = append(pathList, FileRefGRPCToFileRef(pl).GetListingData(ctx)) - } - path["list"] = pathList - - return &blobberhttp.ObjectPathResult{ - ObjectPath: &reference.ObjectPath{ - RootHash: getObjectPathResponse.ObjectPath.RootHash, - Meta: FileRefGRPCToFileRef(getObjectPathResponse.ObjectPath.Meta).GetListingData(ctx), - Path: path, - FileBlockNum: getObjectPathResponse.ObjectPath.FileBlockNum, - }, - LatestWM: WriteMarkerGRPCToWriteMarker(getObjectPathResponse.LatestWriteMarker), - } -} - -func GetObjectTreeResponseHandler(getObjectTreeResponse *blobbergrpc.GetObjectTreeResponse) *blobberhttp.ReferencePathResult { - var recursionCount int - return &blobberhttp.ReferencePathResult{ - ReferencePath: ReferencePathGRPCToReferencePath(&recursionCount, getObjectTreeResponse.ReferencePath), - LatestWM: WriteMarkerGRPCToWriteMarker(getObjectTreeResponse.LatestWm), - } -} - -func CommitWriteResponseHandler(resp *blobbergrpc.CommitResponse) *blobberhttp.CommitResult { - return &blobberhttp.CommitResult{ - AllocationRoot: resp.AllocationRoot, - WriteMarker: WriteMarkerGRPCToWriteMarker(resp.WriteMarker), - Success: resp.Success, - ErrorMessage: resp.ErrorMessage, - } -} - -func GetCalculateHashResponseHandler(response *blobbergrpc.CalculateHashResponse) interface{} { - result := make(map[string]interface{}) - if msg := response.GetMessage(); msg != "" { - result["msg"] = msg - } - - return result -} - -func GetCommitMetaTxnHandlerResponse(response *blobbergrpc.CommitMetaTxnResponse) interface{} { - msg := response.GetMessage() - if msg == "" { - return nil - } - - result := struct { - Msg string `json:"msg"` - }{ - Msg: msg, - } - - return result -} - -func CollaboratorResponse(response *blobbergrpc.CollaboratorResponse) interface{} { - if msg := response.GetMessage(); msg != "" { - return struct { - Msg string `json:"msg"` - }{Msg: msg} - } - - if collaborators := response.GetCollaborators(); collaborators != nil { - collabs := make([]reference.Collaborator, 0, len(collaborators)) - for _, c := range collaborators { - collabs = append(collabs, *GRPCCollaboratorToCollaborator(c)) - } - - return collabs - } - - return nil -} - -func UpdateObjectAttributesResponseHandler(updateAttributesResponse *blobbergrpc.UpdateObjectAttributesResponse) *blobberhttp.UpdateObjectAttributesResponse { - return &blobberhttp.UpdateObjectAttributesResponse{ - WhoPaysForReads: common.WhoPays(updateAttributesResponse.WhoPaysForReads), - } -} - -func CopyObjectResponseHandler(copyObjectResponse *blobbergrpc.CopyObjectResponse) *blobberhttp.UploadResult { - return &blobberhttp.UploadResult{ - Filename: copyObjectResponse.Filename, - Size: copyObjectResponse.Size, - Hash: copyObjectResponse.ContentHash, - MerkleRoot: copyObjectResponse.MerkleRoot, - UploadLength: copyObjectResponse.UploadLength, - UploadOffset: copyObjectResponse.UploadOffset, - } -} - func RenameObjectResponseCreator(r interface{}) *blobbergrpc.RenameObjectResponse { if r == nil { return nil diff --git a/code/go/0chain.net/blobbercore/convert/response_handler.go b/code/go/0chain.net/blobbercore/convert/response_handler.go new file mode 100644 index 000000000..88f5f3b8f --- /dev/null +++ b/code/go/0chain.net/blobbercore/convert/response_handler.go @@ -0,0 +1,162 @@ +package convert + +import ( + "context" + "encoding/json" + + "github.com/0chain/blobber/code/go/0chain.net/core/common" + + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/allocation" + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobbergrpc" + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/blobberhttp" + "github.com/0chain/blobber/code/go/0chain.net/blobbercore/reference" +) + +func GetAllocationResponseHandler(resp *blobbergrpc.GetAllocationResponse) *allocation.Allocation { + return GRPCAllocationToAllocation(resp.Allocation) +} + +func GetFileMetaDataResponseHandler(resp *blobbergrpc.GetFileMetaDataResponse) map[string]interface{} { + var collaborators []reference.Collaborator + for _, c := range resp.Collaborators { + collaborators = append(collaborators, *GRPCCollaboratorToCollaborator(c)) + } + + result := FileRefGRPCToFileRef(resp.MetaData).GetListingData(context.Background()) + result["collaborators"] = collaborators + return result +} + +func GetFileStatsResponseHandler(resp *blobbergrpc.GetFileStatsResponse) map[string]interface{} { + ctx := context.Background() + result := FileRefGRPCToFileRef(resp.MetaData).GetListingData(ctx) + + statsMap := make(map[string]interface{}) + statsBytes, _ := json.Marshal(FileStatsGRPCToFileStats(resp.Stats)) + _ = json.Unmarshal(statsBytes, &statsMap) + + for k, v := range statsMap { + result[k] = v + } + + return result +} + +func ListEntitesResponseHandler(resp *blobbergrpc.ListEntitiesResponse) *blobberhttp.ListResult { + ctx := context.Background() + var entities []map[string]interface{} + for i := range resp.Entities { + entities = append(entities, FileRefGRPCToFileRef(resp.Entities[i]).GetListingData(ctx)) + } + + return &blobberhttp.ListResult{ + AllocationRoot: resp.AllocationRoot, + Meta: FileRefGRPCToFileRef(resp.MetaData).GetListingData(ctx), + Entities: entities, + } +} + +func GetReferencePathResponseHandler(getReferencePathResponse *blobbergrpc.GetReferencePathResponse) *blobberhttp.ReferencePathResult { + var recursionCount int + return &blobberhttp.ReferencePathResult{ + ReferencePath: ReferencePathGRPCToReferencePath(&recursionCount, getReferencePathResponse.ReferencePath), + LatestWM: WriteMarkerGRPCToWriteMarker(getReferencePathResponse.LatestWm), + } +} + +func GetObjectPathResponseHandler(getObjectPathResponse *blobbergrpc.GetObjectPathResponse) *blobberhttp.ObjectPathResult { + ctx := context.Background() + path := FileRefGRPCToFileRef(getObjectPathResponse.ObjectPath.Path).GetListingData(ctx) + var pathList []map[string]interface{} + for _, pl := range getObjectPathResponse.ObjectPath.PathList { + pathList = append(pathList, FileRefGRPCToFileRef(pl).GetListingData(ctx)) + } + path["list"] = pathList + + return &blobberhttp.ObjectPathResult{ + ObjectPath: &reference.ObjectPath{ + RootHash: getObjectPathResponse.ObjectPath.RootHash, + Meta: FileRefGRPCToFileRef(getObjectPathResponse.ObjectPath.Meta).GetListingData(ctx), + Path: path, + FileBlockNum: getObjectPathResponse.ObjectPath.FileBlockNum, + }, + LatestWM: WriteMarkerGRPCToWriteMarker(getObjectPathResponse.LatestWriteMarker), + } +} + +func GetObjectTreeResponseHandler(getObjectTreeResponse *blobbergrpc.GetObjectTreeResponse) *blobberhttp.ReferencePathResult { + var recursionCount int + return &blobberhttp.ReferencePathResult{ + ReferencePath: ReferencePathGRPCToReferencePath(&recursionCount, getObjectTreeResponse.ReferencePath), + LatestWM: WriteMarkerGRPCToWriteMarker(getObjectTreeResponse.LatestWm), + } +} + +func CommitWriteResponseHandler(resp *blobbergrpc.CommitResponse) *blobberhttp.CommitResult { + return &blobberhttp.CommitResult{ + AllocationRoot: resp.AllocationRoot, + WriteMarker: WriteMarkerGRPCToWriteMarker(resp.WriteMarker), + Success: resp.Success, + ErrorMessage: resp.ErrorMessage, + } +} + +func GetCalculateHashResponseHandler(response *blobbergrpc.CalculateHashResponse) interface{} { + result := make(map[string]interface{}) + if msg := response.GetMessage(); msg != "" { + result["msg"] = msg + } + + return result +} + +func GetCommitMetaTxnHandlerResponse(response *blobbergrpc.CommitMetaTxnResponse) interface{} { + msg := response.GetMessage() + if msg == "" { + return nil + } + + result := struct { + Msg string `json:"msg"` + }{ + Msg: msg, + } + + return result +} + +func CollaboratorResponse(response *blobbergrpc.CollaboratorResponse) interface{} { + if msg := response.GetMessage(); msg != "" { + return struct { + Msg string `json:"msg"` + }{Msg: msg} + } + + if collaborators := response.GetCollaborators(); collaborators != nil { + collabs := make([]reference.Collaborator, 0, len(collaborators)) + for _, c := range collaborators { + collabs = append(collabs, *GRPCCollaboratorToCollaborator(c)) + } + + return collabs + } + + return nil +} + +func UpdateObjectAttributesResponseHandler(updateAttributesResponse *blobbergrpc.UpdateObjectAttributesResponse) *blobberhttp.UpdateObjectAttributesResponse { + return &blobberhttp.UpdateObjectAttributesResponse{ + WhoPaysForReads: common.WhoPays(updateAttributesResponse.WhoPaysForReads), + } +} + +func CopyObjectResponseHandler(copyObjectResponse *blobbergrpc.CopyObjectResponse) *blobberhttp.UploadResult { + return &blobberhttp.UploadResult{ + Filename: copyObjectResponse.Filename, + Size: copyObjectResponse.Size, + Hash: copyObjectResponse.ContentHash, + MerkleRoot: copyObjectResponse.MerkleRoot, + UploadLength: copyObjectResponse.UploadLength, + UploadOffset: copyObjectResponse.UploadOffset, + } +} From 09fdce5e792ad18f65eaa4c2ee0161922bfd8a05 Mon Sep 17 00:00:00 2001 From: Shravan Shetty Date: Wed, 7 Jul 2021 18:03:53 +0530 Subject: [PATCH 9/9] fix lint errors --- .../0chain.net/blobbercore/handler/commit_integration_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/go/0chain.net/blobbercore/handler/commit_integration_test.go b/code/go/0chain.net/blobbercore/handler/commit_integration_test.go index e782d8097..36d840f5b 100644 --- a/code/go/0chain.net/blobbercore/handler/commit_integration_test.go +++ b/code/go/0chain.net/blobbercore/handler/commit_integration_test.go @@ -126,7 +126,7 @@ func TestBlobberGRPCService_Commit(t *testing.T) { t.Fatal("expected error") } - if getCommiteResp.WriteMarker.AllocationID != tc.expectedAllocation { + if getCommiteResp.WriteMarker.AllocationId != tc.expectedAllocation { t.Fatal("unexpected root name from GetObject") } }