diff --git a/bchrpc/bchrpc.proto b/bchrpc/bchrpc.proto index 3a7e5aa06..ebd059288 100644 --- a/bchrpc/bchrpc.proto +++ b/bchrpc/bchrpc.proto @@ -99,6 +99,11 @@ service bchrpc { // **Requires SlpIndex** rpc GetSlpTrustedValidation(GetSlpTrustedValidationRequest) returns (GetSlpTrustedValidationResponse) {} + // GraphSearch returns all the transactions needed for a client to validate an SLP graph + // + // **Requires SlpIndex and SlpGraphSearch** + rpc GetSlpGraphSearch (GetSlpGraphSearchRequest) returns (GetSlpGraphSearchResponse) {} + // CheckSlpTransaction checks the validity of a supposed slp transaction before it is broadcasted. rpc CheckSlpTransaction(CheckSlpTransactionRequest) returns (CheckSlpTransactionResponse) {} @@ -202,6 +207,8 @@ message GetBlockchainInfoResponse { // be used with slp related rpc methods and also causes slp metadata to be added // in some of the existing rpc methods. bool slp_index = 8; + // When `slp_graphsearch` is true, the node is able to handle calls to slp graph search + bool slp_graphsearch = 9; } message GetBlockInfoRequest { @@ -569,8 +576,10 @@ message GetSlpTrustedValidationRequest { message Query { bytes prev_out_hash = 1; uint32 prev_out_vout = 2; + repeated bytes graphsearch_valid_hashes = 3; } repeated Query queries = 1; + bool include_graphsearch_count = 2; } message GetSlpTrustedValidationResponse { @@ -585,11 +594,21 @@ message GetSlpTrustedValidationResponse { bool v1_mint_baton = 7; } bytes slp_txn_opreturn = 8; + uint32 graphsearch_txn_count = 9; } repeated ValidityResult results = 1; } +message GetSlpGraphSearchRequest { + bytes hash = 1; + repeated bytes valid_hashes = 2; +} + +message GetSlpGraphSearchResponse { + repeated bytes txdata = 1; +} + // NOTIFICATIONS message BlockNotification { diff --git a/bchrpc/pb/bchrpc.pb.go b/bchrpc/pb/bchrpc.pb.go index c52f58f2b..ea723bd7e 100644 --- a/bchrpc/pb/bchrpc.pb.go +++ b/bchrpc/pb/bchrpc.pb.go @@ -264,7 +264,7 @@ func (x BlockNotification_Type) Number() protoreflect.EnumNumber { // Deprecated: Use BlockNotification_Type.Descriptor instead. func (BlockNotification_Type) EnumDescriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{42, 0} + return file_bchrpc_proto_rawDescGZIP(), []int{44, 0} } // State of the transaction acceptance. @@ -313,7 +313,7 @@ func (x TransactionNotification_Type) Number() protoreflect.EnumNumber { // Deprecated: Use TransactionNotification_Type.Descriptor instead. func (TransactionNotification_Type) EnumDescriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{43, 0} + return file_bchrpc_proto_rawDescGZIP(), []int{45, 0} } type SlpTransactionInfo_ValidityJudgement int32 @@ -359,7 +359,7 @@ func (x SlpTransactionInfo_ValidityJudgement) Number() protoreflect.EnumNumber { // Deprecated: Use SlpTransactionInfo_ValidityJudgement.Descriptor instead. func (SlpTransactionInfo_ValidityJudgement) EnumDescriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{51, 0} + return file_bchrpc_proto_rawDescGZIP(), []int{53, 0} } type SlpTransactionInfo_BurnFlags int32 @@ -414,7 +414,7 @@ func (x SlpTransactionInfo_BurnFlags) Number() protoreflect.EnumNumber { // Deprecated: Use SlpTransactionInfo_BurnFlags.Descriptor instead. func (SlpTransactionInfo_BurnFlags) EnumDescriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{51, 1} + return file_bchrpc_proto_rawDescGZIP(), []int{53, 1} } type GetMempoolInfoRequest struct { @@ -671,6 +671,8 @@ type GetBlockchainInfoResponse struct { // be used with slp related rpc methods and also causes slp metadata to be added // in some of the existing rpc methods. SlpIndex bool `protobuf:"varint,8,opt,name=slp_index,json=slpIndex,proto3" json:"slp_index,omitempty"` + // When `slp_graphsearch` is true, the node is able to handle calls to slp graph search + SlpGraphsearch bool `protobuf:"varint,9,opt,name=slp_graphsearch,json=slpGraphsearch,proto3" json:"slp_graphsearch,omitempty"` } func (x *GetBlockchainInfoResponse) Reset() { @@ -761,6 +763,13 @@ func (x *GetBlockchainInfoResponse) GetSlpIndex() bool { return false } +func (x *GetBlockchainInfoResponse) GetSlpGraphsearch() bool { + if x != nil { + return x.SlpGraphsearch + } + return false +} + type GetBlockInfoRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3130,7 +3139,8 @@ type GetSlpTrustedValidationRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Queries []*GetSlpTrustedValidationRequest_Query `protobuf:"bytes,1,rep,name=queries,proto3" json:"queries,omitempty"` + Queries []*GetSlpTrustedValidationRequest_Query `protobuf:"bytes,1,rep,name=queries,proto3" json:"queries,omitempty"` + IncludeGraphsearchCount bool `protobuf:"varint,2,opt,name=include_graphsearch_count,json=includeGraphsearchCount,proto3" json:"include_graphsearch_count,omitempty"` } func (x *GetSlpTrustedValidationRequest) Reset() { @@ -3172,6 +3182,13 @@ func (x *GetSlpTrustedValidationRequest) GetQueries() []*GetSlpTrustedValidation return nil } +func (x *GetSlpTrustedValidationRequest) GetIncludeGraphsearchCount() bool { + if x != nil { + return x.IncludeGraphsearchCount + } + return false +} + type GetSlpTrustedValidationResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3219,6 +3236,108 @@ func (x *GetSlpTrustedValidationResponse) GetResults() []*GetSlpTrustedValidatio return nil } +type GetSlpGraphSearchRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` + ValidHashes [][]byte `protobuf:"bytes,2,rep,name=valid_hashes,json=validHashes,proto3" json:"valid_hashes,omitempty"` +} + +func (x *GetSlpGraphSearchRequest) Reset() { + *x = GetSlpGraphSearchRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_bchrpc_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSlpGraphSearchRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSlpGraphSearchRequest) ProtoMessage() {} + +func (x *GetSlpGraphSearchRequest) ProtoReflect() protoreflect.Message { + mi := &file_bchrpc_proto_msgTypes[42] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSlpGraphSearchRequest.ProtoReflect.Descriptor instead. +func (*GetSlpGraphSearchRequest) Descriptor() ([]byte, []int) { + return file_bchrpc_proto_rawDescGZIP(), []int{42} +} + +func (x *GetSlpGraphSearchRequest) GetHash() []byte { + if x != nil { + return x.Hash + } + return nil +} + +func (x *GetSlpGraphSearchRequest) GetValidHashes() [][]byte { + if x != nil { + return x.ValidHashes + } + return nil +} + +type GetSlpGraphSearchResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Txdata [][]byte `protobuf:"bytes,1,rep,name=txdata,proto3" json:"txdata,omitempty"` +} + +func (x *GetSlpGraphSearchResponse) Reset() { + *x = GetSlpGraphSearchResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_bchrpc_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSlpGraphSearchResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSlpGraphSearchResponse) ProtoMessage() {} + +func (x *GetSlpGraphSearchResponse) ProtoReflect() protoreflect.Message { + mi := &file_bchrpc_proto_msgTypes[43] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSlpGraphSearchResponse.ProtoReflect.Descriptor instead. +func (*GetSlpGraphSearchResponse) Descriptor() ([]byte, []int) { + return file_bchrpc_proto_rawDescGZIP(), []int{43} +} + +func (x *GetSlpGraphSearchResponse) GetTxdata() [][]byte { + if x != nil { + return x.Txdata + } + return nil +} + type BlockNotification struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3236,7 +3355,7 @@ type BlockNotification struct { func (x *BlockNotification) Reset() { *x = BlockNotification{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[42] + mi := &file_bchrpc_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3249,7 +3368,7 @@ func (x *BlockNotification) String() string { func (*BlockNotification) ProtoMessage() {} func (x *BlockNotification) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[42] + mi := &file_bchrpc_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3262,7 +3381,7 @@ func (x *BlockNotification) ProtoReflect() protoreflect.Message { // Deprecated: Use BlockNotification.ProtoReflect.Descriptor instead. func (*BlockNotification) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{42} + return file_bchrpc_proto_rawDescGZIP(), []int{44} } func (x *BlockNotification) GetType() BlockNotification_Type { @@ -3342,7 +3461,7 @@ type TransactionNotification struct { func (x *TransactionNotification) Reset() { *x = TransactionNotification{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[43] + mi := &file_bchrpc_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3355,7 +3474,7 @@ func (x *TransactionNotification) String() string { func (*TransactionNotification) ProtoMessage() {} func (x *TransactionNotification) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[43] + mi := &file_bchrpc_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3368,7 +3487,7 @@ func (x *TransactionNotification) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionNotification.ProtoReflect.Descriptor instead. func (*TransactionNotification) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{43} + return file_bchrpc_proto_rawDescGZIP(), []int{45} } func (x *TransactionNotification) GetType() TransactionNotification_Type { @@ -3471,7 +3590,7 @@ type BlockInfo struct { func (x *BlockInfo) Reset() { *x = BlockInfo{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[44] + mi := &file_bchrpc_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3484,7 +3603,7 @@ func (x *BlockInfo) String() string { func (*BlockInfo) ProtoMessage() {} func (x *BlockInfo) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[44] + mi := &file_bchrpc_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3497,7 +3616,7 @@ func (x *BlockInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use BlockInfo.ProtoReflect.Descriptor instead. func (*BlockInfo) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{44} + return file_bchrpc_proto_rawDescGZIP(), []int{46} } func (x *BlockInfo) GetHash() []byte { @@ -3605,7 +3724,7 @@ type Block struct { func (x *Block) Reset() { *x = Block{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[45] + mi := &file_bchrpc_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3618,7 +3737,7 @@ func (x *Block) String() string { func (*Block) ProtoMessage() {} func (x *Block) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[45] + mi := &file_bchrpc_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3631,7 +3750,7 @@ func (x *Block) ProtoReflect() protoreflect.Message { // Deprecated: Use Block.ProtoReflect.Descriptor instead. func (*Block) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{45} + return file_bchrpc_proto_rawDescGZIP(), []int{47} } func (x *Block) GetInfo() *BlockInfo { @@ -3683,7 +3802,7 @@ type Transaction struct { func (x *Transaction) Reset() { *x = Transaction{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[46] + mi := &file_bchrpc_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3696,7 +3815,7 @@ func (x *Transaction) String() string { func (*Transaction) ProtoMessage() {} func (x *Transaction) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[46] + mi := &file_bchrpc_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3709,7 +3828,7 @@ func (x *Transaction) ProtoReflect() protoreflect.Message { // Deprecated: Use Transaction.ProtoReflect.Descriptor instead. func (*Transaction) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{46} + return file_bchrpc_proto_rawDescGZIP(), []int{48} } func (x *Transaction) GetHash() []byte { @@ -3810,7 +3929,7 @@ type MempoolTransaction struct { func (x *MempoolTransaction) Reset() { *x = MempoolTransaction{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[47] + mi := &file_bchrpc_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3823,7 +3942,7 @@ func (x *MempoolTransaction) String() string { func (*MempoolTransaction) ProtoMessage() {} func (x *MempoolTransaction) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[47] + mi := &file_bchrpc_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3836,7 +3955,7 @@ func (x *MempoolTransaction) ProtoReflect() protoreflect.Message { // Deprecated: Use MempoolTransaction.ProtoReflect.Descriptor instead. func (*MempoolTransaction) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{47} + return file_bchrpc_proto_rawDescGZIP(), []int{49} } func (x *MempoolTransaction) GetTransaction() *Transaction { @@ -3903,7 +4022,7 @@ type UnspentOutput struct { func (x *UnspentOutput) Reset() { *x = UnspentOutput{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[48] + mi := &file_bchrpc_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3916,7 +4035,7 @@ func (x *UnspentOutput) String() string { func (*UnspentOutput) ProtoMessage() {} func (x *UnspentOutput) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[48] + mi := &file_bchrpc_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3929,7 +4048,7 @@ func (x *UnspentOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use UnspentOutput.ProtoReflect.Descriptor instead. func (*UnspentOutput) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{48} + return file_bchrpc_proto_rawDescGZIP(), []int{50} } func (x *UnspentOutput) GetOutpoint() *Transaction_Input_Outpoint { @@ -3998,7 +4117,7 @@ type TransactionFilter struct { func (x *TransactionFilter) Reset() { *x = TransactionFilter{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[49] + mi := &file_bchrpc_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4011,7 +4130,7 @@ func (x *TransactionFilter) String() string { func (*TransactionFilter) ProtoMessage() {} func (x *TransactionFilter) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[49] + mi := &file_bchrpc_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4024,7 +4143,7 @@ func (x *TransactionFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionFilter.ProtoReflect.Descriptor instead. func (*TransactionFilter) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{49} + return file_bchrpc_proto_rawDescGZIP(), []int{51} } func (x *TransactionFilter) GetAddresses() []string { @@ -4093,7 +4212,7 @@ type SlpToken struct { func (x *SlpToken) Reset() { *x = SlpToken{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[50] + mi := &file_bchrpc_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4106,7 +4225,7 @@ func (x *SlpToken) String() string { func (*SlpToken) ProtoMessage() {} func (x *SlpToken) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[50] + mi := &file_bchrpc_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4119,7 +4238,7 @@ func (x *SlpToken) ProtoReflect() protoreflect.Message { // Deprecated: Use SlpToken.ProtoReflect.Descriptor instead. func (*SlpToken) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{50} + return file_bchrpc_proto_rawDescGZIP(), []int{52} } func (x *SlpToken) GetTokenId() []byte { @@ -4194,7 +4313,7 @@ type SlpTransactionInfo struct { func (x *SlpTransactionInfo) Reset() { *x = SlpTransactionInfo{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[51] + mi := &file_bchrpc_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4207,7 +4326,7 @@ func (x *SlpTransactionInfo) String() string { func (*SlpTransactionInfo) ProtoMessage() {} func (x *SlpTransactionInfo) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[51] + mi := &file_bchrpc_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4220,7 +4339,7 @@ func (x *SlpTransactionInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use SlpTransactionInfo.ProtoReflect.Descriptor instead. func (*SlpTransactionInfo) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{51} + return file_bchrpc_proto_rawDescGZIP(), []int{53} } func (x *SlpTransactionInfo) GetSlpAction() SlpAction { @@ -4352,7 +4471,7 @@ type SlpV1GenesisMetadata struct { func (x *SlpV1GenesisMetadata) Reset() { *x = SlpV1GenesisMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[52] + mi := &file_bchrpc_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4365,7 +4484,7 @@ func (x *SlpV1GenesisMetadata) String() string { func (*SlpV1GenesisMetadata) ProtoMessage() {} func (x *SlpV1GenesisMetadata) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[52] + mi := &file_bchrpc_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4378,7 +4497,7 @@ func (x *SlpV1GenesisMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use SlpV1GenesisMetadata.ProtoReflect.Descriptor instead. func (*SlpV1GenesisMetadata) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{52} + return file_bchrpc_proto_rawDescGZIP(), []int{54} } func (x *SlpV1GenesisMetadata) GetName() []byte { @@ -4443,7 +4562,7 @@ type SlpV1MintMetadata struct { func (x *SlpV1MintMetadata) Reset() { *x = SlpV1MintMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[53] + mi := &file_bchrpc_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4456,7 +4575,7 @@ func (x *SlpV1MintMetadata) String() string { func (*SlpV1MintMetadata) ProtoMessage() {} func (x *SlpV1MintMetadata) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[53] + mi := &file_bchrpc_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4469,7 +4588,7 @@ func (x *SlpV1MintMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use SlpV1MintMetadata.ProtoReflect.Descriptor instead. func (*SlpV1MintMetadata) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{53} + return file_bchrpc_proto_rawDescGZIP(), []int{55} } func (x *SlpV1MintMetadata) GetMintBatonVout() uint32 { @@ -4498,7 +4617,7 @@ type SlpV1SendMetadata struct { func (x *SlpV1SendMetadata) Reset() { *x = SlpV1SendMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[54] + mi := &file_bchrpc_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4511,7 +4630,7 @@ func (x *SlpV1SendMetadata) String() string { func (*SlpV1SendMetadata) ProtoMessage() {} func (x *SlpV1SendMetadata) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[54] + mi := &file_bchrpc_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4524,7 +4643,7 @@ func (x *SlpV1SendMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use SlpV1SendMetadata.ProtoReflect.Descriptor instead. func (*SlpV1SendMetadata) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{54} + return file_bchrpc_proto_rawDescGZIP(), []int{56} } func (x *SlpV1SendMetadata) GetAmounts() []uint64 { @@ -4551,7 +4670,7 @@ type SlpV1Nft1ChildGenesisMetadata struct { func (x *SlpV1Nft1ChildGenesisMetadata) Reset() { *x = SlpV1Nft1ChildGenesisMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[55] + mi := &file_bchrpc_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4564,7 +4683,7 @@ func (x *SlpV1Nft1ChildGenesisMetadata) String() string { func (*SlpV1Nft1ChildGenesisMetadata) ProtoMessage() {} func (x *SlpV1Nft1ChildGenesisMetadata) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[55] + mi := &file_bchrpc_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4577,7 +4696,7 @@ func (x *SlpV1Nft1ChildGenesisMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use SlpV1Nft1ChildGenesisMetadata.ProtoReflect.Descriptor instead. func (*SlpV1Nft1ChildGenesisMetadata) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{55} + return file_bchrpc_proto_rawDescGZIP(), []int{57} } func (x *SlpV1Nft1ChildGenesisMetadata) GetName() []byte { @@ -4634,7 +4753,7 @@ type SlpV1Nft1ChildSendMetadata struct { func (x *SlpV1Nft1ChildSendMetadata) Reset() { *x = SlpV1Nft1ChildSendMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[56] + mi := &file_bchrpc_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4647,7 +4766,7 @@ func (x *SlpV1Nft1ChildSendMetadata) String() string { func (*SlpV1Nft1ChildSendMetadata) ProtoMessage() {} func (x *SlpV1Nft1ChildSendMetadata) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[56] + mi := &file_bchrpc_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4660,7 +4779,7 @@ func (x *SlpV1Nft1ChildSendMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use SlpV1Nft1ChildSendMetadata.ProtoReflect.Descriptor instead. func (*SlpV1Nft1ChildSendMetadata) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{56} + return file_bchrpc_proto_rawDescGZIP(), []int{58} } func (x *SlpV1Nft1ChildSendMetadata) GetGroupTokenId() []byte { @@ -4688,7 +4807,7 @@ type SlpTokenMetadata struct { func (x *SlpTokenMetadata) Reset() { *x = SlpTokenMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[57] + mi := &file_bchrpc_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4701,7 +4820,7 @@ func (x *SlpTokenMetadata) String() string { func (*SlpTokenMetadata) ProtoMessage() {} func (x *SlpTokenMetadata) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[57] + mi := &file_bchrpc_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4714,7 +4833,7 @@ func (x *SlpTokenMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use SlpTokenMetadata.ProtoReflect.Descriptor instead. func (*SlpTokenMetadata) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{57} + return file_bchrpc_proto_rawDescGZIP(), []int{59} } func (x *SlpTokenMetadata) GetTokenId() []byte { @@ -4799,7 +4918,7 @@ type SlpRequiredBurn struct { func (x *SlpRequiredBurn) Reset() { *x = SlpRequiredBurn{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[58] + mi := &file_bchrpc_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4812,7 +4931,7 @@ func (x *SlpRequiredBurn) String() string { func (*SlpRequiredBurn) ProtoMessage() {} func (x *SlpRequiredBurn) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[58] + mi := &file_bchrpc_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4825,7 +4944,7 @@ func (x *SlpRequiredBurn) ProtoReflect() protoreflect.Message { // Deprecated: Use SlpRequiredBurn.ProtoReflect.Descriptor instead. func (*SlpRequiredBurn) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{58} + return file_bchrpc_proto_rawDescGZIP(), []int{60} } func (x *SlpRequiredBurn) GetOutpoint() *Transaction_Input_Outpoint { @@ -4902,7 +5021,7 @@ type GetMempoolResponse_TransactionData struct { func (x *GetMempoolResponse_TransactionData) Reset() { *x = GetMempoolResponse_TransactionData{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[59] + mi := &file_bchrpc_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4915,7 +5034,7 @@ func (x *GetMempoolResponse_TransactionData) String() string { func (*GetMempoolResponse_TransactionData) ProtoMessage() {} func (x *GetMempoolResponse_TransactionData) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[59] + mi := &file_bchrpc_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4977,14 +5096,15 @@ type GetSlpTrustedValidationRequest_Query struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PrevOutHash []byte `protobuf:"bytes,1,opt,name=prev_out_hash,json=prevOutHash,proto3" json:"prev_out_hash,omitempty"` - PrevOutVout uint32 `protobuf:"varint,2,opt,name=prev_out_vout,json=prevOutVout,proto3" json:"prev_out_vout,omitempty"` + PrevOutHash []byte `protobuf:"bytes,1,opt,name=prev_out_hash,json=prevOutHash,proto3" json:"prev_out_hash,omitempty"` + PrevOutVout uint32 `protobuf:"varint,2,opt,name=prev_out_vout,json=prevOutVout,proto3" json:"prev_out_vout,omitempty"` + GraphsearchValidHashes [][]byte `protobuf:"bytes,3,rep,name=graphsearch_valid_hashes,json=graphsearchValidHashes,proto3" json:"graphsearch_valid_hashes,omitempty"` } func (x *GetSlpTrustedValidationRequest_Query) Reset() { *x = GetSlpTrustedValidationRequest_Query{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[60] + mi := &file_bchrpc_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4997,7 +5117,7 @@ func (x *GetSlpTrustedValidationRequest_Query) String() string { func (*GetSlpTrustedValidationRequest_Query) ProtoMessage() {} func (x *GetSlpTrustedValidationRequest_Query) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[60] + mi := &file_bchrpc_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5027,6 +5147,13 @@ func (x *GetSlpTrustedValidationRequest_Query) GetPrevOutVout() uint32 { return 0 } +func (x *GetSlpTrustedValidationRequest_Query) GetGraphsearchValidHashes() [][]byte { + if x != nil { + return x.GraphsearchValidHashes + } + return nil +} + type GetSlpTrustedValidationResponse_ValidityResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5040,14 +5167,15 @@ type GetSlpTrustedValidationResponse_ValidityResult struct { // Types that are assignable to ValidityResultType: // *GetSlpTrustedValidationResponse_ValidityResult_V1TokenAmount // *GetSlpTrustedValidationResponse_ValidityResult_V1MintBaton - ValidityResultType isGetSlpTrustedValidationResponse_ValidityResult_ValidityResultType `protobuf_oneof:"validity_result_type"` - SlpTxnOpreturn []byte `protobuf:"bytes,8,opt,name=slp_txn_opreturn,json=slpTxnOpreturn,proto3" json:"slp_txn_opreturn,omitempty"` + ValidityResultType isGetSlpTrustedValidationResponse_ValidityResult_ValidityResultType `protobuf_oneof:"validity_result_type"` + SlpTxnOpreturn []byte `protobuf:"bytes,8,opt,name=slp_txn_opreturn,json=slpTxnOpreturn,proto3" json:"slp_txn_opreturn,omitempty"` + GraphsearchTxnCount uint32 `protobuf:"varint,9,opt,name=graphsearch_txn_count,json=graphsearchTxnCount,proto3" json:"graphsearch_txn_count,omitempty"` } func (x *GetSlpTrustedValidationResponse_ValidityResult) Reset() { *x = GetSlpTrustedValidationResponse_ValidityResult{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[61] + mi := &file_bchrpc_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5060,7 +5188,7 @@ func (x *GetSlpTrustedValidationResponse_ValidityResult) String() string { func (*GetSlpTrustedValidationResponse_ValidityResult) ProtoMessage() {} func (x *GetSlpTrustedValidationResponse_ValidityResult) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[61] + mi := &file_bchrpc_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5139,6 +5267,13 @@ func (x *GetSlpTrustedValidationResponse_ValidityResult) GetSlpTxnOpreturn() []b return nil } +func (x *GetSlpTrustedValidationResponse_ValidityResult) GetGraphsearchTxnCount() uint32 { + if x != nil { + return x.GraphsearchTxnCount + } + return 0 +} + type isGetSlpTrustedValidationResponse_ValidityResult_ValidityResultType interface { isGetSlpTrustedValidationResponse_ValidityResult_ValidityResultType() } @@ -5171,7 +5306,7 @@ type Block_TransactionData struct { func (x *Block_TransactionData) Reset() { *x = Block_TransactionData{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[62] + mi := &file_bchrpc_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5184,7 +5319,7 @@ func (x *Block_TransactionData) String() string { func (*Block_TransactionData) ProtoMessage() {} func (x *Block_TransactionData) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[62] + mi := &file_bchrpc_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5197,7 +5332,7 @@ func (x *Block_TransactionData) ProtoReflect() protoreflect.Message { // Deprecated: Use Block_TransactionData.ProtoReflect.Descriptor instead. func (*Block_TransactionData) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{45, 0} + return file_bchrpc_proto_rawDescGZIP(), []int{47, 0} } func (m *Block_TransactionData) GetTxidsOrTxs() isBlock_TransactionData_TxidsOrTxs { @@ -5266,7 +5401,7 @@ type Transaction_Input struct { func (x *Transaction_Input) Reset() { *x = Transaction_Input{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[63] + mi := &file_bchrpc_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5279,7 +5414,7 @@ func (x *Transaction_Input) String() string { func (*Transaction_Input) ProtoMessage() {} func (x *Transaction_Input) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[63] + mi := &file_bchrpc_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5292,7 +5427,7 @@ func (x *Transaction_Input) ProtoReflect() protoreflect.Message { // Deprecated: Use Transaction_Input.ProtoReflect.Descriptor instead. func (*Transaction_Input) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{46, 0} + return file_bchrpc_proto_rawDescGZIP(), []int{48, 0} } func (x *Transaction_Input) GetIndex() uint32 { @@ -5374,7 +5509,7 @@ type Transaction_Output struct { func (x *Transaction_Output) Reset() { *x = Transaction_Output{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[64] + mi := &file_bchrpc_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5387,7 +5522,7 @@ func (x *Transaction_Output) String() string { func (*Transaction_Output) ProtoMessage() {} func (x *Transaction_Output) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[64] + mi := &file_bchrpc_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5400,7 +5535,7 @@ func (x *Transaction_Output) ProtoReflect() protoreflect.Message { // Deprecated: Use Transaction_Output.ProtoReflect.Descriptor instead. func (*Transaction_Output) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{46, 1} + return file_bchrpc_proto_rawDescGZIP(), []int{48, 1} } func (x *Transaction_Output) GetIndex() uint32 { @@ -5466,7 +5601,7 @@ type Transaction_Input_Outpoint struct { func (x *Transaction_Input_Outpoint) Reset() { *x = Transaction_Input_Outpoint{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[65] + mi := &file_bchrpc_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5479,7 +5614,7 @@ func (x *Transaction_Input_Outpoint) String() string { func (*Transaction_Input_Outpoint) ProtoMessage() {} func (x *Transaction_Input_Outpoint) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[65] + mi := &file_bchrpc_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5492,7 +5627,7 @@ func (x *Transaction_Input_Outpoint) ProtoReflect() protoreflect.Message { // Deprecated: Use Transaction_Input_Outpoint.ProtoReflect.Descriptor instead. func (*Transaction_Input_Outpoint) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{46, 0, 0} + return file_bchrpc_proto_rawDescGZIP(), []int{48, 0, 0} } func (x *Transaction_Input_Outpoint) GetHash() []byte { @@ -5527,7 +5662,7 @@ type SlpTokenMetadata_V1Fungible struct { func (x *SlpTokenMetadata_V1Fungible) Reset() { *x = SlpTokenMetadata_V1Fungible{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[66] + mi := &file_bchrpc_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5540,7 +5675,7 @@ func (x *SlpTokenMetadata_V1Fungible) String() string { func (*SlpTokenMetadata_V1Fungible) ProtoMessage() {} func (x *SlpTokenMetadata_V1Fungible) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[66] + mi := &file_bchrpc_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5553,7 +5688,7 @@ func (x *SlpTokenMetadata_V1Fungible) ProtoReflect() protoreflect.Message { // Deprecated: Use SlpTokenMetadata_V1Fungible.ProtoReflect.Descriptor instead. func (*SlpTokenMetadata_V1Fungible) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{57, 0} + return file_bchrpc_proto_rawDescGZIP(), []int{59, 0} } func (x *SlpTokenMetadata_V1Fungible) GetTokenTicker() string { @@ -5623,7 +5758,7 @@ type SlpTokenMetadata_V1NFT1Group struct { func (x *SlpTokenMetadata_V1NFT1Group) Reset() { *x = SlpTokenMetadata_V1NFT1Group{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[67] + mi := &file_bchrpc_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5636,7 +5771,7 @@ func (x *SlpTokenMetadata_V1NFT1Group) String() string { func (*SlpTokenMetadata_V1NFT1Group) ProtoMessage() {} func (x *SlpTokenMetadata_V1NFT1Group) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[67] + mi := &file_bchrpc_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5649,7 +5784,7 @@ func (x *SlpTokenMetadata_V1NFT1Group) ProtoReflect() protoreflect.Message { // Deprecated: Use SlpTokenMetadata_V1NFT1Group.ProtoReflect.Descriptor instead. func (*SlpTokenMetadata_V1NFT1Group) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{57, 1} + return file_bchrpc_proto_rawDescGZIP(), []int{59, 1} } func (x *SlpTokenMetadata_V1NFT1Group) GetTokenTicker() string { @@ -5717,7 +5852,7 @@ type SlpTokenMetadata_V1NFT1Child struct { func (x *SlpTokenMetadata_V1NFT1Child) Reset() { *x = SlpTokenMetadata_V1NFT1Child{} if protoimpl.UnsafeEnabled { - mi := &file_bchrpc_proto_msgTypes[68] + mi := &file_bchrpc_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5730,7 +5865,7 @@ func (x *SlpTokenMetadata_V1NFT1Child) String() string { func (*SlpTokenMetadata_V1NFT1Child) ProtoMessage() {} func (x *SlpTokenMetadata_V1NFT1Child) ProtoReflect() protoreflect.Message { - mi := &file_bchrpc_proto_msgTypes[68] + mi := &file_bchrpc_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5743,7 +5878,7 @@ func (x *SlpTokenMetadata_V1NFT1Child) ProtoReflect() protoreflect.Message { // Deprecated: Use SlpTokenMetadata_V1NFT1Child.ProtoReflect.Descriptor instead. func (*SlpTokenMetadata_V1NFT1Child) Descriptor() ([]byte, []int) { - return file_bchrpc_proto_rawDescGZIP(), []int{57, 2} + return file_bchrpc_proto_rawDescGZIP(), []int{59, 2} } func (x *SlpTokenMetadata_V1NFT1Child) GetTokenTicker() string { @@ -5811,7 +5946,7 @@ var file_bchrpc_proto_rawDesc = []byte{ 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x74, 0x78, 0x69, 0x64, 0x73, 0x5f, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x73, 0x22, 0x1a, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x89, 0x03, + 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb2, 0x03, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0b, 0x62, 0x69, 0x74, 0x63, 0x6f, 0x69, 0x6e, 0x5f, 0x6e, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, @@ -5832,311 +5967,321 @@ var file_bchrpc_proto_rawDesc = []byte{ 0x64, 0x64, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x6c, 0x70, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x73, - 0x6c, 0x70, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x40, 0x0a, 0x0a, 0x42, 0x69, 0x74, 0x63, 0x6f, - 0x69, 0x6e, 0x4e, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x4d, 0x41, 0x49, 0x4e, 0x4e, 0x45, 0x54, - 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x47, 0x54, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, - 0x0c, 0x0a, 0x08, 0x54, 0x45, 0x53, 0x54, 0x4e, 0x45, 0x54, 0x33, 0x10, 0x02, 0x12, 0x0a, 0x0a, - 0x06, 0x53, 0x49, 0x4d, 0x4e, 0x45, 0x54, 0x10, 0x03, 0x22, 0x57, 0x0a, 0x13, 0x47, 0x65, 0x74, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, + 0x6c, 0x70, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6c, 0x70, 0x5f, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0e, 0x73, 0x6c, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x22, 0x40, 0x0a, 0x0a, 0x42, 0x69, 0x74, 0x63, 0x6f, 0x69, 0x6e, 0x4e, 0x65, 0x74, 0x12, 0x0b, + 0x0a, 0x07, 0x4d, 0x41, 0x49, 0x4e, 0x4e, 0x45, 0x54, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, + 0x45, 0x47, 0x54, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x54, 0x45, 0x53, 0x54, + 0x4e, 0x45, 0x54, 0x33, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x49, 0x4d, 0x4e, 0x45, 0x54, + 0x10, 0x03, 0x22, 0x57, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x04, 0x68, 0x61, 0x73, + 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, + 0x18, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, + 0x00, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x68, 0x61, 0x73, + 0x68, 0x5f, 0x6f, 0x72, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x39, 0x0a, 0x14, 0x47, + 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x80, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x04, 0x68, 0x61, + 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, + 0x12, 0x18, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x48, 0x00, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x75, + 0x6c, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x66, 0x75, 0x6c, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x68, 0x61, 0x73, 0x68, 0x5f, + 0x6f, 0x72, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x33, 0x0a, 0x10, 0x47, 0x65, 0x74, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, + 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x70, + 0x62, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x56, + 0x0a, 0x12, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x48, 0x00, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, 0x06, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x06, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x6f, 0x72, 0x5f, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x2b, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x22, 0x59, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x04, + 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x04, 0x68, 0x61, + 0x73, 0x68, 0x12, 0x18, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x48, 0x00, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x42, 0x10, 0x0a, 0x0e, + 0x68, 0x61, 0x73, 0x68, 0x5f, 0x6f, 0x72, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x30, + 0x0a, 0x16, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x22, 0x62, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0c, 0x52, 0x12, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, + 0x72, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x6f, 0x70, 0x5f, + 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x70, + 0x48, 0x61, 0x73, 0x68, 0x22, 0x3d, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x07, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, + 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x22, 0x61, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, + 0x12, 0x34, 0x0a, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x14, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x88, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x31, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x0e, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, + 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x52, 0x0d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x22, 0x2e, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, + 0x68, 0x22, 0x3d, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0xac, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x17, 0x0a, 0x07, + 0x6e, 0x62, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6e, + 0x62, 0x53, 0x6b, 0x69, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x62, 0x5f, 0x66, 0x65, 0x74, 0x63, + 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x6e, 0x62, 0x46, 0x65, 0x74, 0x63, 0x68, + 0x12, 0x14, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, + 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x42, 0x0d, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, + 0xbb, 0x01, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x46, 0x0a, 0x16, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x51, 0x0a, 0x18, 0x75, 0x6e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, + 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x17, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, + 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xaf, 0x01, + 0x0a, 0x20, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x17, 0x0a, 0x07, + 0x6e, 0x62, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6e, + 0x62, 0x53, 0x6b, 0x69, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x62, 0x5f, 0x66, 0x65, 0x74, 0x63, + 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x6e, 0x62, 0x46, 0x65, 0x74, 0x63, 0x68, + 0x12, 0x14, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x42, 0x10, 0x0a, 0x0e, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x6f, 0x72, 0x5f, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x22, 0x39, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x04, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x80, 0x01, - 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, - 0x00, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x66, 0x75, - 0x6c, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x10, - 0x0a, 0x0e, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x6f, 0x72, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x22, 0x33, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x56, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x04, 0x68, - 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x04, 0x68, 0x61, 0x73, - 0x68, 0x12, 0x18, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x48, 0x00, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x68, - 0x61, 0x73, 0x68, 0x5f, 0x6f, 0x72, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x2b, 0x0a, - 0x13, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x59, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x48, 0x00, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, 0x06, 0x68, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x06, 0x68, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x6f, 0x72, 0x5f, 0x68, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x30, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x62, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x68, 0x61, - 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x12, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x1b, - 0x0a, 0x09, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x48, 0x61, 0x73, 0x68, 0x22, 0x3d, 0x0a, 0x12, 0x47, - 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x27, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x22, 0x61, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x88, 0x01, - 0x0a, 0x16, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, - 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x0e, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x42, 0x0d, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, + 0x95, 0x01, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x16, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, + 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x18, + 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x17, + 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x9a, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x5f, 0x6d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x34, + 0x0a, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x22, 0x8c, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x6f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x62, 0x2e, + 0x55, 0x6e, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x07, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, 0x3b, 0x0a, 0x0e, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x22, 0xa2, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x73, 0x70, 0x65, + 0x6e, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, + 0x61, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x70, 0x6f, + 0x6f, 0x6c, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x14, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xbd, 0x02, 0x0a, 0x18, 0x47, 0x65, 0x74, + 0x55, 0x6e, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x4f, + 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, + 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0b, + 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0a, 0x69, 0x73, 0x43, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x12, 0x21, 0x0a, + 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x12, 0x29, 0x0a, 0x09, 0x73, 0x6c, 0x70, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x52, 0x08, 0x73, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x3b, 0x0a, 0x0e, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2e, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x52, - 0x61, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x22, 0x3d, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x52, - 0x61, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xac, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x62, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6e, 0x62, 0x53, 0x6b, 0x69, 0x70, 0x12, 0x19, 0x0a, 0x08, - 0x6e, 0x62, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, - 0x6e, 0x62, 0x46, 0x65, 0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, - 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, - 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0xbb, 0x01, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x16, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x72, 0x6d, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x51, 0x0a, 0x18, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x42, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4d, + 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x22, 0x6b, 0x0a, 0x16, + 0x47, 0x65, 0x74, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x68, + 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x06, 0x68, 0x61, 0x73, + 0x68, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x22, 0xb6, 0x01, 0x0a, 0x18, 0x53, 0x75, + 0x62, 0x6d, 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x17, 0x73, 0x6b, 0x69, 0x70, + 0x5f, 0x73, 0x6c, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x73, 0x6b, 0x69, 0x70, 0x53, + 0x6c, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, + 0x41, 0x0a, 0x12, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x73, 0x6c, 0x70, 0x5f, + 0x62, 0x75, 0x72, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x62, + 0x2e, 0x53, 0x6c, 0x70, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x42, 0x75, 0x72, 0x6e, + 0x52, 0x10, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x53, 0x6c, 0x70, 0x42, 0x75, 0x72, + 0x6e, 0x73, 0x22, 0x2f, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, + 0x61, 0x73, 0x68, 0x22, 0xc0, 0x01, 0x0a, 0x1a, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x6c, 0x70, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x12, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x5f, 0x73, 0x6c, 0x70, 0x5f, 0x62, 0x75, 0x72, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x42, 0x75, 0x72, 0x6e, 0x52, 0x10, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x53, + 0x6c, 0x70, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x12, 0x3d, 0x0a, 0x1b, 0x75, 0x73, 0x65, 0x5f, 0x73, + 0x70, 0x65, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x6a, 0x75, 0x64, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x75, 0x73, + 0x65, 0x53, 0x70, 0x65, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4a, 0x75, 0x64, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x80, 0x01, 0x0a, 0x1b, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x53, 0x6c, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x65, 0x73, 0x74, + 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x62, + 0x65, 0x73, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x82, 0x02, 0x0a, 0x1c, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x09, 0x73, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x52, 0x09, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, + 0x37, 0x0a, 0x0b, 0x75, 0x6e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x0b, 0x75, 0x6e, 0x73, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, + 0x6c, 0x12, 0x28, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x5f, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x49, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x73, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x54, 0x78, 0x22, 0x8d, + 0x01, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x75, 0x6c, + 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x66, + 0x75, 0x6c, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x17, 0x75, 0x6e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xaf, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x62, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6e, 0x62, 0x53, 0x6b, 0x69, 0x70, 0x12, 0x19, 0x0a, 0x08, - 0x6e, 0x62, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, - 0x6e, 0x62, 0x46, 0x65, 0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, - 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, - 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x95, 0x01, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x52, 0x61, - 0x77, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x16, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x15, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x18, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, - 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x17, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, - 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x9a, - 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x6e, 0x73, - 0x70, 0x65, 0x6e, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x27, 0x0a, 0x0f, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4d, 0x65, - 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x8c, 0x01, 0x0a, 0x20, - 0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x6e, - 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x2b, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, 0x3b, 0x0a, - 0x0e, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xa2, 0x01, 0x0a, 0x17, 0x47, - 0x65, 0x74, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x70, - 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, - 0xbd, 0x02, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x08, - 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, - 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x75, 0x62, 0x6b, - 0x65, 0x79, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0c, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, - 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x43, 0x6f, 0x69, 0x6e, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x29, 0x0a, 0x09, 0x73, 0x6c, 0x70, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, - 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x08, 0x73, 0x6c, 0x70, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x3b, 0x0a, 0x0e, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x62, 0x2e, + 0x01, 0x28, 0x08, 0x52, 0x10, 0x66, 0x75, 0x6c, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, + 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x39, + 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, + 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x73, 0x22, 0x5a, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x52, 0x0d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, - 0x42, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, - 0x61, 0x73, 0x68, 0x22, 0x6b, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, - 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, - 0x62, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0c, 0x52, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, - 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, - 0x22, 0xb6, 0x01, 0x0a, 0x18, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, - 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x35, 0x0a, 0x17, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x73, 0x6c, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x14, 0x73, 0x6b, 0x69, 0x70, 0x53, 0x6c, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, - 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x41, 0x0a, 0x12, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x64, 0x5f, 0x73, 0x6c, 0x70, 0x5f, 0x62, 0x75, 0x72, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x52, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x64, 0x42, 0x75, 0x72, 0x6e, 0x52, 0x10, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x64, 0x53, 0x6c, 0x70, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x22, 0x2f, 0x0a, 0x19, 0x53, 0x75, 0x62, - 0x6d, 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x22, 0xc0, 0x01, 0x0a, 0x1a, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x53, 0x6c, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x12, 0x72, - 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x73, 0x6c, 0x70, 0x5f, 0x62, 0x75, 0x72, 0x6e, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, - 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x42, 0x75, 0x72, 0x6e, 0x52, 0x10, 0x72, 0x65, - 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x53, 0x6c, 0x70, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x12, 0x3d, - 0x0a, 0x1b, 0x75, 0x73, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x69, 0x74, 0x79, 0x5f, 0x6a, 0x75, 0x64, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x18, 0x75, 0x73, 0x65, 0x53, 0x70, 0x65, 0x63, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x69, 0x74, 0x79, 0x4a, 0x75, 0x64, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x80, 0x01, - 0x0a, 0x1b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x6c, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, - 0x08, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, - 0x1f, 0x0a, 0x0b, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x62, 0x65, 0x73, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x22, 0x82, 0x02, 0x0a, 0x1c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x33, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x09, 0x73, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x75, 0x6e, 0x73, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x62, - 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x52, 0x0b, 0x75, 0x6e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, - 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x70, 0x6f, - 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x28, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x49, 0x6e, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, - 0x74, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x54, 0x78, 0x22, 0x8d, 0x01, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x66, 0x75, 0x6c, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, - 0x2b, 0x0a, 0x11, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x66, 0x75, 0x6c, 0x6c, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x0a, 0x0f, - 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x39, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x73, - 0x22, 0x5a, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3b, 0x0a, 0x0e, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x4b, 0x0a, 0x19, - 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x6c, 0x70, - 0x5f, 0x6f, 0x70, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x73, 0x6c, 0x70, 0x4f, 0x70, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x91, 0x04, 0x0a, 0x1a, 0x47, 0x65, - 0x74, 0x53, 0x6c, 0x70, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x61, 0x72, 0x73, - 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x19, 0x0a, - 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x0a, 0x73, 0x6c, 0x70, 0x5f, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x70, - 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x73, 0x6c, 0x70, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x2e, - 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x76, 0x31, 0x5f, 0x67, 0x65, - 0x6e, 0x65, 0x73, 0x69, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x62, - 0x2e, 0x53, 0x6c, 0x70, 0x56, 0x31, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x09, 0x76, 0x31, 0x47, 0x65, 0x6e, 0x65, 0x73, - 0x69, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x76, 0x31, 0x5f, 0x6d, 0x69, 0x6e, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x56, 0x31, 0x4d, 0x69, - 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x06, 0x76, 0x31, - 0x4d, 0x69, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x07, 0x76, 0x31, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x56, 0x31, - 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x06, - 0x76, 0x31, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x56, 0x0a, 0x15, 0x76, 0x31, 0x5f, 0x6e, 0x66, 0x74, - 0x31, 0x5f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x56, 0x31, - 0x4e, 0x66, 0x74, 0x31, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x12, 0x76, 0x31, 0x4e, 0x66, - 0x74, 0x31, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x12, 0x4d, - 0x0a, 0x12, 0x76, 0x31, 0x5f, 0x6e, 0x66, 0x74, 0x31, 0x5f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x5f, - 0x73, 0x65, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x2e, - 0x53, 0x6c, 0x70, 0x56, 0x31, 0x4e, 0x66, 0x74, 0x31, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x53, 0x65, - 0x6e, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0f, 0x76, 0x31, - 0x4e, 0x66, 0x74, 0x31, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x53, 0x65, 0x6e, 0x64, 0x42, 0x0e, 0x0a, - 0x0c, 0x73, 0x6c, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xb5, 0x01, - 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x42, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x54, 0x72, 0x75, - 0x73, 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, - 0x72, 0x69, 0x65, 0x73, 0x1a, 0x4f, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x22, 0x0a, - 0x0d, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6f, 0x75, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x4f, 0x75, 0x74, 0x48, 0x61, 0x73, - 0x68, 0x12, 0x22, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6f, 0x75, 0x74, 0x5f, 0x76, 0x6f, - 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x4f, 0x75, - 0x74, 0x56, 0x6f, 0x75, 0x74, 0x22, 0xda, 0x03, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0e, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x4b, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x50, + 0x61, 0x72, 0x73, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x6c, 0x70, 0x5f, 0x6f, 0x70, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x11, 0x73, 0x6c, 0x70, 0x4f, 0x70, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x53, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x22, 0x91, 0x04, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x50, 0x61, 0x72, + 0x73, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, + 0x67, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, + 0x64, 0x12, 0x2c, 0x0a, 0x0a, 0x73, 0x6c, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x73, 0x6c, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x2f, 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x39, 0x0a, 0x0a, 0x76, 0x31, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x56, 0x31, 0x47, + 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, + 0x52, 0x09, 0x76, 0x31, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x76, + 0x31, 0x5f, 0x6d, 0x69, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, + 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x56, 0x31, 0x4d, 0x69, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x06, 0x76, 0x31, 0x4d, 0x69, 0x6e, 0x74, 0x12, 0x30, 0x0a, + 0x07, 0x76, 0x31, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x56, 0x31, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x06, 0x76, 0x31, 0x53, 0x65, 0x6e, 0x64, 0x12, + 0x56, 0x0a, 0x15, 0x76, 0x31, 0x5f, 0x6e, 0x66, 0x74, 0x31, 0x5f, 0x63, 0x68, 0x69, 0x6c, 0x64, + 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x56, 0x31, 0x4e, 0x66, 0x74, 0x31, 0x43, 0x68, 0x69, + 0x6c, 0x64, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x48, 0x00, 0x52, 0x12, 0x76, 0x31, 0x4e, 0x66, 0x74, 0x31, 0x43, 0x68, 0x69, 0x6c, 0x64, + 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x76, 0x31, 0x5f, 0x6e, 0x66, + 0x74, 0x31, 0x5f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x56, 0x31, 0x4e, 0x66, + 0x74, 0x31, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0f, 0x76, 0x31, 0x4e, 0x66, 0x74, 0x31, 0x43, 0x68, 0x69, + 0x6c, 0x64, 0x53, 0x65, 0x6e, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x73, 0x6c, 0x70, 0x5f, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xac, 0x02, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x53, 0x6c, + 0x70, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x07, 0x71, 0x75, 0x65, + 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x62, 0x2e, + 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x3a, 0x0a, + 0x19, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x17, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x89, 0x01, 0x0a, 0x05, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x12, 0x22, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6f, 0x75, 0x74, 0x5f, + 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x76, + 0x4f, 0x75, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x5f, + 0x6f, 0x75, 0x74, 0x5f, 0x76, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, + 0x70, 0x72, 0x65, 0x76, 0x4f, 0x75, 0x74, 0x56, 0x6f, 0x75, 0x74, 0x12, 0x38, 0x0a, 0x18, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x16, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x48, + 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x8e, 0x04, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x1a, 0xe8, 0x02, 0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x69, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x1a, 0x9c, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6f, 0x75, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x4f, 0x75, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, @@ -6157,269 +6302,306 @@ var file_bchrpc_proto_rawDesc = []byte{ 0x08, 0x48, 0x00, 0x52, 0x0b, 0x76, 0x31, 0x4d, 0x69, 0x6e, 0x74, 0x42, 0x61, 0x74, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6c, 0x70, 0x5f, 0x74, 0x78, 0x6e, 0x5f, 0x6f, 0x70, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x73, 0x6c, 0x70, 0x54, - 0x78, 0x6e, 0x4f, 0x70, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x22, 0x88, 0x02, 0x0a, 0x11, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, - 0x62, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x09, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0f, 0x6d, 0x61, 0x72, 0x73, - 0x68, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x0e, - 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2b, - 0x0a, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x69, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x27, 0x0a, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, - 0x45, 0x44, 0x10, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0xda, 0x02, - 0x0a, 0x17, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x46, 0x0a, 0x15, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, - 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, - 0x00, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x17, 0x75, 0x6e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x65, - 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x48, 0x00, 0x52, 0x16, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x16, 0x73, 0x65, - 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x15, 0x73, 0x65, - 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x26, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x55, - 0x4e, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, - 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x10, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x84, 0x03, 0x0a, 0x09, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x68, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, - 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, - 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x6b, - 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 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, 0x12, 0x0a, 0x04, 0x62, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x04, 0x62, 0x69, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, - 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x24, - 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, - 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, - 0x75, 0x6c, 0x74, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x6e, - 0x65, 0x78, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, - 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x54, 0x69, 0x6d, - 0x65, 0x22, 0xf6, 0x01, 0x0a, 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x04, 0x69, - 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x44, - 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x61, 0x74, 0x61, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x44, 0x61, 0x74, 0x61, 0x1a, 0x83, 0x01, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x48, 0x61, 0x73, 0x68, 0x12, 0x33, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x78, 0x6e, 0x4f, 0x70, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x74, 0x78, 0x6e, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x67, 0x72, 0x61, 0x70, 0x68, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x78, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x16, + 0x0a, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x51, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, + 0x47, 0x72, 0x61, 0x70, 0x68, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, + 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0b, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x33, 0x0a, 0x19, 0x47, 0x65, 0x74, + 0x53, 0x6c, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x78, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x06, 0x74, 0x78, 0x64, 0x61, 0x74, 0x61, 0x22, 0x88, + 0x02, 0x0a, 0x11, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, + 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0f, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x65, + 0x64, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, + 0x70, 0x62, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x61, 0x72, 0x73, + 0x68, 0x61, 0x6c, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2b, 0x0a, 0x10, 0x73, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x27, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, + 0x0a, 0x0c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x01, + 0x42, 0x07, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0xda, 0x02, 0x0a, 0x17, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x46, 0x0a, 0x15, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x74, 0x78, - 0x69, 0x64, 0x73, 0x5f, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x73, 0x22, 0xef, 0x07, 0x0a, 0x0b, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, - 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x18, - 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75, - 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, - 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6c, 0x6f, - 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, - 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, - 0x12, 0x48, 0x0a, 0x14, 0x73, 0x6c, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x12, 0x73, 0x6c, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0xda, 0x02, 0x0a, 0x05, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x3a, 0x0a, 0x08, 0x6f, 0x75, - 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, - 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, - 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x72, - 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x29, 0x0a, 0x09, 0x73, 0x6c, 0x70, 0x5f, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x53, - 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x08, 0x73, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x1a, 0x34, 0x0a, 0x08, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, - 0x68, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x1a, 0xf2, 0x01, 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, - 0x0a, 0x0d, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x53, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, - 0x0c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6c, 0x61, 0x73, 0x73, - 0x12, 0x2f, 0x0a, 0x13, 0x64, 0x69, 0x73, 0x61, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x65, 0x64, - 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x64, - 0x69, 0x73, 0x61, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x12, 0x29, 0x0a, 0x09, 0x73, 0x6c, 0x70, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x52, 0x08, 0x73, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xe6, 0x01, 0x0a, - 0x12, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x64, 0x64, 0x65, - 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x68, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x61, 0x64, 0x64, - 0x65, 0x64, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x66, 0x65, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x66, 0x65, 0x65, 0x12, 0x1c, 0x0a, 0x0a, 0x66, 0x65, - 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6b, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, - 0x66, 0x65, 0x65, 0x50, 0x65, 0x72, 0x4b, 0x62, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x10, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x69, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0xf5, 0x01, 0x0a, 0x0d, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x6e, - 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x3a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x2e, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x70, 0x75, 0x62, 0x6b, - 0x65, 0x79, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, - 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x43, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x12, - 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x12, 0x29, 0x0a, 0x09, 0x73, 0x6c, 0x70, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x52, 0x08, 0x73, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x95, 0x02, - 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, - 0x73, 0x12, 0x3c, 0x0a, 0x09, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x09, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, - 0x23, 0x0a, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6c, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, - 0x61, 0x6c, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x30, 0x0a, 0x14, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x6c, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x61, - 0x6c, 0x6c, 0x53, 0x6c, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x6c, 0x70, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, - 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0b, 0x73, 0x6c, 0x70, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x49, 0x64, 0x73, 0x22, 0xfa, 0x01, 0x0a, 0x08, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, - 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, - 0x01, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x69, 0x73, 0x5f, - 0x6d, 0x69, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x74, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0b, 0x69, 0x73, 0x4d, 0x69, 0x6e, 0x74, 0x42, 0x61, 0x74, 0x6f, 0x6e, 0x12, 0x18, 0x0a, - 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, - 0x61, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, - 0x61, 0x6c, 0x73, 0x12, 0x2c, 0x0a, 0x0a, 0x73, 0x6c, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x73, 0x6c, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, - 0x70, 0x65, 0x22, 0xe3, 0x06, 0x0a, 0x12, 0x53, 0x6c, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x0a, 0x73, 0x6c, 0x70, - 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, - 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x73, 0x6c, - 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x57, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x69, 0x74, 0x79, 0x5f, 0x6a, 0x75, 0x64, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x69, 0x74, 0x79, 0x4a, 0x75, 0x64, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x11, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4a, 0x75, 0x64, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x73, 0x65, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x0a, - 0x62, 0x75, 0x72, 0x6e, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, - 0x32, 0x20, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x42, 0x75, 0x72, 0x6e, 0x46, 0x6c, 0x61, - 0x67, 0x73, 0x52, 0x09, 0x62, 0x75, 0x72, 0x6e, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x39, 0x0a, - 0x0a, 0x76, 0x31, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x56, 0x31, 0x47, 0x65, 0x6e, 0x65, - 0x73, 0x69, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x09, 0x76, - 0x31, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x76, 0x31, 0x5f, 0x6d, - 0x69, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x53, - 0x6c, 0x70, 0x56, 0x31, 0x4d, 0x69, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x48, 0x00, 0x52, 0x06, 0x76, 0x31, 0x4d, 0x69, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x07, 0x76, 0x31, - 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x62, - 0x2e, 0x53, 0x6c, 0x70, 0x56, 0x31, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x48, 0x00, 0x52, 0x06, 0x76, 0x31, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x56, 0x0a, 0x15, - 0x76, 0x31, 0x5f, 0x6e, 0x66, 0x74, 0x31, 0x5f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x5f, 0x67, 0x65, - 0x6e, 0x65, 0x73, 0x69, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x62, - 0x2e, 0x53, 0x6c, 0x70, 0x56, 0x31, 0x4e, 0x66, 0x74, 0x31, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x47, - 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, - 0x52, 0x12, 0x76, 0x31, 0x4e, 0x66, 0x74, 0x31, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x47, 0x65, 0x6e, - 0x65, 0x73, 0x69, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x76, 0x31, 0x5f, 0x6e, 0x66, 0x74, 0x31, 0x5f, - 0x63, 0x68, 0x69, 0x6c, 0x64, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x56, 0x31, 0x4e, 0x66, 0x74, 0x31, 0x43, - 0x68, 0x69, 0x6c, 0x64, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x48, 0x00, 0x52, 0x0f, 0x76, 0x31, 0x4e, 0x66, 0x74, 0x31, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x53, - 0x65, 0x6e, 0x64, 0x22, 0x36, 0x0a, 0x11, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4a, - 0x75, 0x64, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x12, 0x55, 0x4e, 0x4b, 0x4e, - 0x4f, 0x57, 0x4e, 0x5f, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, - 0x12, 0x09, 0x0a, 0x05, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x01, 0x22, 0xbb, 0x01, 0x0a, 0x09, - 0x42, 0x75, 0x72, 0x6e, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x55, 0x52, - 0x4e, 0x45, 0x44, 0x5f, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x53, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, - 0x54, 0x53, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, 0x00, 0x12, 0x1e, 0x0a, - 0x1a, 0x42, 0x55, 0x52, 0x4e, 0x45, 0x44, 0x5f, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x53, 0x5f, 0x42, - 0x41, 0x44, 0x5f, 0x4f, 0x50, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x10, 0x01, 0x12, 0x1d, 0x0a, - 0x19, 0x42, 0x55, 0x52, 0x4e, 0x45, 0x44, 0x5f, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x53, 0x5f, 0x4f, - 0x54, 0x48, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0x02, 0x12, 0x23, 0x0a, 0x1f, - 0x42, 0x55, 0x52, 0x4e, 0x45, 0x44, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x53, 0x5f, 0x4d, - 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x42, 0x43, 0x48, 0x5f, 0x56, 0x4f, 0x55, 0x54, 0x10, - 0x03, 0x12, 0x26, 0x0a, 0x22, 0x42, 0x55, 0x52, 0x4e, 0x45, 0x44, 0x5f, 0x49, 0x4e, 0x50, 0x55, - 0x54, 0x53, 0x5f, 0x47, 0x52, 0x45, 0x41, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x48, 0x41, 0x4e, 0x5f, - 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x53, 0x10, 0x04, 0x42, 0x0d, 0x0a, 0x0b, 0x74, 0x78, 0x5f, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xf3, 0x01, 0x0a, 0x14, 0x53, 0x6c, 0x70, - 0x56, 0x31, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x14, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x17, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, + 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, + 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x16, + 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x16, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x15, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x26, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x43, 0x4f, 0x4e, + 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, + 0x49, 0x52, 0x4d, 0x45, 0x44, 0x10, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x84, 0x03, 0x0a, 0x09, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, + 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, + 0x6f, 0x74, 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, 0x12, 0x0a, 0x04, 0x62, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, + 0x62, 0x69, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, + 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, + 0x61, 0x73, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0a, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xf6, 0x01, + 0x0a, 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x44, 0x0a, 0x10, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, + 0x1a, 0x83, 0x01, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, + 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, + 0x68, 0x12, 0x33, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x74, 0x78, 0x69, 0x64, 0x73, 0x5f, + 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x73, 0x22, 0xef, 0x07, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x06, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x07, 0x6f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x48, 0x0a, 0x14, + 0x73, 0x6c, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x2e, + 0x53, 0x6c, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x12, 0x73, 0x6c, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0xda, 0x02, 0x0a, 0x05, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x3a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, + 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, + 0x75, 0x73, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x29, 0x0a, 0x09, 0x73, 0x6c, 0x70, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x52, 0x08, 0x73, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0x34, 0x0a, + 0x08, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, + 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x1a, 0xf2, 0x01, 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x75, + 0x62, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0c, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, + 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x13, + 0x64, 0x69, 0x73, 0x61, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x64, 0x69, 0x73, 0x61, 0x73, + 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x29, 0x0a, + 0x09, 0x73, 0x6c, 0x70, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x08, + 0x73, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xe6, 0x01, 0x0a, 0x12, 0x4d, 0x65, 0x6d, + 0x70, 0x6f, 0x6f, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x31, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x64, 0x64, 0x65, 0x64, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x61, 0x64, 0x64, 0x65, 0x64, 0x48, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x66, 0x65, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x03, 0x66, 0x65, 0x65, 0x12, 0x1c, 0x0a, 0x0a, 0x66, 0x65, 0x65, 0x5f, 0x70, 0x65, + 0x72, 0x5f, 0x6b, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x66, 0x65, 0x65, 0x50, + 0x65, 0x72, 0x4b, 0x62, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, + 0x5f, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x10, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x22, 0xf5, 0x01, 0x0a, 0x0d, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x12, 0x3a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x4f, 0x75, 0x74, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, + 0x23, 0x0a, 0x0d, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x53, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x73, + 0x5f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x69, 0x73, 0x43, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x29, + 0x0a, 0x09, 0x73, 0x6c, 0x70, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, + 0x08, 0x73, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x95, 0x02, 0x0a, 0x11, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, + 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x3c, 0x0a, + 0x09, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x52, 0x09, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x64, + 0x61, 0x74, 0x61, 0x5f, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0c, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x29, 0x0a, 0x10, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x6c, 0x6c, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x61, + 0x6c, 0x6c, 0x5f, 0x73, 0x6c, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x61, 0x6c, 0x6c, 0x53, 0x6c, + 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x22, 0x0a, + 0x0d, 0x73, 0x6c, 0x70, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0b, 0x73, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, + 0x73, 0x22, 0xfa, 0x01, 0x0a, 0x08, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x19, + 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x06, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x06, 0x61, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x6d, 0x69, 0x6e, 0x74, + 0x5f, 0x62, 0x61, 0x74, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, + 0x4d, 0x69, 0x6e, 0x74, 0x42, 0x61, 0x74, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x12, + 0x2c, 0x0a, 0x0a, 0x73, 0x6c, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x09, 0x73, 0x6c, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, + 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0xe3, + 0x06, 0x0a, 0x12, 0x53, 0x6c, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x0a, 0x73, 0x6c, 0x70, 0x5f, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x53, + 0x6c, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x73, 0x6c, 0x70, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x57, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, + 0x6a, 0x75, 0x64, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x28, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, + 0x4a, 0x75, 0x64, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x4a, 0x75, 0x64, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x73, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x19, 0x0a, + 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x62, 0x75, 0x72, 0x6e, + 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x70, + 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x42, 0x75, 0x72, 0x6e, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x52, 0x09, + 0x62, 0x75, 0x72, 0x6e, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x76, 0x31, 0x5f, + 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x56, 0x31, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x09, 0x76, 0x31, 0x47, 0x65, 0x6e, + 0x65, 0x73, 0x69, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x76, 0x31, 0x5f, 0x6d, 0x69, 0x6e, 0x74, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x56, 0x31, + 0x4d, 0x69, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x06, + 0x76, 0x31, 0x4d, 0x69, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x07, 0x76, 0x31, 0x5f, 0x73, 0x65, 0x6e, + 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, + 0x56, 0x31, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, + 0x52, 0x06, 0x76, 0x31, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x56, 0x0a, 0x15, 0x76, 0x31, 0x5f, 0x6e, + 0x66, 0x74, 0x31, 0x5f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, + 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, + 0x56, 0x31, 0x4e, 0x66, 0x74, 0x31, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x47, 0x65, 0x6e, 0x65, 0x73, + 0x69, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x12, 0x76, 0x31, + 0x4e, 0x66, 0x74, 0x31, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, + 0x12, 0x4d, 0x0a, 0x12, 0x76, 0x31, 0x5f, 0x6e, 0x66, 0x74, 0x31, 0x5f, 0x63, 0x68, 0x69, 0x6c, + 0x64, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, + 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x56, 0x31, 0x4e, 0x66, 0x74, 0x31, 0x43, 0x68, 0x69, 0x6c, 0x64, + 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0f, + 0x76, 0x31, 0x4e, 0x66, 0x74, 0x31, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x53, 0x65, 0x6e, 0x64, 0x22, + 0x36, 0x0a, 0x11, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4a, 0x75, 0x64, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x12, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, + 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x01, 0x22, 0xbb, 0x01, 0x0a, 0x09, 0x42, 0x75, 0x72, 0x6e, + 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x55, 0x52, 0x4e, 0x45, 0x44, 0x5f, + 0x49, 0x4e, 0x50, 0x55, 0x54, 0x53, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x53, 0x5f, 0x54, + 0x4f, 0x4f, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x52, + 0x4e, 0x45, 0x44, 0x5f, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x53, 0x5f, 0x42, 0x41, 0x44, 0x5f, 0x4f, + 0x50, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x42, 0x55, 0x52, + 0x4e, 0x45, 0x44, 0x5f, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x53, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, + 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0x02, 0x12, 0x23, 0x0a, 0x1f, 0x42, 0x55, 0x52, 0x4e, + 0x45, 0x44, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x53, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, + 0x4e, 0x47, 0x5f, 0x42, 0x43, 0x48, 0x5f, 0x56, 0x4f, 0x55, 0x54, 0x10, 0x03, 0x12, 0x26, 0x0a, + 0x22, 0x42, 0x55, 0x52, 0x4e, 0x45, 0x44, 0x5f, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x53, 0x5f, 0x47, + 0x52, 0x45, 0x41, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x48, 0x41, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, + 0x55, 0x54, 0x53, 0x10, 0x04, 0x42, 0x0d, 0x0a, 0x0b, 0x74, 0x78, 0x5f, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x22, 0xf3, 0x01, 0x0a, 0x14, 0x53, 0x6c, 0x70, 0x56, 0x31, 0x47, 0x65, + 0x6e, 0x65, 0x73, 0x69, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, + 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x12, 0x26, 0x0a, + 0x0f, 0x6d, 0x69, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x74, 0x6f, 0x6e, 0x5f, 0x76, 0x6f, 0x75, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x74, 0x42, 0x61, 0x74, 0x6f, + 0x6e, 0x56, 0x6f, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x0b, 0x6d, 0x69, 0x6e, 0x74, 0x5f, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x0a, + 0x6d, 0x69, 0x6e, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x60, 0x0a, 0x11, 0x53, 0x6c, + 0x70, 0x56, 0x31, 0x4d, 0x69, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x26, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x74, 0x6f, 0x6e, 0x5f, 0x76, 0x6f, + 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x74, 0x42, 0x61, + 0x74, 0x6f, 0x6e, 0x56, 0x6f, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x0b, 0x6d, 0x69, 0x6e, 0x74, 0x5f, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, + 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x31, 0x0a, 0x11, + 0x53, 0x6c, 0x70, 0x56, 0x31, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x1c, 0x0a, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, + 0xd5, 0x01, 0x0a, 0x1d, 0x53, 0x6c, 0x70, 0x56, 0x31, 0x4e, 0x66, 0x74, 0x31, 0x43, 0x68, 0x69, + 0x6c, 0x64, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x12, 0x21, 0x0a, @@ -6429,76 +6611,33 @@ var file_bchrpc_proto_rawDesc = []byte{ 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, - 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x74, 0x6f, 0x6e, 0x5f, - 0x76, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x74, - 0x42, 0x61, 0x74, 0x6f, 0x6e, 0x56, 0x6f, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x0b, 0x6d, 0x69, 0x6e, - 0x74, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, - 0x30, 0x01, 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x60, - 0x0a, 0x11, 0x53, 0x6c, 0x70, 0x56, 0x31, 0x4d, 0x69, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x74, 0x6f, - 0x6e, 0x5f, 0x76, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6d, 0x69, - 0x6e, 0x74, 0x42, 0x61, 0x74, 0x6f, 0x6e, 0x56, 0x6f, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x0b, 0x6d, - 0x69, 0x6e, 0x74, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x42, 0x02, 0x30, 0x01, 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x31, 0x0a, 0x11, 0x53, 0x6c, 0x70, 0x56, 0x31, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1c, 0x0a, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x07, 0x61, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x73, 0x22, 0xd5, 0x01, 0x0a, 0x1d, 0x53, 0x6c, 0x70, 0x56, 0x31, 0x4e, 0x66, 0x74, - 0x31, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, - 0x6b, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, - 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x63, - 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x64, 0x65, 0x63, - 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x22, 0x42, 0x0a, 0x1a, 0x53, - 0x6c, 0x70, 0x56, 0x31, 0x4e, 0x66, 0x74, 0x31, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x53, 0x65, 0x6e, - 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0e, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x22, - 0xc5, 0x08, 0x0a, 0x10, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x12, - 0x2f, 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x42, 0x0a, 0x0b, 0x76, 0x31, 0x5f, 0x66, 0x75, 0x6e, 0x67, 0x69, 0x62, 0x6c, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x31, 0x46, 0x75, - 0x6e, 0x67, 0x69, 0x62, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x76, 0x31, 0x46, 0x75, 0x6e, 0x67, - 0x69, 0x62, 0x6c, 0x65, 0x12, 0x46, 0x0a, 0x0d, 0x76, 0x31, 0x5f, 0x6e, 0x66, 0x74, 0x31, 0x5f, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x62, - 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x56, 0x31, 0x4e, 0x46, 0x54, 0x31, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, - 0x0b, 0x76, 0x31, 0x4e, 0x66, 0x74, 0x31, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x46, 0x0a, 0x0d, - 0x76, 0x31, 0x5f, 0x6e, 0x66, 0x74, 0x31, 0x5f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x31, 0x4e, 0x46, 0x54, 0x31, - 0x43, 0x68, 0x69, 0x6c, 0x64, 0x48, 0x00, 0x52, 0x0b, 0x76, 0x31, 0x4e, 0x66, 0x74, 0x31, 0x43, - 0x68, 0x69, 0x6c, 0x64, 0x1a, 0x98, 0x02, 0x0a, 0x0a, 0x56, 0x31, 0x46, 0x75, 0x6e, 0x67, 0x69, - 0x62, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x69, 0x63, - 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x54, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x55, 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x11, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x48, - 0x61, 0x73, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x12, - 0x26, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x74, 0x6f, 0x6e, 0x5f, 0x68, 0x61, - 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x74, 0x42, 0x61, - 0x74, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x74, 0x5f, - 0x62, 0x61, 0x74, 0x6f, 0x6e, 0x5f, 0x76, 0x6f, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x74, 0x42, 0x61, 0x74, 0x6f, 0x6e, 0x56, 0x6f, 0x75, 0x74, 0x1a, - 0x99, 0x02, 0x0a, 0x0b, 0x56, 0x31, 0x4e, 0x46, 0x54, 0x31, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, + 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x22, 0x42, 0x0a, 0x1a, 0x53, 0x6c, 0x70, 0x56, 0x31, + 0x4e, 0x66, 0x74, 0x31, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x22, 0xc5, 0x08, 0x0a, 0x10, + 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x0a, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x42, 0x0a, 0x0b, + 0x76, 0x31, 0x5f, 0x66, 0x75, 0x6e, 0x67, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x31, 0x46, 0x75, 0x6e, 0x67, 0x69, 0x62, + 0x6c, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x76, 0x31, 0x46, 0x75, 0x6e, 0x67, 0x69, 0x62, 0x6c, 0x65, + 0x12, 0x46, 0x0a, 0x0d, 0x76, 0x31, 0x5f, 0x6e, 0x66, 0x74, 0x31, 0x5f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x31, + 0x4e, 0x46, 0x54, 0x31, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x76, 0x31, 0x4e, + 0x66, 0x74, 0x31, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x46, 0x0a, 0x0d, 0x76, 0x31, 0x5f, 0x6e, + 0x66, 0x74, 0x31, 0x5f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x31, 0x4e, 0x46, 0x54, 0x31, 0x43, 0x68, 0x69, 0x6c, + 0x64, 0x48, 0x00, 0x52, 0x0b, 0x76, 0x31, 0x4e, 0x66, 0x74, 0x31, 0x43, 0x68, 0x69, 0x6c, 0x64, + 0x1a, 0x98, 0x02, 0x0a, 0x0a, 0x56, 0x31, 0x46, 0x75, 0x6e, 0x67, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, @@ -6515,8 +6654,8 @@ var file_bchrpc_proto_rawDesc = []byte{ 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x74, 0x42, 0x61, 0x74, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x74, 0x6f, 0x6e, 0x5f, 0x76, 0x6f, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6d, 0x69, - 0x6e, 0x74, 0x42, 0x61, 0x74, 0x6f, 0x6e, 0x56, 0x6f, 0x75, 0x74, 0x1a, 0xc8, 0x01, 0x0a, 0x0b, - 0x56, 0x31, 0x4e, 0x46, 0x54, 0x31, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x74, + 0x6e, 0x74, 0x42, 0x61, 0x74, 0x6f, 0x6e, 0x56, 0x6f, 0x75, 0x74, 0x1a, 0x99, 0x02, 0x0a, 0x0b, + 0x56, 0x31, 0x4e, 0x46, 0x54, 0x31, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, @@ -6526,142 +6665,165 @@ var file_bchrpc_proto_rawDesc = []byte{ 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xf3, 0x01, 0x0a, 0x0f, 0x53, 0x6c, 0x70, 0x52, - 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x42, 0x75, 0x72, 0x6e, 0x12, 0x3a, 0x0a, 0x08, 0x6f, - 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, - 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, - 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x48, 0x00, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x74, 0x6f, 0x6e, 0x5f, - 0x76, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x69, - 0x6e, 0x74, 0x42, 0x61, 0x74, 0x6f, 0x6e, 0x56, 0x6f, 0x75, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x62, - 0x75, 0x72, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x5b, 0x0a, - 0x0c, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x13, 0x0a, - 0x0f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x45, 0x54, - 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x56, 0x31, 0x5f, 0x46, 0x55, 0x4e, 0x47, 0x49, 0x42, 0x4c, - 0x45, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x56, 0x31, 0x5f, 0x4e, 0x46, 0x54, 0x31, 0x5f, 0x43, - 0x48, 0x49, 0x4c, 0x44, 0x10, 0x41, 0x12, 0x12, 0x0a, 0x0d, 0x56, 0x31, 0x5f, 0x4e, 0x46, 0x54, - 0x31, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x81, 0x01, 0x2a, 0xb2, 0x02, 0x0a, 0x09, 0x53, - 0x6c, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x4e, 0x5f, - 0x53, 0x4c, 0x50, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x4f, 0x4e, 0x5f, 0x53, 0x4c, 0x50, - 0x5f, 0x42, 0x55, 0x52, 0x4e, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x4c, 0x50, 0x5f, 0x50, - 0x41, 0x52, 0x53, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, - 0x53, 0x4c, 0x50, 0x5f, 0x55, 0x4e, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x5f, - 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x4c, 0x50, - 0x5f, 0x56, 0x31, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x53, 0x49, 0x53, 0x10, 0x04, 0x12, 0x0f, 0x0a, - 0x0b, 0x53, 0x4c, 0x50, 0x5f, 0x56, 0x31, 0x5f, 0x4d, 0x49, 0x4e, 0x54, 0x10, 0x05, 0x12, 0x0f, - 0x0a, 0x0b, 0x53, 0x4c, 0x50, 0x5f, 0x56, 0x31, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x10, 0x06, 0x12, - 0x1d, 0x0a, 0x19, 0x53, 0x4c, 0x50, 0x5f, 0x56, 0x31, 0x5f, 0x4e, 0x46, 0x54, 0x31, 0x5f, 0x47, - 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x53, 0x49, 0x53, 0x10, 0x07, 0x12, 0x1a, - 0x0a, 0x16, 0x53, 0x4c, 0x50, 0x5f, 0x56, 0x31, 0x5f, 0x4e, 0x46, 0x54, 0x31, 0x5f, 0x47, 0x52, - 0x4f, 0x55, 0x50, 0x5f, 0x4d, 0x49, 0x4e, 0x54, 0x10, 0x08, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x4c, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x64, + 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x74, 0x5f, + 0x62, 0x61, 0x74, 0x6f, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x74, 0x42, 0x61, 0x74, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x12, + 0x26, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x74, 0x6f, 0x6e, 0x5f, 0x76, 0x6f, + 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x74, 0x42, 0x61, + 0x74, 0x6f, 0x6e, 0x56, 0x6f, 0x75, 0x74, 0x1a, 0xc8, 0x01, 0x0a, 0x0b, 0x56, 0x31, 0x4e, 0x46, + 0x54, 0x31, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x5f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x5f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x49, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x22, 0xf3, 0x01, 0x0a, 0x0f, 0x53, 0x6c, 0x70, 0x52, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x42, 0x75, 0x72, 0x6e, 0x12, 0x3a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x2e, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x2f, + 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x1c, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x42, + 0x02, 0x30, 0x01, 0x48, 0x00, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, + 0x0f, 0x6d, 0x69, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x74, 0x6f, 0x6e, 0x5f, 0x76, 0x6f, 0x75, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x74, 0x42, 0x61, + 0x74, 0x6f, 0x6e, 0x56, 0x6f, 0x75, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x62, 0x75, 0x72, 0x6e, 0x5f, + 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x5b, 0x0a, 0x0c, 0x53, 0x6c, 0x70, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x56, 0x45, 0x52, + 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x0f, + 0x0a, 0x0b, 0x56, 0x31, 0x5f, 0x46, 0x55, 0x4e, 0x47, 0x49, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, + 0x11, 0x0a, 0x0d, 0x56, 0x31, 0x5f, 0x4e, 0x46, 0x54, 0x31, 0x5f, 0x43, 0x48, 0x49, 0x4c, 0x44, + 0x10, 0x41, 0x12, 0x12, 0x0a, 0x0d, 0x56, 0x31, 0x5f, 0x4e, 0x46, 0x54, 0x31, 0x5f, 0x47, 0x52, + 0x4f, 0x55, 0x50, 0x10, 0x81, 0x01, 0x2a, 0xb2, 0x02, 0x0a, 0x09, 0x53, 0x6c, 0x70, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x4e, 0x5f, 0x53, 0x4c, 0x50, 0x10, + 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x4f, 0x4e, 0x5f, 0x53, 0x4c, 0x50, 0x5f, 0x42, 0x55, 0x52, + 0x4e, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x4c, 0x50, 0x5f, 0x50, 0x41, 0x52, 0x53, 0x45, + 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x4c, 0x50, 0x5f, + 0x55, 0x4e, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x5f, 0x56, 0x45, 0x52, 0x53, + 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x4c, 0x50, 0x5f, 0x56, 0x31, 0x5f, + 0x47, 0x45, 0x4e, 0x45, 0x53, 0x49, 0x53, 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4c, 0x50, + 0x5f, 0x56, 0x31, 0x5f, 0x4d, 0x49, 0x4e, 0x54, 0x10, 0x05, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4c, + 0x50, 0x5f, 0x56, 0x31, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x10, 0x06, 0x12, 0x1d, 0x0a, 0x19, 0x53, + 0x4c, 0x50, 0x5f, 0x56, 0x31, 0x5f, 0x4e, 0x46, 0x54, 0x31, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, + 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x53, 0x49, 0x53, 0x10, 0x07, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x4c, 0x50, 0x5f, 0x56, 0x31, 0x5f, 0x4e, 0x46, 0x54, 0x31, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, - 0x53, 0x45, 0x4e, 0x44, 0x10, 0x09, 0x12, 0x24, 0x0a, 0x20, 0x53, 0x4c, 0x50, 0x5f, 0x56, 0x31, - 0x5f, 0x4e, 0x46, 0x54, 0x31, 0x5f, 0x55, 0x4e, 0x49, 0x51, 0x55, 0x45, 0x5f, 0x43, 0x48, 0x49, - 0x4c, 0x44, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x53, 0x49, 0x53, 0x10, 0x0a, 0x12, 0x21, 0x0a, 0x1d, - 0x53, 0x4c, 0x50, 0x5f, 0x56, 0x31, 0x5f, 0x4e, 0x46, 0x54, 0x31, 0x5f, 0x55, 0x4e, 0x49, 0x51, - 0x55, 0x45, 0x5f, 0x43, 0x48, 0x49, 0x4c, 0x44, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x10, 0x0b, 0x32, - 0xf1, 0x0e, 0x0a, 0x06, 0x62, 0x63, 0x68, 0x72, 0x70, 0x63, 0x12, 0x49, 0x0a, 0x0e, 0x47, 0x65, - 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x19, 0x2e, 0x70, - 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, - 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, - 0x6f, 0x6f, 0x6c, 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, - 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x70, 0x62, 0x2e, - 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x2e, 0x70, 0x62, 0x2e, 0x47, - 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x17, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, - 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x37, 0x0a, - 0x08, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x47, - 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, - 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, - 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, - 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x70, 0x62, 0x2e, - 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x73, 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, - 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, - 0x11, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x61, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x2e, 0x70, 0x62, - 0x2e, 0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x24, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, - 0x52, 0x61, 0x77, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x4d, 0x49, 0x4e, 0x54, 0x10, 0x08, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x4c, 0x50, 0x5f, 0x56, 0x31, + 0x5f, 0x4e, 0x46, 0x54, 0x31, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x45, 0x4e, 0x44, + 0x10, 0x09, 0x12, 0x24, 0x0a, 0x20, 0x53, 0x4c, 0x50, 0x5f, 0x56, 0x31, 0x5f, 0x4e, 0x46, 0x54, + 0x31, 0x5f, 0x55, 0x4e, 0x49, 0x51, 0x55, 0x45, 0x5f, 0x43, 0x48, 0x49, 0x4c, 0x44, 0x5f, 0x47, + 0x45, 0x4e, 0x45, 0x53, 0x49, 0x53, 0x10, 0x0a, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x4c, 0x50, 0x5f, + 0x56, 0x31, 0x5f, 0x4e, 0x46, 0x54, 0x31, 0x5f, 0x55, 0x4e, 0x49, 0x51, 0x55, 0x45, 0x5f, 0x43, + 0x48, 0x49, 0x4c, 0x44, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x10, 0x0b, 0x32, 0xc5, 0x0f, 0x0a, 0x06, + 0x62, 0x63, 0x68, 0x72, 0x70, 0x63, 0x12, 0x49, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, + 0x70, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, + 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, + 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x3d, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x12, + 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, + 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x52, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x17, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, + 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x37, 0x0a, 0x08, 0x47, 0x65, 0x74, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x70, 0x62, 0x2e, + 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x70, 0x62, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x61, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x3d, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x15, 0x2e, + 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, + 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x62, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x11, 0x47, 0x65, 0x74, + 0x52, 0x61, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, + 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x70, + 0x62, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, + 0x16, 0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x70, 0x62, 0x2e, + 0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x67, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x6e, - 0x73, 0x70, 0x65, 0x6e, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x70, - 0x62, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x6e, 0x73, 0x70, - 0x65, 0x6e, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x24, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x10, 0x47, 0x65, 0x74, - 0x55, 0x6e, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x1b, 0x2e, - 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x70, 0x62, 0x2e, - 0x47, 0x65, 0x74, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0e, 0x47, 0x65, - 0x74, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x19, 0x2e, 0x70, - 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, - 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1e, 0x2e, 0x70, - 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x70, - 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x55, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x53, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x1d, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6c, - 0x70, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, - 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x64, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, - 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x22, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x54, 0x72, 0x75, + 0x12, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x24, 0x2e, + 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x67, 0x0a, 0x18, + 0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x6e, + 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, + 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, + 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x6e, 0x73, + 0x70, 0x65, 0x6e, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x73, 0x70, + 0x65, 0x6e, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x1b, 0x2e, 0x70, 0x62, 0x2e, 0x47, + 0x65, 0x74, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x55, + 0x6e, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x72, + 0x6b, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, + 0x74, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x72, 0x6b, + 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x58, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1e, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, + 0x74, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, + 0x74, 0x53, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x12, 0x47, + 0x65, 0x74, 0x53, 0x6c, 0x70, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x12, 0x1d, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x50, 0x61, 0x72, + 0x73, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x50, 0x61, 0x72, 0x73, + 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x64, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, + 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x23, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6c, - 0x70, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x13, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, + 0x6c, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x1c, 0x2e, + 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x70, 0x62, + 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x13, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x6c, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x6c, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, @@ -6708,7 +6870,7 @@ func file_bchrpc_proto_rawDescGZIP() []byte { } var file_bchrpc_proto_enumTypes = make([]protoimpl.EnumInfo, 7) -var file_bchrpc_proto_msgTypes = make([]protoimpl.MessageInfo, 69) +var file_bchrpc_proto_msgTypes = make([]protoimpl.MessageInfo, 71) var file_bchrpc_proto_goTypes = []interface{}{ (SlpTokenType)(0), // 0: pb.SlpTokenType (SlpAction)(0), // 1: pb.SlpAction @@ -6759,102 +6921,104 @@ var file_bchrpc_proto_goTypes = []interface{}{ (*GetSlpParsedScriptResponse)(nil), // 46: pb.GetSlpParsedScriptResponse (*GetSlpTrustedValidationRequest)(nil), // 47: pb.GetSlpTrustedValidationRequest (*GetSlpTrustedValidationResponse)(nil), // 48: pb.GetSlpTrustedValidationResponse - (*BlockNotification)(nil), // 49: pb.BlockNotification - (*TransactionNotification)(nil), // 50: pb.TransactionNotification - (*BlockInfo)(nil), // 51: pb.BlockInfo - (*Block)(nil), // 52: pb.Block - (*Transaction)(nil), // 53: pb.Transaction - (*MempoolTransaction)(nil), // 54: pb.MempoolTransaction - (*UnspentOutput)(nil), // 55: pb.UnspentOutput - (*TransactionFilter)(nil), // 56: pb.TransactionFilter - (*SlpToken)(nil), // 57: pb.SlpToken - (*SlpTransactionInfo)(nil), // 58: pb.SlpTransactionInfo - (*SlpV1GenesisMetadata)(nil), // 59: pb.SlpV1GenesisMetadata - (*SlpV1MintMetadata)(nil), // 60: pb.SlpV1MintMetadata - (*SlpV1SendMetadata)(nil), // 61: pb.SlpV1SendMetadata - (*SlpV1Nft1ChildGenesisMetadata)(nil), // 62: pb.SlpV1Nft1ChildGenesisMetadata - (*SlpV1Nft1ChildSendMetadata)(nil), // 63: pb.SlpV1Nft1ChildSendMetadata - (*SlpTokenMetadata)(nil), // 64: pb.SlpTokenMetadata - (*SlpRequiredBurn)(nil), // 65: pb.SlpRequiredBurn - (*GetMempoolResponse_TransactionData)(nil), // 66: pb.GetMempoolResponse.TransactionData - (*GetSlpTrustedValidationRequest_Query)(nil), // 67: pb.GetSlpTrustedValidationRequest.Query - (*GetSlpTrustedValidationResponse_ValidityResult)(nil), // 68: pb.GetSlpTrustedValidationResponse.ValidityResult - (*Block_TransactionData)(nil), // 69: pb.Block.TransactionData - (*Transaction_Input)(nil), // 70: pb.Transaction.Input - (*Transaction_Output)(nil), // 71: pb.Transaction.Output - (*Transaction_Input_Outpoint)(nil), // 72: pb.Transaction.Input.Outpoint - (*SlpTokenMetadata_V1Fungible)(nil), // 73: pb.SlpTokenMetadata.V1Fungible - (*SlpTokenMetadata_V1NFT1Group)(nil), // 74: pb.SlpTokenMetadata.V1NFT1Group - (*SlpTokenMetadata_V1NFT1Child)(nil), // 75: pb.SlpTokenMetadata.V1NFT1Child + (*GetSlpGraphSearchRequest)(nil), // 49: pb.GetSlpGraphSearchRequest + (*GetSlpGraphSearchResponse)(nil), // 50: pb.GetSlpGraphSearchResponse + (*BlockNotification)(nil), // 51: pb.BlockNotification + (*TransactionNotification)(nil), // 52: pb.TransactionNotification + (*BlockInfo)(nil), // 53: pb.BlockInfo + (*Block)(nil), // 54: pb.Block + (*Transaction)(nil), // 55: pb.Transaction + (*MempoolTransaction)(nil), // 56: pb.MempoolTransaction + (*UnspentOutput)(nil), // 57: pb.UnspentOutput + (*TransactionFilter)(nil), // 58: pb.TransactionFilter + (*SlpToken)(nil), // 59: pb.SlpToken + (*SlpTransactionInfo)(nil), // 60: pb.SlpTransactionInfo + (*SlpV1GenesisMetadata)(nil), // 61: pb.SlpV1GenesisMetadata + (*SlpV1MintMetadata)(nil), // 62: pb.SlpV1MintMetadata + (*SlpV1SendMetadata)(nil), // 63: pb.SlpV1SendMetadata + (*SlpV1Nft1ChildGenesisMetadata)(nil), // 64: pb.SlpV1Nft1ChildGenesisMetadata + (*SlpV1Nft1ChildSendMetadata)(nil), // 65: pb.SlpV1Nft1ChildSendMetadata + (*SlpTokenMetadata)(nil), // 66: pb.SlpTokenMetadata + (*SlpRequiredBurn)(nil), // 67: pb.SlpRequiredBurn + (*GetMempoolResponse_TransactionData)(nil), // 68: pb.GetMempoolResponse.TransactionData + (*GetSlpTrustedValidationRequest_Query)(nil), // 69: pb.GetSlpTrustedValidationRequest.Query + (*GetSlpTrustedValidationResponse_ValidityResult)(nil), // 70: pb.GetSlpTrustedValidationResponse.ValidityResult + (*Block_TransactionData)(nil), // 71: pb.Block.TransactionData + (*Transaction_Input)(nil), // 72: pb.Transaction.Input + (*Transaction_Output)(nil), // 73: pb.Transaction.Output + (*Transaction_Input_Outpoint)(nil), // 74: pb.Transaction.Input.Outpoint + (*SlpTokenMetadata_V1Fungible)(nil), // 75: pb.SlpTokenMetadata.V1Fungible + (*SlpTokenMetadata_V1NFT1Group)(nil), // 76: pb.SlpTokenMetadata.V1NFT1Group + (*SlpTokenMetadata_V1NFT1Child)(nil), // 77: pb.SlpTokenMetadata.V1NFT1Child } var file_bchrpc_proto_depIdxs = []int32{ - 66, // 0: pb.GetMempoolResponse.transaction_data:type_name -> pb.GetMempoolResponse.TransactionData + 68, // 0: pb.GetMempoolResponse.transaction_data:type_name -> pb.GetMempoolResponse.TransactionData 2, // 1: pb.GetBlockchainInfoResponse.bitcoin_net:type_name -> pb.GetBlockchainInfoResponse.BitcoinNet - 51, // 2: pb.GetBlockInfoResponse.info:type_name -> pb.BlockInfo - 52, // 3: pb.GetBlockResponse.block:type_name -> pb.Block - 51, // 4: pb.GetHeadersResponse.headers:type_name -> pb.BlockInfo - 53, // 5: pb.GetTransactionResponse.transaction:type_name -> pb.Transaction - 64, // 6: pb.GetTransactionResponse.token_metadata:type_name -> pb.SlpTokenMetadata - 53, // 7: pb.GetAddressTransactionsResponse.confirmed_transactions:type_name -> pb.Transaction - 54, // 8: pb.GetAddressTransactionsResponse.unconfirmed_transactions:type_name -> pb.MempoolTransaction - 55, // 9: pb.GetAddressUnspentOutputsResponse.outputs:type_name -> pb.UnspentOutput - 64, // 10: pb.GetAddressUnspentOutputsResponse.token_metadata:type_name -> pb.SlpTokenMetadata - 72, // 11: pb.GetUnspentOutputResponse.outpoint:type_name -> pb.Transaction.Input.Outpoint - 57, // 12: pb.GetUnspentOutputResponse.slp_token:type_name -> pb.SlpToken - 64, // 13: pb.GetUnspentOutputResponse.token_metadata:type_name -> pb.SlpTokenMetadata - 51, // 14: pb.GetMerkleProofResponse.block:type_name -> pb.BlockInfo - 65, // 15: pb.SubmitTransactionRequest.required_slp_burns:type_name -> pb.SlpRequiredBurn - 65, // 16: pb.CheckSlpTransactionRequest.required_slp_burns:type_name -> pb.SlpRequiredBurn - 56, // 17: pb.SubscribeTransactionsRequest.subscribe:type_name -> pb.TransactionFilter - 56, // 18: pb.SubscribeTransactionsRequest.unsubscribe:type_name -> pb.TransactionFilter - 64, // 19: pb.GetSlpTokenMetadataResponse.token_metadata:type_name -> pb.SlpTokenMetadata + 53, // 2: pb.GetBlockInfoResponse.info:type_name -> pb.BlockInfo + 54, // 3: pb.GetBlockResponse.block:type_name -> pb.Block + 53, // 4: pb.GetHeadersResponse.headers:type_name -> pb.BlockInfo + 55, // 5: pb.GetTransactionResponse.transaction:type_name -> pb.Transaction + 66, // 6: pb.GetTransactionResponse.token_metadata:type_name -> pb.SlpTokenMetadata + 55, // 7: pb.GetAddressTransactionsResponse.confirmed_transactions:type_name -> pb.Transaction + 56, // 8: pb.GetAddressTransactionsResponse.unconfirmed_transactions:type_name -> pb.MempoolTransaction + 57, // 9: pb.GetAddressUnspentOutputsResponse.outputs:type_name -> pb.UnspentOutput + 66, // 10: pb.GetAddressUnspentOutputsResponse.token_metadata:type_name -> pb.SlpTokenMetadata + 74, // 11: pb.GetUnspentOutputResponse.outpoint:type_name -> pb.Transaction.Input.Outpoint + 59, // 12: pb.GetUnspentOutputResponse.slp_token:type_name -> pb.SlpToken + 66, // 13: pb.GetUnspentOutputResponse.token_metadata:type_name -> pb.SlpTokenMetadata + 53, // 14: pb.GetMerkleProofResponse.block:type_name -> pb.BlockInfo + 67, // 15: pb.SubmitTransactionRequest.required_slp_burns:type_name -> pb.SlpRequiredBurn + 67, // 16: pb.CheckSlpTransactionRequest.required_slp_burns:type_name -> pb.SlpRequiredBurn + 58, // 17: pb.SubscribeTransactionsRequest.subscribe:type_name -> pb.TransactionFilter + 58, // 18: pb.SubscribeTransactionsRequest.unsubscribe:type_name -> pb.TransactionFilter + 66, // 19: pb.GetSlpTokenMetadataResponse.token_metadata:type_name -> pb.SlpTokenMetadata 1, // 20: pb.GetSlpParsedScriptResponse.slp_action:type_name -> pb.SlpAction 0, // 21: pb.GetSlpParsedScriptResponse.token_type:type_name -> pb.SlpTokenType - 59, // 22: pb.GetSlpParsedScriptResponse.v1_genesis:type_name -> pb.SlpV1GenesisMetadata - 60, // 23: pb.GetSlpParsedScriptResponse.v1_mint:type_name -> pb.SlpV1MintMetadata - 61, // 24: pb.GetSlpParsedScriptResponse.v1_send:type_name -> pb.SlpV1SendMetadata - 62, // 25: pb.GetSlpParsedScriptResponse.v1_nft1_child_genesis:type_name -> pb.SlpV1Nft1ChildGenesisMetadata - 63, // 26: pb.GetSlpParsedScriptResponse.v1_nft1_child_send:type_name -> pb.SlpV1Nft1ChildSendMetadata - 67, // 27: pb.GetSlpTrustedValidationRequest.queries:type_name -> pb.GetSlpTrustedValidationRequest.Query - 68, // 28: pb.GetSlpTrustedValidationResponse.results:type_name -> pb.GetSlpTrustedValidationResponse.ValidityResult + 61, // 22: pb.GetSlpParsedScriptResponse.v1_genesis:type_name -> pb.SlpV1GenesisMetadata + 62, // 23: pb.GetSlpParsedScriptResponse.v1_mint:type_name -> pb.SlpV1MintMetadata + 63, // 24: pb.GetSlpParsedScriptResponse.v1_send:type_name -> pb.SlpV1SendMetadata + 64, // 25: pb.GetSlpParsedScriptResponse.v1_nft1_child_genesis:type_name -> pb.SlpV1Nft1ChildGenesisMetadata + 65, // 26: pb.GetSlpParsedScriptResponse.v1_nft1_child_send:type_name -> pb.SlpV1Nft1ChildSendMetadata + 69, // 27: pb.GetSlpTrustedValidationRequest.queries:type_name -> pb.GetSlpTrustedValidationRequest.Query + 70, // 28: pb.GetSlpTrustedValidationResponse.results:type_name -> pb.GetSlpTrustedValidationResponse.ValidityResult 3, // 29: pb.BlockNotification.type:type_name -> pb.BlockNotification.Type - 51, // 30: pb.BlockNotification.block_info:type_name -> pb.BlockInfo - 52, // 31: pb.BlockNotification.marshaled_block:type_name -> pb.Block + 53, // 30: pb.BlockNotification.block_info:type_name -> pb.BlockInfo + 54, // 31: pb.BlockNotification.marshaled_block:type_name -> pb.Block 4, // 32: pb.TransactionNotification.type:type_name -> pb.TransactionNotification.Type - 53, // 33: pb.TransactionNotification.confirmed_transaction:type_name -> pb.Transaction - 54, // 34: pb.TransactionNotification.unconfirmed_transaction:type_name -> pb.MempoolTransaction - 51, // 35: pb.Block.info:type_name -> pb.BlockInfo - 69, // 36: pb.Block.transaction_data:type_name -> pb.Block.TransactionData - 70, // 37: pb.Transaction.inputs:type_name -> pb.Transaction.Input - 71, // 38: pb.Transaction.outputs:type_name -> pb.Transaction.Output - 58, // 39: pb.Transaction.slp_transaction_info:type_name -> pb.SlpTransactionInfo - 53, // 40: pb.MempoolTransaction.transaction:type_name -> pb.Transaction - 72, // 41: pb.UnspentOutput.outpoint:type_name -> pb.Transaction.Input.Outpoint - 57, // 42: pb.UnspentOutput.slp_token:type_name -> pb.SlpToken - 72, // 43: pb.TransactionFilter.outpoints:type_name -> pb.Transaction.Input.Outpoint + 55, // 33: pb.TransactionNotification.confirmed_transaction:type_name -> pb.Transaction + 56, // 34: pb.TransactionNotification.unconfirmed_transaction:type_name -> pb.MempoolTransaction + 53, // 35: pb.Block.info:type_name -> pb.BlockInfo + 71, // 36: pb.Block.transaction_data:type_name -> pb.Block.TransactionData + 72, // 37: pb.Transaction.inputs:type_name -> pb.Transaction.Input + 73, // 38: pb.Transaction.outputs:type_name -> pb.Transaction.Output + 60, // 39: pb.Transaction.slp_transaction_info:type_name -> pb.SlpTransactionInfo + 55, // 40: pb.MempoolTransaction.transaction:type_name -> pb.Transaction + 74, // 41: pb.UnspentOutput.outpoint:type_name -> pb.Transaction.Input.Outpoint + 59, // 42: pb.UnspentOutput.slp_token:type_name -> pb.SlpToken + 74, // 43: pb.TransactionFilter.outpoints:type_name -> pb.Transaction.Input.Outpoint 1, // 44: pb.SlpToken.slp_action:type_name -> pb.SlpAction 0, // 45: pb.SlpToken.token_type:type_name -> pb.SlpTokenType 1, // 46: pb.SlpTransactionInfo.slp_action:type_name -> pb.SlpAction 5, // 47: pb.SlpTransactionInfo.validity_judgement:type_name -> pb.SlpTransactionInfo.ValidityJudgement 6, // 48: pb.SlpTransactionInfo.burn_flags:type_name -> pb.SlpTransactionInfo.BurnFlags - 59, // 49: pb.SlpTransactionInfo.v1_genesis:type_name -> pb.SlpV1GenesisMetadata - 60, // 50: pb.SlpTransactionInfo.v1_mint:type_name -> pb.SlpV1MintMetadata - 61, // 51: pb.SlpTransactionInfo.v1_send:type_name -> pb.SlpV1SendMetadata - 62, // 52: pb.SlpTransactionInfo.v1_nft1_child_genesis:type_name -> pb.SlpV1Nft1ChildGenesisMetadata - 63, // 53: pb.SlpTransactionInfo.v1_nft1_child_send:type_name -> pb.SlpV1Nft1ChildSendMetadata + 61, // 49: pb.SlpTransactionInfo.v1_genesis:type_name -> pb.SlpV1GenesisMetadata + 62, // 50: pb.SlpTransactionInfo.v1_mint:type_name -> pb.SlpV1MintMetadata + 63, // 51: pb.SlpTransactionInfo.v1_send:type_name -> pb.SlpV1SendMetadata + 64, // 52: pb.SlpTransactionInfo.v1_nft1_child_genesis:type_name -> pb.SlpV1Nft1ChildGenesisMetadata + 65, // 53: pb.SlpTransactionInfo.v1_nft1_child_send:type_name -> pb.SlpV1Nft1ChildSendMetadata 0, // 54: pb.SlpTokenMetadata.token_type:type_name -> pb.SlpTokenType - 73, // 55: pb.SlpTokenMetadata.v1_fungible:type_name -> pb.SlpTokenMetadata.V1Fungible - 74, // 56: pb.SlpTokenMetadata.v1_nft1_group:type_name -> pb.SlpTokenMetadata.V1NFT1Group - 75, // 57: pb.SlpTokenMetadata.v1_nft1_child:type_name -> pb.SlpTokenMetadata.V1NFT1Child - 72, // 58: pb.SlpRequiredBurn.outpoint:type_name -> pb.Transaction.Input.Outpoint + 75, // 55: pb.SlpTokenMetadata.v1_fungible:type_name -> pb.SlpTokenMetadata.V1Fungible + 76, // 56: pb.SlpTokenMetadata.v1_nft1_group:type_name -> pb.SlpTokenMetadata.V1NFT1Group + 77, // 57: pb.SlpTokenMetadata.v1_nft1_child:type_name -> pb.SlpTokenMetadata.V1NFT1Child + 74, // 58: pb.SlpRequiredBurn.outpoint:type_name -> pb.Transaction.Input.Outpoint 0, // 59: pb.SlpRequiredBurn.token_type:type_name -> pb.SlpTokenType - 53, // 60: pb.GetMempoolResponse.TransactionData.transaction:type_name -> pb.Transaction + 55, // 60: pb.GetMempoolResponse.TransactionData.transaction:type_name -> pb.Transaction 1, // 61: pb.GetSlpTrustedValidationResponse.ValidityResult.slp_action:type_name -> pb.SlpAction 0, // 62: pb.GetSlpTrustedValidationResponse.ValidityResult.token_type:type_name -> pb.SlpTokenType - 53, // 63: pb.Block.TransactionData.transaction:type_name -> pb.Transaction - 72, // 64: pb.Transaction.Input.outpoint:type_name -> pb.Transaction.Input.Outpoint - 57, // 65: pb.Transaction.Input.slp_token:type_name -> pb.SlpToken - 57, // 66: pb.Transaction.Output.slp_token:type_name -> pb.SlpToken + 55, // 63: pb.Block.TransactionData.transaction:type_name -> pb.Transaction + 74, // 64: pb.Transaction.Input.outpoint:type_name -> pb.Transaction.Input.Outpoint + 59, // 65: pb.Transaction.Input.slp_token:type_name -> pb.SlpToken + 59, // 66: pb.Transaction.Output.slp_token:type_name -> pb.SlpToken 7, // 67: pb.bchrpc.GetMempoolInfo:input_type -> pb.GetMempoolInfoRequest 9, // 68: pb.bchrpc.GetMempool:input_type -> pb.GetMempoolRequest 11, // 69: pb.bchrpc.GetBlockchainInfo:input_type -> pb.GetBlockchainInfoRequest @@ -6873,36 +7037,38 @@ var file_bchrpc_proto_depIdxs = []int32{ 43, // 82: pb.bchrpc.GetSlpTokenMetadata:input_type -> pb.GetSlpTokenMetadataRequest 45, // 83: pb.bchrpc.GetSlpParsedScript:input_type -> pb.GetSlpParsedScriptRequest 47, // 84: pb.bchrpc.GetSlpTrustedValidation:input_type -> pb.GetSlpTrustedValidationRequest - 39, // 85: pb.bchrpc.CheckSlpTransaction:input_type -> pb.CheckSlpTransactionRequest - 37, // 86: pb.bchrpc.SubmitTransaction:input_type -> pb.SubmitTransactionRequest - 41, // 87: pb.bchrpc.SubscribeTransactions:input_type -> pb.SubscribeTransactionsRequest - 41, // 88: pb.bchrpc.SubscribeTransactionStream:input_type -> pb.SubscribeTransactionsRequest - 42, // 89: pb.bchrpc.SubscribeBlocks:input_type -> pb.SubscribeBlocksRequest - 8, // 90: pb.bchrpc.GetMempoolInfo:output_type -> pb.GetMempoolInfoResponse - 10, // 91: pb.bchrpc.GetMempool:output_type -> pb.GetMempoolResponse - 12, // 92: pb.bchrpc.GetBlockchainInfo:output_type -> pb.GetBlockchainInfoResponse - 14, // 93: pb.bchrpc.GetBlockInfo:output_type -> pb.GetBlockInfoResponse - 16, // 94: pb.bchrpc.GetBlock:output_type -> pb.GetBlockResponse - 18, // 95: pb.bchrpc.GetRawBlock:output_type -> pb.GetRawBlockResponse - 20, // 96: pb.bchrpc.GetBlockFilter:output_type -> pb.GetBlockFilterResponse - 22, // 97: pb.bchrpc.GetHeaders:output_type -> pb.GetHeadersResponse - 24, // 98: pb.bchrpc.GetTransaction:output_type -> pb.GetTransactionResponse - 26, // 99: pb.bchrpc.GetRawTransaction:output_type -> pb.GetRawTransactionResponse - 28, // 100: pb.bchrpc.GetAddressTransactions:output_type -> pb.GetAddressTransactionsResponse - 30, // 101: pb.bchrpc.GetRawAddressTransactions:output_type -> pb.GetRawAddressTransactionsResponse - 32, // 102: pb.bchrpc.GetAddressUnspentOutputs:output_type -> pb.GetAddressUnspentOutputsResponse - 34, // 103: pb.bchrpc.GetUnspentOutput:output_type -> pb.GetUnspentOutputResponse - 36, // 104: pb.bchrpc.GetMerkleProof:output_type -> pb.GetMerkleProofResponse - 44, // 105: pb.bchrpc.GetSlpTokenMetadata:output_type -> pb.GetSlpTokenMetadataResponse - 46, // 106: pb.bchrpc.GetSlpParsedScript:output_type -> pb.GetSlpParsedScriptResponse - 48, // 107: pb.bchrpc.GetSlpTrustedValidation:output_type -> pb.GetSlpTrustedValidationResponse - 40, // 108: pb.bchrpc.CheckSlpTransaction:output_type -> pb.CheckSlpTransactionResponse - 38, // 109: pb.bchrpc.SubmitTransaction:output_type -> pb.SubmitTransactionResponse - 50, // 110: pb.bchrpc.SubscribeTransactions:output_type -> pb.TransactionNotification - 50, // 111: pb.bchrpc.SubscribeTransactionStream:output_type -> pb.TransactionNotification - 49, // 112: pb.bchrpc.SubscribeBlocks:output_type -> pb.BlockNotification - 90, // [90:113] is the sub-list for method output_type - 67, // [67:90] is the sub-list for method input_type + 49, // 85: pb.bchrpc.GetSlpGraphSearch:input_type -> pb.GetSlpGraphSearchRequest + 39, // 86: pb.bchrpc.CheckSlpTransaction:input_type -> pb.CheckSlpTransactionRequest + 37, // 87: pb.bchrpc.SubmitTransaction:input_type -> pb.SubmitTransactionRequest + 41, // 88: pb.bchrpc.SubscribeTransactions:input_type -> pb.SubscribeTransactionsRequest + 41, // 89: pb.bchrpc.SubscribeTransactionStream:input_type -> pb.SubscribeTransactionsRequest + 42, // 90: pb.bchrpc.SubscribeBlocks:input_type -> pb.SubscribeBlocksRequest + 8, // 91: pb.bchrpc.GetMempoolInfo:output_type -> pb.GetMempoolInfoResponse + 10, // 92: pb.bchrpc.GetMempool:output_type -> pb.GetMempoolResponse + 12, // 93: pb.bchrpc.GetBlockchainInfo:output_type -> pb.GetBlockchainInfoResponse + 14, // 94: pb.bchrpc.GetBlockInfo:output_type -> pb.GetBlockInfoResponse + 16, // 95: pb.bchrpc.GetBlock:output_type -> pb.GetBlockResponse + 18, // 96: pb.bchrpc.GetRawBlock:output_type -> pb.GetRawBlockResponse + 20, // 97: pb.bchrpc.GetBlockFilter:output_type -> pb.GetBlockFilterResponse + 22, // 98: pb.bchrpc.GetHeaders:output_type -> pb.GetHeadersResponse + 24, // 99: pb.bchrpc.GetTransaction:output_type -> pb.GetTransactionResponse + 26, // 100: pb.bchrpc.GetRawTransaction:output_type -> pb.GetRawTransactionResponse + 28, // 101: pb.bchrpc.GetAddressTransactions:output_type -> pb.GetAddressTransactionsResponse + 30, // 102: pb.bchrpc.GetRawAddressTransactions:output_type -> pb.GetRawAddressTransactionsResponse + 32, // 103: pb.bchrpc.GetAddressUnspentOutputs:output_type -> pb.GetAddressUnspentOutputsResponse + 34, // 104: pb.bchrpc.GetUnspentOutput:output_type -> pb.GetUnspentOutputResponse + 36, // 105: pb.bchrpc.GetMerkleProof:output_type -> pb.GetMerkleProofResponse + 44, // 106: pb.bchrpc.GetSlpTokenMetadata:output_type -> pb.GetSlpTokenMetadataResponse + 46, // 107: pb.bchrpc.GetSlpParsedScript:output_type -> pb.GetSlpParsedScriptResponse + 48, // 108: pb.bchrpc.GetSlpTrustedValidation:output_type -> pb.GetSlpTrustedValidationResponse + 50, // 109: pb.bchrpc.GetSlpGraphSearch:output_type -> pb.GetSlpGraphSearchResponse + 40, // 110: pb.bchrpc.CheckSlpTransaction:output_type -> pb.CheckSlpTransactionResponse + 38, // 111: pb.bchrpc.SubmitTransaction:output_type -> pb.SubmitTransactionResponse + 52, // 112: pb.bchrpc.SubscribeTransactions:output_type -> pb.TransactionNotification + 52, // 113: pb.bchrpc.SubscribeTransactionStream:output_type -> pb.TransactionNotification + 51, // 114: pb.bchrpc.SubscribeBlocks:output_type -> pb.BlockNotification + 91, // [91:115] is the sub-list for method output_type + 67, // [67:91] is the sub-list for method input_type 67, // [67:67] is the sub-list for extension type_name 67, // [67:67] is the sub-list for extension extendee 0, // [0:67] is the sub-list for field type_name @@ -7419,7 +7585,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlockNotification); i { + switch v := v.(*GetSlpGraphSearchRequest); i { case 0: return &v.state case 1: @@ -7431,7 +7597,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransactionNotification); i { + switch v := v.(*GetSlpGraphSearchResponse); i { case 0: return &v.state case 1: @@ -7443,7 +7609,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlockInfo); i { + switch v := v.(*BlockNotification); i { case 0: return &v.state case 1: @@ -7455,7 +7621,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Block); i { + switch v := v.(*TransactionNotification); i { case 0: return &v.state case 1: @@ -7467,7 +7633,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Transaction); i { + switch v := v.(*BlockInfo); i { case 0: return &v.state case 1: @@ -7479,7 +7645,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MempoolTransaction); i { + switch v := v.(*Block); i { case 0: return &v.state case 1: @@ -7491,7 +7657,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnspentOutput); i { + switch v := v.(*Transaction); i { case 0: return &v.state case 1: @@ -7503,7 +7669,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransactionFilter); i { + switch v := v.(*MempoolTransaction); i { case 0: return &v.state case 1: @@ -7515,7 +7681,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SlpToken); i { + switch v := v.(*UnspentOutput); i { case 0: return &v.state case 1: @@ -7527,7 +7693,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SlpTransactionInfo); i { + switch v := v.(*TransactionFilter); i { case 0: return &v.state case 1: @@ -7539,7 +7705,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SlpV1GenesisMetadata); i { + switch v := v.(*SlpToken); i { case 0: return &v.state case 1: @@ -7551,7 +7717,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SlpV1MintMetadata); i { + switch v := v.(*SlpTransactionInfo); i { case 0: return &v.state case 1: @@ -7563,7 +7729,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SlpV1SendMetadata); i { + switch v := v.(*SlpV1GenesisMetadata); i { case 0: return &v.state case 1: @@ -7575,7 +7741,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SlpV1Nft1ChildGenesisMetadata); i { + switch v := v.(*SlpV1MintMetadata); i { case 0: return &v.state case 1: @@ -7587,7 +7753,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SlpV1Nft1ChildSendMetadata); i { + switch v := v.(*SlpV1SendMetadata); i { case 0: return &v.state case 1: @@ -7599,7 +7765,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SlpTokenMetadata); i { + switch v := v.(*SlpV1Nft1ChildGenesisMetadata); i { case 0: return &v.state case 1: @@ -7611,7 +7777,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SlpRequiredBurn); i { + switch v := v.(*SlpV1Nft1ChildSendMetadata); i { case 0: return &v.state case 1: @@ -7623,7 +7789,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMempoolResponse_TransactionData); i { + switch v := v.(*SlpTokenMetadata); i { case 0: return &v.state case 1: @@ -7635,7 +7801,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetSlpTrustedValidationRequest_Query); i { + switch v := v.(*SlpRequiredBurn); i { case 0: return &v.state case 1: @@ -7647,7 +7813,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetSlpTrustedValidationResponse_ValidityResult); i { + switch v := v.(*GetMempoolResponse_TransactionData); i { case 0: return &v.state case 1: @@ -7659,7 +7825,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Block_TransactionData); i { + switch v := v.(*GetSlpTrustedValidationRequest_Query); i { case 0: return &v.state case 1: @@ -7671,7 +7837,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Transaction_Input); i { + switch v := v.(*GetSlpTrustedValidationResponse_ValidityResult); i { case 0: return &v.state case 1: @@ -7683,7 +7849,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Transaction_Output); i { + switch v := v.(*Block_TransactionData); i { case 0: return &v.state case 1: @@ -7695,7 +7861,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Transaction_Input_Outpoint); i { + switch v := v.(*Transaction_Input); i { case 0: return &v.state case 1: @@ -7707,7 +7873,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SlpTokenMetadata_V1Fungible); i { + switch v := v.(*Transaction_Output); i { case 0: return &v.state case 1: @@ -7719,7 +7885,7 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SlpTokenMetadata_V1NFT1Group); i { + switch v := v.(*Transaction_Input_Outpoint); i { case 0: return &v.state case 1: @@ -7731,6 +7897,30 @@ func file_bchrpc_proto_init() { } } file_bchrpc_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SlpTokenMetadata_V1Fungible); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_bchrpc_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SlpTokenMetadata_V1NFT1Group); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_bchrpc_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SlpTokenMetadata_V1NFT1Child); i { case 0: return &v.state @@ -7774,41 +7964,41 @@ func file_bchrpc_proto_init() { (*GetSlpParsedScriptResponse_V1Nft1ChildGenesis)(nil), (*GetSlpParsedScriptResponse_V1Nft1ChildSend)(nil), } - file_bchrpc_proto_msgTypes[42].OneofWrappers = []interface{}{ + file_bchrpc_proto_msgTypes[44].OneofWrappers = []interface{}{ (*BlockNotification_BlockInfo)(nil), (*BlockNotification_MarshaledBlock)(nil), (*BlockNotification_SerializedBlock)(nil), } - file_bchrpc_proto_msgTypes[43].OneofWrappers = []interface{}{ + file_bchrpc_proto_msgTypes[45].OneofWrappers = []interface{}{ (*TransactionNotification_ConfirmedTransaction)(nil), (*TransactionNotification_UnconfirmedTransaction)(nil), (*TransactionNotification_SerializedTransaction)(nil), } - file_bchrpc_proto_msgTypes[51].OneofWrappers = []interface{}{ + file_bchrpc_proto_msgTypes[53].OneofWrappers = []interface{}{ (*SlpTransactionInfo_V1Genesis)(nil), (*SlpTransactionInfo_V1Mint)(nil), (*SlpTransactionInfo_V1Send)(nil), (*SlpTransactionInfo_V1Nft1ChildGenesis)(nil), (*SlpTransactionInfo_V1Nft1ChildSend)(nil), } - file_bchrpc_proto_msgTypes[57].OneofWrappers = []interface{}{ + file_bchrpc_proto_msgTypes[59].OneofWrappers = []interface{}{ (*SlpTokenMetadata_V1Fungible_)(nil), (*SlpTokenMetadata_V1Nft1Group)(nil), (*SlpTokenMetadata_V1Nft1Child)(nil), } - file_bchrpc_proto_msgTypes[58].OneofWrappers = []interface{}{ + file_bchrpc_proto_msgTypes[60].OneofWrappers = []interface{}{ (*SlpRequiredBurn_Amount)(nil), (*SlpRequiredBurn_MintBatonVout)(nil), } - file_bchrpc_proto_msgTypes[59].OneofWrappers = []interface{}{ + file_bchrpc_proto_msgTypes[61].OneofWrappers = []interface{}{ (*GetMempoolResponse_TransactionData_TransactionHash)(nil), (*GetMempoolResponse_TransactionData_Transaction)(nil), } - file_bchrpc_proto_msgTypes[61].OneofWrappers = []interface{}{ + file_bchrpc_proto_msgTypes[63].OneofWrappers = []interface{}{ (*GetSlpTrustedValidationResponse_ValidityResult_V1TokenAmount)(nil), (*GetSlpTrustedValidationResponse_ValidityResult_V1MintBaton)(nil), } - file_bchrpc_proto_msgTypes[62].OneofWrappers = []interface{}{ + file_bchrpc_proto_msgTypes[64].OneofWrappers = []interface{}{ (*Block_TransactionData_TransactionHash)(nil), (*Block_TransactionData_Transaction)(nil), } @@ -7818,7 +8008,7 @@ func file_bchrpc_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_bchrpc_proto_rawDesc, NumEnums: 7, - NumMessages: 69, + NumMessages: 71, NumExtensions: 0, NumServices: 1, }, @@ -7917,6 +8107,10 @@ type BchrpcClient interface { // // **Requires SlpIndex** GetSlpTrustedValidation(ctx context.Context, in *GetSlpTrustedValidationRequest, opts ...grpc.CallOption) (*GetSlpTrustedValidationResponse, error) + // GraphSearch returns all the transactions needed for a client to validate an SLP graph + // + // **Requires SlpIndex and SlpGraphSearch** + GetSlpGraphSearch(ctx context.Context, in *GetSlpGraphSearchRequest, opts ...grpc.CallOption) (*GetSlpGraphSearchResponse, error) // CheckSlpTransaction checks the validity of a supposed slp transaction before it is broadcasted. CheckSlpTransaction(ctx context.Context, in *CheckSlpTransactionRequest, opts ...grpc.CallOption) (*CheckSlpTransactionResponse, error) // Submit a transaction to all connected peers. @@ -8116,6 +8310,15 @@ func (c *bchrpcClient) GetSlpTrustedValidation(ctx context.Context, in *GetSlpTr return out, nil } +func (c *bchrpcClient) GetSlpGraphSearch(ctx context.Context, in *GetSlpGraphSearchRequest, opts ...grpc.CallOption) (*GetSlpGraphSearchResponse, error) { + out := new(GetSlpGraphSearchResponse) + err := c.cc.Invoke(ctx, "/pb.bchrpc/GetSlpGraphSearch", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *bchrpcClient) CheckSlpTransaction(ctx context.Context, in *CheckSlpTransactionRequest, opts ...grpc.CallOption) (*CheckSlpTransactionResponse, error) { out := new(CheckSlpTransactionResponse) err := c.cc.Invoke(ctx, "/pb.bchrpc/CheckSlpTransaction", in, out, opts...) @@ -8303,6 +8506,10 @@ type BchrpcServer interface { // // **Requires SlpIndex** GetSlpTrustedValidation(context.Context, *GetSlpTrustedValidationRequest) (*GetSlpTrustedValidationResponse, error) + // GraphSearch returns all the transactions needed for a client to validate an SLP graph + // + // **Requires SlpIndex and SlpGraphSearch** + GetSlpGraphSearch(context.Context, *GetSlpGraphSearchRequest) (*GetSlpGraphSearchResponse, error) // CheckSlpTransaction checks the validity of a supposed slp transaction before it is broadcasted. CheckSlpTransaction(context.Context, *CheckSlpTransactionRequest) (*CheckSlpTransactionResponse, error) // Submit a transaction to all connected peers. @@ -8390,6 +8597,9 @@ func (*UnimplementedBchrpcServer) GetSlpParsedScript(context.Context, *GetSlpPar func (*UnimplementedBchrpcServer) GetSlpTrustedValidation(context.Context, *GetSlpTrustedValidationRequest) (*GetSlpTrustedValidationResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetSlpTrustedValidation not implemented") } +func (*UnimplementedBchrpcServer) GetSlpGraphSearch(context.Context, *GetSlpGraphSearchRequest) (*GetSlpGraphSearchResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetSlpGraphSearch not implemented") +} func (*UnimplementedBchrpcServer) CheckSlpTransaction(context.Context, *CheckSlpTransactionRequest) (*CheckSlpTransactionResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CheckSlpTransaction not implemented") } @@ -8734,6 +8944,24 @@ func _Bchrpc_GetSlpTrustedValidation_Handler(srv interface{}, ctx context.Contex return interceptor(ctx, in, info, handler) } +func _Bchrpc_GetSlpGraphSearch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetSlpGraphSearchRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BchrpcServer).GetSlpGraphSearch(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.bchrpc/GetSlpGraphSearch", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BchrpcServer).GetSlpGraphSearch(ctx, req.(*GetSlpGraphSearchRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Bchrpc_CheckSlpTransaction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CheckSlpTransactionRequest) if err := dec(in); err != nil { @@ -8914,6 +9142,10 @@ var _Bchrpc_serviceDesc = grpc.ServiceDesc{ MethodName: "GetSlpTrustedValidation", Handler: _Bchrpc_GetSlpTrustedValidation_Handler, }, + { + MethodName: "GetSlpGraphSearch", + Handler: _Bchrpc_GetSlpGraphSearch_Handler, + }, { MethodName: "CheckSlpTransaction", Handler: _Bchrpc_CheckSlpTransaction_Handler, diff --git a/bchrpc/pb/bchrpc.pb.gw.go b/bchrpc/pb/bchrpc.pb.gw.go index f9c621872..7f47744c3 100644 --- a/bchrpc/pb/bchrpc.pb.gw.go +++ b/bchrpc/pb/bchrpc.pb.gw.go @@ -643,6 +643,40 @@ func local_request_Bchrpc_GetSlpTrustedValidation_0(ctx context.Context, marshal } +func request_Bchrpc_GetSlpGraphSearch_0(ctx context.Context, marshaler runtime.Marshaler, client BchrpcClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetSlpGraphSearchRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.GetSlpGraphSearch(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Bchrpc_GetSlpGraphSearch_0(ctx context.Context, marshaler runtime.Marshaler, server BchrpcServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetSlpGraphSearchRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.GetSlpGraphSearch(ctx, &protoReq) + return msg, metadata, err + +} + func request_Bchrpc_CheckSlpTransaction_0(ctx context.Context, marshaler runtime.Marshaler, client BchrpcClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CheckSlpTransactionRequest var metadata runtime.ServerMetadata @@ -1233,6 +1267,29 @@ func RegisterBchrpcHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser }) + mux.Handle("POST", pattern_Bchrpc_GetSlpGraphSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/pb.Bchrpc/GetSlpGraphSearch") + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Bchrpc_GetSlpGraphSearch_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Bchrpc_GetSlpGraphSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_Bchrpc_CheckSlpTransaction_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1701,6 +1758,26 @@ func RegisterBchrpcHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli }) + mux.Handle("POST", pattern_Bchrpc_GetSlpGraphSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req, "/pb.Bchrpc/GetSlpGraphSearch") + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Bchrpc_GetSlpGraphSearch_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Bchrpc_GetSlpGraphSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_Bchrpc_CheckSlpTransaction_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1841,6 +1918,8 @@ var ( pattern_Bchrpc_GetSlpTrustedValidation_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "GetSlpTrustedValidation"}, "")) + pattern_Bchrpc_GetSlpGraphSearch_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "GetSlpGraphSearch"}, "")) + pattern_Bchrpc_CheckSlpTransaction_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "CheckSlpTransaction"}, "")) pattern_Bchrpc_SubmitTransaction_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "SubmitTransaction"}, "")) @@ -1889,6 +1968,8 @@ var ( forward_Bchrpc_GetSlpTrustedValidation_0 = runtime.ForwardResponseMessage + forward_Bchrpc_GetSlpGraphSearch_0 = runtime.ForwardResponseMessage + forward_Bchrpc_CheckSlpTransaction_0 = runtime.ForwardResponseMessage forward_Bchrpc_SubmitTransaction_0 = runtime.ForwardResponseMessage diff --git a/bchrpc/proxy/bchrpc.yaml b/bchrpc/proxy/bchrpc.yaml index 74e0e4524..a499a9fa0 100644 --- a/bchrpc/proxy/bchrpc.yaml +++ b/bchrpc/proxy/bchrpc.yaml @@ -15,6 +15,9 @@ http: - selector: pb.bchrpc.GetSlpTrustedValidation post: /v1/GetSlpTrustedValidation body: "*" + - selector: pb.bchrpc.GetSlpGraphSearch + post: /v1/GetSlpGraphSearch + body: "*" - selector: pb.bchrpc.GetMempoolInfo post: /v1/GetMempoolInfo body: "*" @@ -71,4 +74,4 @@ http: body: "*" - selector: pb.bchrpc.SubscribeBlocks post: /v1/SubscribeBlocks - body: "*" + body: "*" \ No newline at end of file diff --git a/bchrpc/proxy/gw_test.go b/bchrpc/proxy/gw_test.go index 06fa13d7a..b2ed8a6ab 100644 --- a/bchrpc/proxy/gw_test.go +++ b/bchrpc/proxy/gw_test.go @@ -20,7 +20,7 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" ) -const bchdTestNode = "bchd.ny1.simpleledger.io:443" +const bchdTestNode = "bchd-mainnet.electroncash.de:8335" const logRequestJSON = true // log JSON of request and responses (to glog) const dustLimit = 546 @@ -472,9 +472,11 @@ func TestGetSlpTrustedValidation(t *testing.T) { res, err := httpClient.RequestRaw(method, D{ "queries": []D{{ - "prev_out_hash": transactionIDBase64, - "prev_out_vout": prevOutVout, + "prev_out_hash": transactionIDBase64, + "prev_out_vout": prevOutVout, + "graphsearch_valid_hashes": nil, }}, + "include_graphsearch_count": true, }) if err != nil { diff --git a/bchrpc/proxy/web/bchrpc.swagger.json b/bchrpc/proxy/web/bchrpc.swagger.json index 1c06c1609..b62c85a1e 100644 --- a/bchrpc/proxy/web/bchrpc.swagger.json +++ b/bchrpc/proxy/web/bchrpc.swagger.json @@ -484,6 +484,40 @@ ] } }, + "/v1/GetSlpGraphSearch": { + "post": { + "summary": "GraphSearch returns all the transactions needed for a client to validate an SLP graph", + "description": "**Requires SlpIndex and SlpGraphSearch**", + "operationId": "bchrpc_GetSlpGraphSearch", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/pbGetSlpGraphSearchResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/pbGetSlpGraphSearchRequest" + } + } + ], + "tags": [ + "bchrpc" + ] + } + }, "/v1/GetSlpParsedScript": { "post": { "summary": "GetSlpParsedScript returns marshalled object from parsing an slp pubKeyScript \nusing goslp package. This endpoint does not require SlpIndex.", @@ -839,6 +873,13 @@ "prev_out_vout": { "type": "integer", "format": "int64" + }, + "graphsearch_valid_hashes": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + } } } }, @@ -873,6 +914,10 @@ "slp_txn_opreturn": { "type": "string", "format": "byte" + }, + "graphsearch_txn_count": { + "type": "integer", + "format": "int64" } } }, @@ -1438,6 +1483,10 @@ "slp_index": { "type": "boolean", "description": "When `slp_index` is true, the node has the slp index enabled and may\nbe used with slp related rpc methods and also causes slp metadata to be added\nin some of the existing rpc methods." + }, + "slp_graphsearch": { + "type": "boolean", + "title": "When `slp_graphsearch` is true, the node is able to handle calls to slp graph search" } } }, @@ -1654,6 +1703,34 @@ } } }, + "pbGetSlpGraphSearchRequest": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "valid_hashes": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + } + } + } + }, + "pbGetSlpGraphSearchResponse": { + "type": "object", + "properties": { + "txdata": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + } + } + } + }, "pbGetSlpParsedScriptRequest": { "type": "object", "properties": { @@ -1727,6 +1804,9 @@ "items": { "$ref": "#/definitions/GetSlpTrustedValidationRequestQuery" } + }, + "include_graphsearch_count": { + "type": "boolean" } } }, diff --git a/bchrpc/regtest/bchd-entrypoint.sh b/bchrpc/regtest/bchd-entrypoint.sh index 2826792d5..1c2a8b5d3 100755 --- a/bchrpc/regtest/bchd-entrypoint.sh +++ b/bchrpc/regtest/bchd-entrypoint.sh @@ -3,7 +3,7 @@ if [ "$1" == "bchd1" ]; then openssl req -x509 -newkey rsa:4096 -keyout /data/rpc.bchd1.key -out /data/rpc.bchd1.cert -days 365 -subj "/CN=bchd1" -nodes - bchd --slpcachemaxsize=1 --addpeer=bchd2 --grpclisten=0.0.0.0 --rpccert=/data/rpc.bchd1.cert --rpckey=/data/rpc.bchd1.key -C /data/bchd.conf + bchd --slpcachemaxsize=1 --slpgraphsearch --addpeer=bchd2 --grpclisten=0.0.0.0 --rpccert=/data/rpc.bchd1.cert --rpckey=/data/rpc.bchd1.key -C /data/bchd.conf fi if [ "$1" == "bchd2" ]; diff --git a/bchrpc/regtest/package-lock.json b/bchrpc/regtest/package-lock.json index dcf2d6658..6658ebf66 100644 --- a/bchrpc/regtest/package-lock.json +++ b/bchrpc/regtest/package-lock.json @@ -147,6 +147,40 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" }, + "@mapbox/node-pre-gyp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz", + "integrity": "sha512-4srsKPXWlIxp5Vbqz5uLfBN+du2fJChBoYn/f2h991WLdk7jUvcSk/McVLSv/X+xQIPI8eGD5GjrnygdyHnhPA==", + "requires": { + "detect-libc": "^1.0.3", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.1", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "rimraf": "^3.0.2", + "semver": "^7.3.4", + "tar": "^6.1.0" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, "@nodelib/fs.scandir": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", @@ -242,9 +276,9 @@ } }, "@types/google-protobuf": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.7.4.tgz", - "integrity": "sha512-6PjMFKl13cgB4kRdYtvyjKl8VVa0PXS2IdVxHhQ8GEKbxBkyJtSbaIeK1eZGjDKN7dvUh4vkOvU9FMwYNv4GQQ==" + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.2.tgz", + "integrity": "sha512-ubeqvw7sl6CdgeiIilsXB2jIFoD/D0F+/LIEp7xEBEXRNtDJcf05FRINybsJtL7GlkWOUVn6gJs2W9OF+xI6lg==" }, "@types/json-schema": { "version": "7.0.7", @@ -428,6 +462,14 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==" }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -665,9 +707,9 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "bchaddrjs-slp": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/bchaddrjs-slp/-/bchaddrjs-slp-0.2.12.tgz", - "integrity": "sha512-yRtNSo/oPqdl3R3LV9H6fvuksdA/FGvn/8A8IH2dkYLiVe5lOtBjiGV4qFMRUHCtwaXWumbBcUwgvdkXxj3cfg==", + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/bchaddrjs-slp/-/bchaddrjs-slp-0.2.14.tgz", + "integrity": "sha512-4EdUV6Kwu2Ae8QyYtLAnHOUu0Zfl0w5wDPbeftiu3+fVr6ZyPmuVKlZtU2HERx76BOngZpGTf+suM3nuPJ0Tuw==", "requires": { "bs58check": "^2.1.2", "cashaddrjs-slp": "^0.2.12" @@ -692,9 +734,9 @@ "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==" }, "bignumber.js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" }, "binary-extensions": { "version": "2.2.0", @@ -719,9 +761,9 @@ } }, "bitcore-lib": { - "version": "8.25.3", - "resolved": "https://registry.npmjs.org/bitcore-lib/-/bitcore-lib-8.25.3.tgz", - "integrity": "sha512-MKbV47rojtAev/wehLEWfoYzkUSxsBLdV7qiFrwLEYnagwNPKqbA6fHI8kFfRpxvxCEZR0Ek2yTC0bIybLEyWQ==", + "version": "8.25.9", + "resolved": "https://registry.npmjs.org/bitcore-lib/-/bitcore-lib-8.25.9.tgz", + "integrity": "sha512-vg/FhdxjC8pB10OHg4zdE8W4xbRAWaqRdHWPfRAA8MRcLo8UMrZQpF/nfKfPfsU9+gF6wNrZUkYrZhH0AhEZMA==", "requires": { "bech32": "=1.1.3", "bn.js": "=4.11.8", @@ -740,11 +782,11 @@ } }, "bitcore-lib-cash": { - "version": "8.25.3", - "resolved": "https://registry.npmjs.org/bitcore-lib-cash/-/bitcore-lib-cash-8.25.3.tgz", - "integrity": "sha512-vY112N4uZRschDfG0gMN9rYORXUdmO5blIEDhWzCHGOu+n346Pxv/Mqj7xDjaashy8zbmeq1JI8sSVp3tTM3Zg==", + "version": "8.25.9", + "resolved": "https://registry.npmjs.org/bitcore-lib-cash/-/bitcore-lib-cash-8.25.9.tgz", + "integrity": "sha512-p/AWiSS1PPj/ZEh/mBtn1bwGVTajORBwlpb6VZ87dGbrPKPlF22kQmW6wb/9R2kADqiS7XmSiyHalmg0CnSf2w==", "requires": { - "bitcore-lib": "^8.25.3", + "bitcore-lib": "^8.25.9", "bn.js": "=4.11.8", "bs58": "^4.0.1", "buffer-compare": "=1.1.1", @@ -911,9 +953,9 @@ } }, "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, "ci-info": { "version": "2.0.0", @@ -1075,11 +1117,18 @@ } }, "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "decamelize": { @@ -1092,11 +1141,6 @@ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -1879,11 +1923,11 @@ } }, "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "requires": { - "minipass": "^2.6.0" + "minipass": "^3.0.0" } }, "fs.realpath": { @@ -1977,9 +2021,9 @@ } }, "google-protobuf": { - "version": "3.15.6", - "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.15.6.tgz", - "integrity": "sha512-p65NyhIZFHFUxbIPOm6cygg2rCjK+2uDCxruOG3RaWKM9R4rBGX0STmlJoSOhoyAG8Fha7U8FP4pQomAV1JXsA==" + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.16.0.tgz", + "integrity": "sha512-gBY66yYL1wbQMU2r1POkXSXkm035Ni0wFv3vx0K9IEUsJLP9G5rAcFVn0xUXfZneRu6MmDjaw93pt/DE56VOyw==" }, "graceful-fs": { "version": "4.2.6", @@ -1992,15 +2036,15 @@ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" }, "grpc": { - "version": "1.24.6", - "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.6.tgz", - "integrity": "sha512-BtifKdClMYU0ZEo0Pdr2WV9ZH54AoEdIcp2BfJkh87g2R3HoNPLYKHRYefw/ByxrCdVDTAy3hkraFISpqsRcrw==", + "version": "1.24.9", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.9.tgz", + "integrity": "sha512-BOq1AJocZJcG/6qyX3LX2KvKy91RIix10GFLhqWg+1L6b73uWIN2w0cq+lSi0q9mXfkjeFaBz83+oau7oJqG3Q==", "requires": { + "@mapbox/node-pre-gyp": "^1.0.4", "@types/bytebuffer": "^5.0.40", "lodash.camelcase": "^4.3.0", "lodash.clone": "^4.5.0", "nan": "^2.13.2", - "node-pre-gyp": "^0.16.0", "protobufjs": "^5.0.3" }, "dependencies": { @@ -2029,16 +2073,16 @@ }, "dependencies": { "typescript": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", - "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==" + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", + "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==" } } }, "grpc-bchrpc-node": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/grpc-bchrpc-node/-/grpc-bchrpc-node-0.15.0.tgz", - "integrity": "sha512-XXCvAYO/JW4nRKVT5V6I3jWPCZ/xI3Ig3iR7u+OCT/qHQqFDgN7erv/ihn4t05dGkXelA+/skRo+Z3FXzSTDzw==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/grpc-bchrpc-node/-/grpc-bchrpc-node-0.15.2.tgz", + "integrity": "sha512-GgQH0d3eUNAC1HAFt9ia+jyIIJJYZFN3NedSiF6dsx6ixl414fWrfkyMc9MweOUbT89ppazjh+9dVnTD1/zqfw==", "requires": { "@types/google-protobuf": "^3.7.4", "google-protobuf": "^3.15.5", @@ -2167,12 +2211,13 @@ "sshpk": "^1.7.0" } }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "agent-base": "6", + "debug": "4" } }, "ieee754": { @@ -2180,14 +2225,6 @@ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "requires": { - "minimatch": "^3.0.4" - } - }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -2223,11 +2260,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", @@ -2542,6 +2574,21 @@ } } }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, "make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -2621,20 +2668,20 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "yallist": "^4.0.0" } }, "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "requires": { - "minipass": "^2.9.0" + "minipass": "^3.0.0", + "yallist": "^4.0.0" } }, "mixin-deep": { @@ -2657,12 +2704,9 @@ } }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" }, "mocha": { "version": "8.3.0", @@ -2828,16 +2872,6 @@ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, - "needle": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", - "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -2848,6 +2882,11 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==" }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, "node-jsonrpc-request": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-jsonrpc-request/-/node-jsonrpc-request-1.0.0.tgz", @@ -2857,30 +2896,12 @@ "request-promise-native": "^1.0.5" } }, - "node-pre-gyp": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.16.0.tgz", - "integrity": "sha512-4efGA+X/YXAHLi1hN8KaPrILULaUn2nWecFrn1k2I+99HpoyvcOGEbtcOxpDiUwPF2ZANMJDh32qwOUPenuR1g==", - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.3", - "needle": "^2.5.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "abbrev": "1" } }, "normalize-path": { @@ -2888,29 +2909,6 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, - "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" - }, - "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", @@ -3021,11 +3019,6 @@ "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=" }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, "os-locale": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", @@ -3039,15 +3032,6 @@ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -3237,9 +3221,9 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, "protobufjs": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.2.tgz", - "integrity": "sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", "requires": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -3252,15 +3236,10 @@ "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/long": "^4.0.1", - "@types/node": "^13.7.0", + "@types/node": ">=13.7.0", "long": "^4.0.0" }, "dependencies": { - "@types/node": { - "version": "13.13.46", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.46.tgz", - "integrity": "sha512-dqpbzK/KDsOlEt+oyB3rv+u1IxlLFziZu/Z0adfRKoelkr+sTd6QcgiQC+HWq/vkYkHwG5ot2LxgV05aAjnhcg==" - }, "long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", @@ -3296,17 +3275,6 @@ "safe-buffer": "^5.1.0" } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -3467,11 +3435,6 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -3561,9 +3524,9 @@ } }, "slp-mdm": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/slp-mdm/-/slp-mdm-0.0.6.tgz", - "integrity": "sha512-fbjlIg/o8OtzgK2JydC6POJp3Qup/rLgy4yB5hoLgxWRlERyJyE29ScwS3r9TTwPxe12qK55pyivAdNOZZXL0A==", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/slp-mdm/-/slp-mdm-0.0.7.tgz", + "integrity": "sha512-XlnDS7y8fnEt9I5lw/GqcrDjTGw5vZon83xlliLyihz2EvjE135ubIBzq4bmjVOrM669G9A6bkqEp5Y1trPV3A==", "requires": { "bignumber.js": "^9.0.0" } @@ -3819,11 +3782,6 @@ "ansi-regex": "^2.0.0" } }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -3898,17 +3856,16 @@ } }, "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", + "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" } }, "text-table": { @@ -4185,9 +4142,9 @@ "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" }, "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yargs": { "version": "3.32.0", diff --git a/bchrpc/regtest/package.json b/bchrpc/regtest/package.json index 12a7684ca..c3538c509 100644 --- a/bchrpc/regtest/package.json +++ b/bchrpc/regtest/package.json @@ -11,17 +11,17 @@ "@types/node": "^14.14.31", "@typescript-eslint/eslint-plugin": "^4.8.2", "@typescript-eslint/parser": "^4.8.2", - "bchaddrjs-slp": "^0.2.12", + "bchaddrjs-slp": "^0.2.14", "bitcoin-rpc-promise": "^2.1.6", - "bitcore-lib-cash": "^8.25.3", + "bitcore-lib-cash": "^8.25.9", "eslint": "^7.14.0", "eslint-plugin-jsdoc": "^30.7.8", "eslint-plugin-prefer-arrow": "^1.2.2", - "grpc-bchrpc-node": "^0.15.0", + "grpc-bchrpc-node": "^0.15.2", "mocha": "^8.1.3", "mocha-steps": "^1.3.0", "patch-package": "^6.4.4", - "slp-mdm": "0.0.6", + "slp-mdm": "0.0.7", "synchronized-promise": "^0.3.1", "ts-node": "^9.0.0", "typescript": "^3.4.3" diff --git a/bchrpc/server.go b/bchrpc/server.go index 4e3f3967f..7425ab9c4 100644 --- a/bchrpc/server.go +++ b/bchrpc/server.go @@ -399,15 +399,21 @@ func (s *GrpcServer) GetBlockchainInfo(ctx context.Context, req *pb.GetBlockchai return nil, status.Error(codes.Internal, "unknown network parameters") } + gsEnabled := false + if s.slpIndex != nil { + gsEnabled = s.slpIndex.GraphSearchEnabled() + } + resp := &pb.GetBlockchainInfoResponse{ - AddrIndex: s.addrIndex != nil, - TxIndex: s.txIndex != nil, - SlpIndex: s.slpIndex != nil, - BestHeight: bestSnapShot.Height, - BestBlockHash: bestSnapShot.Hash[:], - BitcoinNet: net, - Difficulty: getDifficultyRatio(bestSnapShot.Bits, s.chainParams), - MedianTime: bestSnapShot.MedianTime.Unix(), + AddrIndex: s.addrIndex != nil, + TxIndex: s.txIndex != nil, + SlpIndex: s.slpIndex != nil, + SlpGraphsearch: gsEnabled, + BestHeight: bestSnapShot.Height, + BestBlockHash: bestSnapShot.Hash[:], + BitcoinNet: net, + Difficulty: getDifficultyRatio(bestSnapShot.Bits, s.chainParams), + MedianTime: bestSnapShot.MedianTime.Unix(), } return resp, nil } @@ -1271,7 +1277,7 @@ func (s *GrpcServer) GetSlpTokenMetadata(ctx context.Context, req *pb.GetSlpToke tm, err := s.marshalTokenMetadata(*tokenID) if err != nil { - return nil, status.Errorf(codes.Aborted, "token ID %v does not exist", tokenID) + return nil, status.Errorf(codes.Aborted, "token ID %v does not exist", hex.EncodeToString(hash)) } tokenMetadata = append(tokenMetadata, tm) @@ -1460,12 +1466,99 @@ func (s *GrpcServer) GetSlpTrustedValidation(ctx context.Context, req *pb.GetSlp } result.SlpTxnOpreturn = entry.SlpOpReturn + + // include graph search count if client includes any value for excludes + if req.IncludeGraphsearchCount { + hash, err := chainhash.NewHash(query.PrevOutHash) + if err != nil { + return nil, status.Errorf(codes.Aborted, "slp graph search error: %v", err) + } + + validityCache := make(map[chainhash.Hash]struct{}) + if query.GraphsearchValidHashes != nil { + for _, validTxid := range query.GraphsearchValidHashes { + hash, err := chainhash.NewHash(validTxid) + if err != nil { + return nil, status.Errorf(codes.Internal, "graph search validity txid %v, error: %v", hex.EncodeToString(validTxid), err) + } + validityCache[*hash] = struct{}{} + } + } + + gsDb, err := s.slpIndex.GetGraphSearchDb() + if err != nil { + return nil, status.Error(codes.Unavailable, err.Error()) + } + txData, err := gsDb.Find(hash, &entry.TokenIDHash, &validityCache) + if err != nil { + return nil, status.Errorf(codes.Internal, "%v", err) + } + log.Infof("SLP graph search count is %s transactions for txid %v", fmt.Sprint(len(txData)), hash) + result.GraphsearchTxnCount = uint32(len(txData[:])) + } + results[i] = result } resp.Results = results return resp, nil } +// GetSlpGraphSearch returns all transactions required for a client to validate locally +func (s *GrpcServer) GetSlpGraphSearch(ctx context.Context, req *pb.GetSlpGraphSearchRequest) (*pb.GetSlpGraphSearchResponse, error) { + + if !s.slpIndex.GraphSearchEnabled() { + return nil, status.Error(codes.Unavailable, "slpgraphsearch must be enabled") + } + + if s.slpIndex == nil || s.txIndex == nil { + return nil, status.Error(codes.Unavailable, "slpindex and txindex must be enabled") + } + + if _, err := s.slpIndex.GetGraphSearchDb(); err != nil { + return nil, status.Error(codes.Unavailable, err.Error()) + } + + // check slp validity, get graph tokenId + hash, err := chainhash.NewHash(req.GetHash()) + if err != nil { + return nil, status.Errorf(codes.Aborted, "graph search hash %s: %v", hex.EncodeToString(req.GetHash()), err) + } + log.Debugf("received graph search for txid: %v", hash) + + entry, err := s.getSlpIndexEntry(hash) + if err != nil { + return nil, status.Errorf(codes.Aborted, "txid is missing from slp validity set for txn: %s: %v", hash, err) + } + + // get map for token and do graph search + gsDb, err := s.slpIndex.GetGraphSearchDb() + if err != nil { + return nil, status.Error(codes.Unavailable, err.Error()) + } + + // setup the validity cache + validityCache := make(map[chainhash.Hash]struct{}) + for _, txHash := range req.GetValidHashes() { + hash, err := chainhash.NewHash(txHash) + if err != nil { + return nil, status.Errorf(codes.Aborted, "graph search validity cache invalid hash %v", txHash) + } + validityCache[*hash] = struct{}{} + } + + // perform the graph search + txData, err := gsDb.Find(hash, &entry.TokenIDHash, &validityCache) + if err != nil { + return nil, status.Errorf(codes.Internal, "%v", err) + } + + res := &pb.GetSlpGraphSearchResponse{} + res.Txdata = txData + log.Infof("SLP graph search returned %s transactions for txid %v", fmt.Sprint(len(txData)), hash) + + return res, nil +} + func isMaybeSlpTransaction(txn *wire.MsgTx) bool { if len(txn.TxOut) > 0 { bchTagIDHex, _ := hex.DecodeString("534c5000") @@ -2705,17 +2798,17 @@ func (s *GrpcServer) getDecimalsForTokenID(tokenID chainhash.Hash) (int, error) } tokenIDRev, err := chainhash.NewHash(tokenIDHash) if err != nil { - log.Criticalf("failed to create chainhash from token ID from %s, with error: %v", hex.EncodeToString(tokenIDHash), err) + log.Criticalf("Failed to create chainhash from token ID from %s, with error: %v", hex.EncodeToString(tokenIDHash), err) return -1, err } genEntry, err := s.getSlpIndexEntry(tokenIDRev) if err != nil { - log.Criticalf("failed to fetch slp entry for %s, with error: %v, with error: %v", tokenIDRev, err) + log.Criticalf("Failed to fetch slp entry for %s, with error: %v, with error: %v", tokenIDRev, err) return -1, err } genSlpMsg, err := v1parser.ParseSLP(genEntry.SlpOpReturn) if err != nil { - log.Criticalf("failed to parse slp message for %v, with error: %v", tokenIDRev, err) + log.Criticalf("Failed to parse slp message for %v, with error: %v", tokenIDRev, err) return -1, err } decimals := genSlpMsg.(*v1parser.SlpGenesis).Decimals @@ -2746,7 +2839,7 @@ func (s *GrpcServer) getSlpToken(hash *chainhash.Hash, vout uint32, scriptPubKey slpMsg, err := v1parser.ParseSLP(entry.SlpOpReturn) if err != nil { - log.Criticalf("failed to parse an slp entry message stored in the index db for txn: %v, this should never happen.", hash) + log.Criticalf("Failed to parse an slp entry message stored in the index db for txn: %v, this should never happen.", hash) return nil, err } @@ -2831,7 +2924,7 @@ func (s *GrpcServer) getSlpToken(hash *chainhash.Hash, vout uint32, scriptPubKey return slpToken, nil } -// slpEventHandler keeps the SlpEntryCache updated on transaction and block events +// slpEventHandler handles valid slp transaction events from mempool and block // // NOTE: this is launched as a goroutine and does not return errors! // @@ -2841,6 +2934,13 @@ func (s *GrpcServer) slpEventHandler() { return } + // track the first mempool event for starting certain services (e.g., graph search) + firstMempoolTxnSeen := false + + // use this wait group to ensure sure the graph search db is created before we try to add + // any txns to the graph search db + initWg := sync.WaitGroup{} + subscription := s.subscribeEvents() defer subscription.Unsubscribe() @@ -2850,7 +2950,28 @@ func (s *GrpcServer) slpEventHandler() { case *rpcEventTxAccepted: txDesc := event log.Debugf("new mempool txn %v", txDesc.Tx.Hash()) - s.checkSlpTxOnEvent(txDesc.Tx.MsgTx(), "mempool") + + // kickoff slp graph search loading here + if !firstMempoolTxnSeen { + firstMempoolTxnSeen = true + if s.slpIndex.GraphSearchEnabled() { + log.Debug("starting slp graph search") + fetchTxn := func(txnHash *chainhash.Hash) ([]byte, error) { + txn, _, _, err := s.fetchTransactionFromBlock(txnHash) + return txn, err + } + initWg.Add(1) + go s.slpIndex.LoadSlpGraphSearchDb(fetchTxn, &initWg, &s.shutdown) + } + } + + // validate new slp txns + isSlpValid := s.checkSlpTxOnEvent(txDesc.Tx.MsgTx(), "mempool") + if isSlpValid && s.slpIndex.GraphSearchEnabled() { + initWg.Wait() + go s.slpIndex.AddGraphSearchTxn(txDesc.Tx.MsgTx()) + } + continue case *rpcEventBlockConnected: continue @@ -2898,12 +3019,12 @@ func (s *GrpcServer) marshalTokenMetadata(tokenID chainhash.Hash) (*pb.SlpTokenM } tokenIDRev, err := chainhash.NewHash(tokenIDHash) if err != nil { - log.Criticalf("failed to parse token ID: %s, with error: %v", hex.EncodeToString(tokenIDHash), err) + log.Criticalf("Failed to parse token ID: %s, with error: %v", hex.EncodeToString(tokenIDHash), err) return nil, err } entry, err := s.getSlpIndexEntry(tokenIDRev) if err != nil { - log.Criticalf("failed to parse token ID: %s, with error: %v", hex.EncodeToString(tokenIDHash), err) + log.Criticalf("Failed to parse token ID: %s, with error: %v", hex.EncodeToString(tokenIDHash), err) return nil, err } @@ -3199,7 +3320,7 @@ func marshalTransaction(tx *bchutil.Tx, confirmations int32, blockHeader *wire.B inputToken, err := s.getSlpToken(&input.PreviousOutPoint.Hash, input.PreviousOutPoint.Index, nil) if err != nil { - log.Debugf("no slp token for input %v:%s, error: %v", input.PreviousOutPoint.Hash, fmt.Sprint(input.PreviousOutPoint.Index), err) + log.Debugf("error: %v (input %v:%s)", err, input.PreviousOutPoint.Hash, fmt.Sprint(input.PreviousOutPoint.Index)) } in := &pb.Transaction_Input{ diff --git a/bindata.go b/bindata.go index be4e83a59..0f34a8f1f 100644 --- a/bindata.go +++ b/bindata.go @@ -77,7 +77,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _sampleBchdConf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x7c\x6b\x73\x1c\xb7\xb1\xf6\xf7\xfd\x15\x5d\xa9\xa4\x48\xb9\x96\xcb\x5d\x4a\x94\x15\xd2\xeb\x2a\x4a\x72\x12\xbe\xaf\x2e\x2c\x53\xca\xa5\x5c\x29\x17\x76\xa6\x67\x07\xe1\x0c\x30\x06\x30\xbb\x5c\x9f\x8a\x7f\xfb\xa9\xee\x06\xe6\xb2\x14\x4d\xd9\x47\xd4\x87\x84\x3b\x03\x34\x1a\x7d\x7d\xba\x81\xf1\x0f\x17\x4d\x53\xe9\x4c\x05\x6d\x0d\xbc\x6f\xe8\xff\xfc\xbf\x27\x93\x73\x38\xfa\xa2\xff\x26\xe7\xf0\x5a\x05\x05\x1e\x43\xd0\x66\xed\xbf\xfc\x02\x93\x73\xf8\x50\x22\xe4\xda\x61\x16\xac\xdb\x41\xb0\xe0\x83\x75\x08\x39\x2f\xdc\x66\x25\x28\x0f\xa1\x44\x58\x55\x36\xbb\x81\xac\x54\xda\x80\x32\x39\x34\x88\x0e\x54\x9e\x3b\xf4\x1e\xfd\x0c\x88\xd0\xe4\x7c\x34\x2c\xa8\x1b\xf4\xe0\x71\x83\x4e\x55\xf0\xd7\x97\x53\xf0\x16\x42\xa9\x3d\x54\x36\x0a\xaf\x6e\x7d\x80\x52\x6d\x10\x14\x54\x36\x80\x2d\xa0\x70\x88\xe0\x1b\x95\xe1\x2c\xb1\x87\x85\x6a\xab\x00\xda\xc3\x2f\xc7\xb3\x55\x56\xe6\xc7\xcc\x9e\x35\x70\xf5\xfe\xfa\xf2\x9f\xf0\xfe\x1a\xfd\x14\xfe\xf8\xe6\xfd\xab\x8b\x37\x17\x57\x57\xaf\x2f\x3e\x5c\x1c\xbf\x1c\x0e\xfb\x87\x36\xb9\xdd\xfa\xe9\xe4\x1c\x7e\x39\x7e\xa3\x57\x4e\xb9\xdd\xf1\x50\x89\xd7\x6d\xd3\x58\x17\xc6\xb3\xde\xaa\x0c\xde\x5f\x4f\x79\xbb\x7f\x2c\x6d\x8d\xc7\xc3\xb5\x27\xe7\x70\x55\x29\xf3\xe7\x19\xc0\x77\x66\xa3\x9d\x35\x35\x9a\x00\x1b\xe5\xb4\x5a\x55\xe8\x41\x39\x04\xbc\x6d\x94\xc9\x31\x97\x9d\xe3\x0e\x6a\xb5\x83\x15\x42\xeb\x31\x9f\x01\xbc\x7b\xff\xe1\xbb\xb3\xc4\xdd\xe4\x1c\xf0\x5e\x42\x61\xd7\xe8\x4c\x55\xd5\x0e\xfe\xf4\xf7\x8b\xef\x2f\x2f\x5e\xbe\xf9\xee\x4f\x53\x58\xb5\x21\x92\x25\x39\xae\x10\x54\x96\x91\x3e\x72\xd8\xea\x50\x4e\xce\xe1\x8f\x69\x30\x94\xe8\x70\x06\x70\x51\x79\x3b\x85\x5f\x48\x96\x1d\x6f\xc1\x8e\x65\x37\x90\x18\xa9\x80\xf6\x9b\x6b\xb7\x1c\xca\x7e\xf2\x28\xd6\xfe\x0e\xc3\xd6\xba\x9b\xc7\x35\xf8\x8f\x1e\x21\xa0\x0f\x06\x03\xed\x2e\xfe\xb9\x5c\x74\xef\x4a\x04\x87\x6b\xb2\x6b\xb2\x0c\x7a\x0f\x46\x18\xa3\xf1\x0e\xd7\xf4\x48\xc6\x5f\x54\x95\xdd\x42\x66\x8d\xc1\x8c\x38\x26\x51\x92\x63\x78\x28\x9c\xad\x41\x99\x1d\x94\xd6\x07\xd8\x96\x68\xa0\xf5\x34\x62\x9f\x74\x6d\x73\x9c\xc1\xcb\x1d\x09\x5a\xec\x7c\x9a\xd6\x00\x63\x73\xf4\xb0\xd5\x55\x05\xd6\x54\xbb\xb4\x10\xad\x62\x43\x89\x2e\x0e\xa0\x25\x30\x27\xad\xa1\xa6\xc7\x93\x73\x76\xb0\x8a\x97\xb6\x0e\x16\x27\x5f\xcf\xe6\xb3\xf9\x6c\x31\x83\x0f\xe4\x7d\x96\x23\x16\x99\x40\xeb\xb1\x68\xab\x21\x7b\x35\x39\x7f\x28\x95\x01\x6b\x10\x88\x29\x9b\xdd\xa0\xa3\xa5\x83\xd2\x86\xb6\x16\x2c\xb8\xd6\xec\x6f\xc4\x0f\x84\xa3\xcc\x8e\xd6\x16\x19\xbd\xb6\xe6\x20\x80\x43\x8f\xa1\x0f\x24\x12\x20\xc8\x92\x56\xca\x23\xe8\x3b\xe4\x3a\xb9\x74\x52\x21\x5d\xed\x4d\x5f\x89\x6c\x56\x18\xc9\xab\x00\x3e\x28\x17\xda\x66\xc0\x8c\xb1\xfc\x72\xac\x60\xaf\xeb\xb6\x12\xd7\x1f\x2a\x78\x72\x4e\x6f\x3a\x73\x78\x15\xe5\xbd\xd1\x0a\x14\x5c\xbf\x7f\xf5\xff\xaf\x4f\xa1\x71\xf6\x76\xd7\xf9\xee\x75\x83\x99\x2e\x76\x24\x3a\x25\xaf\x84\xa7\x5c\x7b\x72\x5e\xa8\xb4\x0f\x68\xb4\x59\x4f\xce\xa1\xb0\x0e\xb4\xc9\x6c\x4d\xa3\x93\xd1\x58\xe3\xa1\x35\x15\x7a\x1f\xc7\xf6\x41\x95\x1d\xbf\x71\x76\xa3\xc9\x4b\x89\x09\x62\xfd\x40\x86\x1d\x4c\xce\xa3\x22\x69\xaf\xbc\xf2\xb2\x53\xf4\xd9\x9f\xe7\xa7\xf3\xf4\xb8\xf5\xe8\x96\xe9\x47\xa3\xbc\x5f\xa6\xb8\x3f\xdc\x11\xa8\x95\xdd\x20\x19\x85\xf2\xbe\xad\x25\x2c\xac\x10\x3e\x58\x07\x87\x65\x08\x8d\x3f\x3b\x3e\xde\x6e\xb7\xb3\x60\x5d\xe3\xec\x7f\x30\x0b\x33\xeb\xd6\x4f\x68\xf5\xcb\x82\x39\x13\x3a\xda\x83\xb1\x64\xa3\x8e\x1f\x16\x96\x7c\x84\x4d\xab\x0f\x7d\xec\x27\x0e\x37\x14\xe7\xc4\xee\x82\x25\xb3\xf5\x2c\x4d\x9d\x09\x67\xf0\x53\x8b\x4e\x23\x5b\x5c\x65\xed\x4d\xdb\x0c\x64\x73\xc8\x89\x44\x9b\xcc\xa1\x62\x59\x19\x6b\x76\xb5\x0e\x3b\xb1\x66\xa1\x27\x26\x9e\xc3\x6a\x97\x96\xa3\xb5\x76\xb6\x75\x70\x79\x05\x2b\xa4\x5f\x15\xaa\x9b\x28\xde\xd7\xef\xae\x79\x3f\xc6\x5a\xa3\xad\xe9\x4d\x46\x19\x50\x55\x40\x67\x54\xd0\x9b\xb4\xd1\x60\x87\x0e\x39\xe3\x29\xc3\x8c\xf8\x61\x28\x92\x28\x54\x32\x62\x16\xab\x62\xc1\x1a\x36\xf2\x77\xd6\xdc\x99\xde\x59\x36\x3b\x5e\x16\x62\x48\x67\x91\xd6\x64\xfc\x4c\x99\x6c\xc0\xf1\x0b\xdb\x86\xce\x00\x75\x01\x86\xbc\x57\x53\xf2\xe5\x20\x17\xb7\x33\x34\x8f\x45\x7a\x9c\xcc\x83\x7f\x74\xe6\xf1\x9d\x61\xf3\x25\x26\x7d\x70\xa8\x6a\xd0\xde\x46\x8f\x59\xed\xc0\x29\x93\xdb\x5a\xff\x4c\x02\x94\x45\x89\x0c\x64\x0e\x73\x12\xb2\xaa\x3c\xb9\x64\x5b\xb1\xbc\x35\xe5\x4a\xa2\x44\xba\x0a\xe2\x2a\x06\xb7\x90\x69\x97\xb5\x3a\xb0\x5f\xa0\xca\xca\x81\x4f\x30\x9e\xd0\x1e\x6a\x86\x10\x3a\x48\x5c\xca\x75\x51\xe8\xac\xad\x82\x88\x31\xb3\xce\x61\xa5\x02\x0e\x9d\x89\x63\xba\x75\x1d\xb7\xbd\x12\x3f\x1a\xbd\x41\xe7\x55\x05\x57\x55\xbb\xe6\xac\x7e\x55\xa9\x1d\x1c\x7e\xbc\x32\x57\x4f\x88\xa0\x6a\x83\xad\x55\x88\x89\xd6\x36\x64\x47\x65\xf2\x61\x20\x80\x30\x39\xe7\x79\x76\x15\x18\xe0\x94\x94\xe1\xd9\x2e\x2a\x32\xa8\xa8\x3d\x09\xfe\x5e\x20\x05\xe6\x90\xe3\x46\x67\x8c\x91\x24\x66\x0c\x82\xf0\xe4\x5c\x14\xcd\x10\xc8\x58\xc0\xa2\x20\x7b\xd2\x05\xe0\xed\x3e\xd9\x18\x10\xa2\x8f\x60\x4e\x3b\x6d\x1b\xd3\xc8\x0e\x63\x20\xba\x8f\x27\xf4\x62\xf6\x64\x71\x64\x18\x5d\x5c\x02\x16\xf6\x7b\x83\x1d\xf7\x8d\x64\x10\x6d\x08\x2f\x50\xc6\x17\x16\xc9\xa9\xa3\x31\xc2\x53\x97\x1f\x35\xca\x85\x1d\x78\x1d\xc4\x41\xa3\x48\xba\xa5\xf5\xc0\x59\x05\xc8\x91\x3a\x51\x19\x4f\xbb\xdb\xd9\x96\x37\xb3\xc2\x52\x9b\x1c\xde\x5d\x7c\x98\x0e\xf8\xeb\xd6\x23\x47\x21\x33\x24\xdd\xe4\x1b\x74\x41\x93\x33\x72\x6c\x57\x59\xc9\xaf\x12\xd7\x31\x86\x12\x61\x1f\x45\xa1\x03\xa3\x1e\x72\x11\x14\x73\xe6\xf8\x49\x32\x3b\x48\x49\xf0\x50\x19\x72\xca\x08\x41\xf7\x75\xc6\xd1\x20\x6d\x49\x37\xcb\xc5\xec\x64\xf6\x74\xf6\x6c\xfc\xf0\x64\x3e\x3f\x39\x3b\x5b\x9c\x3c\x7d\x46\x7a\xf8\xea\x8b\xfe\x23\xc5\xb6\x75\xad\xdc\x8e\xa0\xf1\x81\xca\x73\x82\x17\x07\x40\x86\xdc\x7a\x38\x88\x86\x7f\x30\x9b\x9c\x4f\xce\xe1\x3d\x81\x04\xf2\x7c\x5b\xec\xc5\xde\xb0\xb5\x71\xc7\x7e\x3a\x20\x43\xb6\xdc\xd1\x98\xc6\x08\xdd\xc7\x61\xc6\xa8\x2f\x6d\x28\x41\x31\xd0\x21\xe1\x52\x85\x10\xe5\x2b\x48\x27\x94\x2a\xf0\x9b\xad\x32\x41\x0a\x08\xd5\x41\x15\x8e\x78\x14\x9f\x3a\xac\x4a\x2a\x57\x1b\x4d\xa9\xd0\x83\xaf\xf4\xba\x0c\xd5\x8e\x3d\x1b\x1d\x9a\x40\x0b\xf6\x39\x7f\x60\x7e\x94\x0b\x76\x14\xa1\xc5\xf7\x0b\x1d\x6b\x10\x3f\x8e\xc3\x5c\x63\x0c\x6c\x21\x29\x36\x25\x16\xca\x16\xd6\xa4\xca\x86\x31\x85\xf5\x54\x62\xf8\xcc\xe9\x15\xa5\x0a\xac\xec\x96\x8d\x91\x02\xdb\x4a\xad\xaa\x1d\x6c\x19\xc2\x18\x94\xc4\x55\xdb\x9c\x76\xaf\xcc\x2e\x94\x24\x5b\x46\xd6\x2c\xff\x5e\xb0\xb9\x45\x49\x83\x29\xcb\x0d\xd3\x7d\x07\xdf\x84\xff\x5c\xfb\xcc\x6e\xd0\x61\xce\x81\x23\xe2\x1c\x79\x97\xfc\xa4\x13\x27\xbb\x82\xc9\x41\x55\xde\x42\x85\xc1\x47\xbc\x5a\xdb\x90\xe6\xdc\x98\xa8\x2a\xe5\x48\x97\x6a\xa3\x74\xc5\xd6\x9f\x6a\x90\x4c\x19\xe2\x8d\x36\x31\xe4\xa3\x7b\x37\x4e\x6c\x3b\xdb\xc6\x68\xdc\x21\x0e\xa8\x49\x6d\x31\x99\x13\x80\x1c\x78\x34\x29\x57\x92\xc2\xaa\xc2\xda\xb3\xa2\x62\xc8\x27\xd7\xa6\x58\xef\x6d\x8d\xe2\xc3\xa4\x8a\xc3\x06\x5d\xa9\x1a\x0f\x79\x2b\x8e\x0e\x85\x76\xb8\x55\x55\xf5\x24\x4a\xb5\x37\x50\x2b\x31\x57\xb8\x2e\x95\xc9\xa7\x62\x1c\xef\xdf\xbd\xf9\xd7\x90\x67\x86\x78\xc9\x86\xe3\xf6\xc4\xd1\x4d\x94\x3d\x45\xe3\xcb\x20\x62\x8c\x58\x6d\x18\x14\x0f\x07\x26\x84\xb7\x54\x27\x6a\x32\x53\x02\x99\x32\x88\x04\xdb\x45\xd6\x7d\x68\x16\xc5\xf4\x84\x35\xf5\xfa\xdd\x35\x78\x44\x12\x02\x1b\x27\xbb\x4a\x1f\xe0\x98\x50\x0c\x6d\x39\x15\xdb\x84\x35\x3a\x95\x71\x95\x1d\x37\xd4\x5b\xc4\x60\xa7\xb4\x82\x98\x27\x95\x7e\x0d\x25\xa8\xa1\xa9\x75\x65\xc8\x40\xd1\x33\x80\x6b\x3b\x15\x86\x93\x68\x93\x62\x25\xff\xe8\x0d\x56\x3b\xf1\x79\x52\x7a\x74\xfb\xfd\x12\xe4\x0f\xc1\xb5\x54\x78\xfc\x21\x92\xfd\xf2\xc1\x8f\x2a\xac\x9c\xf4\xe7\x3c\x0b\x36\x7c\xca\xe3\x49\x66\x39\x7a\xed\x38\x5a\x51\x22\x63\xa1\x35\xe8\x24\x87\x4d\xce\xe1\x5f\xb6\xe5\xd8\x96\x02\x17\x83\x8d\x41\xbe\x66\x64\x35\x06\x52\xd6\x05\xe9\x69\x74\xdd\x07\x7a\xc4\x8a\x9b\x9c\x73\x5e\xca\x09\x94\x8f\x11\x83\x2e\x20\xe2\x2e\xd2\x6d\x6f\x80\x31\x42\x40\x0c\x0f\xcb\xc5\x9f\x4f\x66\x8b\xe7\x2f\x66\x8b\xd9\x62\xf8\x74\xce\xe8\xec\xe4\xec\xc5\xd3\xa7\x4f\x07\xcf\x0b\x7c\x31\x3f\x3b\x1b\x8e\xfc\x41\x1e\x9d\xfc\x5b\x86\xde\x2b\xa6\x14\x99\xd9\x3d\x52\x78\x7e\x48\x72\x54\x29\x24\xd9\xc1\xff\x49\x74\x7d\x49\xdb\x0b\xef\xf7\x8a\xee\x4e\xb5\x15\x06\x95\x6c\xa9\x7c\x34\x70\xaf\x73\x8c\x46\xec\xe3\xf6\x62\x5c\x8f\xe5\x8d\x89\xe1\xf5\xfe\x54\x0a\x3e\x26\x5c\x1f\xa1\x68\xef\x52\x7b\x8a\xeb\x9e\xee\x29\x2e\x3d\xef\x15\x97\x9e\xdc\x55\xdc\x5b\x75\xab\xeb\xb6\x06\xd3\xd6\x2b\x74\x94\xb8\xb5\x59\xd9\x96\x22\x3c\xe1\xcc\x36\xc8\x8f\xce\xc3\x6a\x75\xcb\x7f\x2f\x17\x27\xa7\x71\xfe\x67\xcd\x65\x9d\x5e\x5e\x0d\x49\x34\xe8\x74\xb3\x64\x2a\xaf\x29\x05\x89\x59\xf8\x9d\xc9\xe2\x14\x5f\xd9\x2d\x85\x9f\x92\x72\x02\x89\x3b\x94\x0e\x7d\x69\xab\x9c\x0a\xf6\xd5\x2e\xa0\x3f\xf6\x98\x31\x4d\x6d\x68\x22\xcd\x8b\xa5\xb4\x6f\x10\xf3\xe5\xe9\xe2\x64\x3e\xa7\x15\xde\x75\x3c\x76\x7c\xed\xa5\x44\xaa\x6a\x08\x42\x32\x80\x57\x6e\x8d\x21\x8d\x94\x0d\xbf\x88\x8c\x72\x5c\x5c\x29\x23\xe0\xb5\x80\x5a\x7b\x81\x14\x94\x75\x92\x98\x8c\x8d\x23\x04\x1c\x27\x29\x73\x48\xa3\x24\xaf\x0c\xf8\xcc\x32\x00\x2d\xa4\xb2\xf0\x83\x2e\x0e\x89\x2f\xad\xf0\x49\xf2\x2b\x65\x3a\x59\x2c\x17\xb2\xc3\xbf\xd9\x2d\x54\x56\x7a\x40\x44\xff\xee\x44\xf8\xbb\xaa\x74\x0e\x41\xd7\x08\xad\xd1\x41\xf0\xfc\xff\xf8\x29\xd4\x53\x28\xff\x4b\x84\xdf\x6a\xc3\x8c\x2e\xd2\x32\x79\xeb\xa4\x8c\x39\x79\x56\xee\x3d\x59\x2c\xca\xa7\xf3\x7a\x71\xea\x53\x00\xd8\x96\x3a\x20\xa7\xa0\x9c\x5c\x34\x29\x82\xb7\x73\x79\xe5\x67\xa9\x9f\xd1\xa5\xc4\x2d\x63\x9f\xcb\x2b\xa8\x55\xc8\x4a\xaa\x2f\x08\xad\x25\x2a\x7d\x96\x62\x10\x15\x4a\xd4\x6e\x20\xb9\x54\x7a\x73\x1d\xd2\x4d\xea\x8b\xcc\xd1\x53\x71\x83\xc1\xa8\xe8\x48\xf3\xd9\xfc\xf8\xe4\xd9\xe8\x55\x91\xcf\xe7\x67\x67\xc7\x8b\xe7\x43\x7d\x0f\x92\x28\x43\x88\x94\xc8\x86\x58\x91\xeb\x7e\x06\x8c\xdc\x04\xf2\x53\x2a\x00\x78\x0f\xad\xa7\x58\x44\x34\x82\x8d\x40\x92\x88\x8c\xd3\xec\x28\xad\x50\x38\x13\x3b\xca\x8d\xa7\x85\xef\x16\x59\xda\x04\x74\x85\xca\x62\x7f\x42\x6a\xc4\xae\x98\x1a\xf7\x72\x46\xd9\x28\x15\x81\x7b\xa9\x85\xca\x23\x42\x96\x5a\xfa\x15\x04\x92\x12\x64\xef\x1a\xf1\x07\xb1\x5b\x79\xc0\x48\x42\xd3\x24\x06\x52\x99\xad\x6b\x4c\xbd\xdc\x3e\x80\xee\x62\x38\x8e\x88\x91\x20\x3c\xf7\x08\x88\x9b\xb4\xb6\xb4\x23\x32\xb2\x04\x8a\x8d\x0f\x43\xe7\x60\x21\x8f\x20\x6a\xab\x3d\xef\xe8\xa2\xaa\x86\xe2\xb0\x66\xbc\xb3\xd8\xaa\x11\xa8\x1a\xdf\x3c\x39\x9b\x9c\x43\x94\xd2\x32\x91\x68\x36\xcf\x7e\x85\xce\x70\x86\x44\xdc\x79\x3f\xf1\xf9\x43\x13\xd3\xcc\xb3\xb3\x4f\x32\xcc\x8c\x52\x50\x1e\x0f\x8e\x11\xfd\x1e\xee\x3e\x3d\x29\xf2\xb6\x37\x77\x9f\xc1\x4f\xcf\xfd\xe1\xec\xec\xdf\x69\x22\x57\x73\xbc\xea\xa0\x9b\x7b\xdf\xc4\xbe\xb7\xb3\x37\xfb\xf9\xe7\xcc\xfe\xe1\xec\x6c\xf1\xd0\xba\xc6\x9a\x23\x1f\x94\xc9\x95\xcb\x3b\x32\xcf\xef\x67\xe2\xf9\x27\xe5\xfc\x19\x54\x46\x93\xef\x0a\xfd\x33\x28\x0c\x34\xf0\xfc\x7e\x0d\x7c\x06\xa1\xa4\x8e\x51\x2c\xea\xab\x84\xfb\x1a\xba\xa9\x7b\x25\x9d\xfb\x0d\x3a\x47\xb0\x44\x55\x55\x9c\xdb\x25\xa9\x24\xb7\x21\x79\x46\xaf\xab\xca\xda\x1a\x0a\x5d\x05\x74\xda\xac\x09\xb2\x23\xc2\xcb\xcb\xab\xf9\x62\xb1\x90\xb9\x34\x8e\x87\xc9\x28\x1f\x4f\x24\xf2\x9c\x82\x8e\x26\x3e\x54\x05\x59\x89\xd9\x4d\x63\xb5\x09\x7e\x06\x7f\xb1\xae\x56\xe1\x0c\x0e\xbe\x29\x91\x0a\xb8\x6f\xcf\xbe\x29\x95\x2f\xbf\x3d\x10\x68\xd9\x8f\x5d\xee\x0d\x18\x65\xde\x56\x57\xe1\x48\x9b\x31\xe9\xd8\xe5\xcf\xe3\xf9\xde\x20\x8a\x70\x35\xba\x8d\x48\xf4\x80\x52\xad\xa5\x0d\xf1\x16\x06\x24\x7a\xee\x25\x96\x05\x9f\xca\x1e\x6e\x2c\xaa\x35\xc1\x5a\x06\xb4\xda\x0f\x0b\xa6\x74\xe0\xc2\xc9\xb3\xe5\x33\x93\x40\x3a\xa9\xda\x9c\xa2\x9a\x72\x2a\x23\xe1\xc0\xc1\xf1\xc1\x14\x0e\xce\xe8\x7f\x0e\x63\xdf\xe3\xc9\x01\x77\xd0\x54\x5c\x70\x39\xdc\x25\x3d\xd3\x21\x65\xca\x5e\x11\x70\xf8\xea\x2f\xb1\x45\x9c\x0d\xe4\xfe\x18\x87\x61\xdf\x5f\xbd\x02\x8f\x6e\x43\xa8\x29\xa6\x81\x23\xce\x1a\x7d\x57\x27\x3d\xcf\xac\x09\xce\x56\xd2\x5e\x49\xfa\xe9\xe7\x4b\x7a\xcd\xca\xae\x1d\x2e\x89\x8e\xa7\x90\x24\x24\x23\x6a\x53\xb0\x7d\x10\xa0\x96\xb2\x11\x5c\x2b\x18\x88\x93\x6a\xe3\x6c\x86\xde\x4b\x4d\xde\xe7\xb0\x01\x9b\xda\xa7\x52\x9a\x33\x58\x77\x6c\x5b\x80\x6b\x32\x56\xe3\xc5\xbb\xd7\xf4\x77\xa3\xbc\x9f\x02\x77\xe8\x5d\x93\x55\xba\xd6\x61\xf8\x9a\x1f\xc8\x18\x02\x48\xa3\x82\x60\xf6\x28\x67\x82\xd7\x98\xb5\x4e\xda\x83\xb4\x9f\x8b\xab\x4b\x4e\xc1\xc3\x6a\x43\x0c\xd1\xa8\x1a\xe5\xf8\x5b\x79\xbf\xb5\x2e\x8f\x25\x52\xc6\x27\x04\xde\x76\xbd\x33\x4a\xbd\xbc\x0f\xcc\x7f\x75\x22\x1f\xdc\x76\x53\x02\x54\xa8\x38\xdc\x12\x60\x29\xda\xaa\xe2\x96\x83\x2d\x46\x9d\xf5\xa3\x8e\x32\x81\x98\xbc\xd6\x06\x8e\x20\x1e\xb7\x0c\xd4\xd1\xd7\xaa\x49\x2b\x33\x11\x38\x77\xfc\xc9\x25\x71\x83\xee\x47\x26\xf0\x63\xe2\xf1\xc7\x9d\x6d\x7f\xa4\x52\x51\x86\xca\x79\xc0\x58\x4d\xfd\xd4\xc8\xc6\x7d\x93\x3b\x3d\x2e\x7f\x05\x3b\x15\x77\x19\x7f\x18\x4b\xf5\xfd\xe9\x2f\x02\xa6\x48\x6b\x11\x4e\x7d\x01\x30\x45\xf5\x1e\xc3\xa9\xdf\x01\xa6\xc6\x88\x36\x70\x0d\xbd\xa7\x52\xe9\xc3\x74\x32\x1a\x24\x69\x12\xe5\xe5\xd5\xe6\x59\x04\xfc\x9b\xe7\x0f\x63\x33\xc9\x76\xac\xab\xdf\x8a\xc4\x06\xb3\x7e\x07\x1a\xeb\x27\x3f\x00\xc8\x9e\xdd\x19\x4f\x0f\x1f\xc6\x64\x77\xe6\x0d\x40\xc1\xb3\x87\x61\xd9\x9d\xe9\x09\x0a\x3c\x7b\x18\x99\xdd\x99\x3b\xc2\x45\xcf\x1e\x06\x67\x9f\x5a\x7c\xf1\xd0\xea\x9f\x84\x33\x5f\xff\x2a\x2b\x5f\x7f\x3e\x44\xbb\x43\x68\x34\xff\x33\x51\xda\x1d\x22\x03\x9d\x7c\xfd\x1b\x81\xda\x1d\x5a\x49\x41\x5f\x53\xb0\xf9\x8b\xae\x30\xdd\x59\x48\xf1\x3b\x23\xcc\x50\xe8\x4c\x05\xa4\x84\x8e\x12\xa4\xe8\x69\x77\xb5\xc5\x35\xd9\x8c\x1e\x7c\x0e\x89\x1b\xdc\x09\x85\x1b\xdc\x8d\x08\xd0\x8b\xbd\x78\x57\xdf\xe9\xf2\x64\xd6\x64\xad\x73\x84\x6a\xc8\xbf\xb3\x4a\x33\xe6\xe1\xf6\x78\xda\xea\xde\xa9\xa6\x6b\xb2\x5a\xdd\xc6\x91\xcb\xc5\xfc\x37\x2f\xb2\xc5\x95\xb7\xd9\x0d\x86\xb4\x5c\x4f\xb5\x7b\xe5\x97\x9f\xea\x2b\xed\x11\x72\xf8\x53\x8b\x3e\xc4\x0e\x63\x3c\xd7\x8f\xf8\x00\xf3\xc1\xe8\x6a\x37\x60\xbc\x7b\xea\xf0\x27\xbf\x3c\x61\xfe\xdf\x6a\xe7\xe2\x89\x00\xfc\xbf\xeb\xf7\xef\x8e\x88\xfc\x4f\xad\x76\x37\x9e\xd6\x7d\xa9\x43\x66\xb5\x81\x57\xd6\x21\x1c\x1d\xc5\x68\xcf\xdd\xaa\xd6\xa9\x35\xe5\x56\x0e\xb1\x93\x73\x31\x19\x0a\xc6\x6a\xa5\x2b\x1d\x76\xa0\xbd\x6f\xd1\x77\xa7\x36\x2b\x84\xad\x75\x37\x98\x83\x72\xb6\x35\x29\x17\xca\x5a\xe3\xcb\x21\x3d\xc0\x8a\x17\x91\x38\x4c\x47\x64\xb8\x97\xab\x70\x83\x86\x10\x0e\x9f\xc2\x44\x94\x23\x27\x0d\x31\x7b\x8e\xcf\x6c\xa5\x0d\x99\xea\x03\xe9\xb0\x73\xe3\x93\x1b\x13\x3a\xbb\xe1\xb3\xb0\xd1\x4a\x94\x9c\x52\xf4\x97\x1e\x6b\x6c\x2a\x05\xcb\xe7\x3e\x1b\x1c\x81\x03\x86\x6e\x6c\xab\xd6\x14\x7a\xcd\x96\x2e\x80\xd5\x35\xd9\x6f\xd8\xe7\x87\x37\xd7\x9f\xc8\xcd\xa3\x33\xec\xfe\x3c\x88\x53\x92\x34\x9b\xa2\x2c\xc6\xb0\x50\x1a\x7e\x7c\x8d\x23\x45\xac\x81\x8b\x1f\x26\x74\x1a\x7b\xb3\xa9\x45\x20\x6c\x87\xea\xd1\x20\xf6\xfa\xf7\x61\xec\xc9\x39\x7c\x85\xb7\x0d\x3a\x4d\x75\x83\xaa\xbe\x1a\x11\x7a\x18\x6a\xb3\xb5\xfe\x2e\xb0\x3d\x5c\x87\x8f\xae\x5a\x8f\x3e\xd9\x1e\x05\x27\x5e\x44\x62\x52\xe2\x5c\xba\xf0\xda\x20\x77\x6d\x7b\xdd\x70\x60\x89\xf6\xf8\x28\xa0\x9a\x4b\x51\xd3\x2b\xfa\x98\x43\x77\xdf\x2b\xe3\x6b\x1f\x03\x31\xca\xee\x06\x41\x6f\x72\x0e\x87\x23\xe4\x40\x71\xff\x74\x9a\xae\xec\x9d\xc1\x82\x7e\xb3\x99\xac\xfb\x3c\x40\xcf\x78\x79\x03\xaa\x0d\x25\xf9\x45\xbc\xe4\x19\xec\x4d\x5c\x36\x24\x59\x12\xd2\x97\x8b\x1f\x69\x20\x0e\x83\x23\x91\xa5\x77\x3c\x73\xf9\x8d\xa5\xbf\x4f\x8e\xf8\xd7\xb7\x8f\x63\x92\xaf\xd3\x95\xb8\xeb\x78\x07\xf2\xb3\x8a\xbe\xee\x22\x1d\x07\xe4\xd2\x56\xb9\x1f\x5e\x97\x93\xfb\xb8\x8f\xa3\xe5\x8e\xe1\x95\xca\x6e\x50\xbc\xbc\xf5\xd8\x89\xf9\x25\x33\xf0\x2a\x31\x20\x2d\xf0\xdc\xf1\x55\x9c\x33\x28\x8a\x2a\x5f\x91\x85\xae\xc2\xae\xc1\xa5\xfc\x24\xaa\x58\x61\x40\x28\xb5\x0f\xd6\xe9\x4c\x55\xb2\x91\x61\x78\x63\x8a\x70\x01\xab\xb6\x28\x24\x4b\xc5\x21\xf1\x98\x89\x1b\xa3\x7c\x67\x91\x0d\x3f\x23\x1e\x6d\x41\x8e\x86\xd6\xad\xe5\xd2\x5c\x6b\x50\x42\x22\x89\xb8\x4f\x77\x91\x10\x07\x58\xbe\xd5\xc2\xad\xe5\xe4\xa0\x7c\xf9\xaa\x25\xb2\x7c\x47\x71\x72\x0e\xaf\x94\x89\xb7\x55\x18\xef\xf3\x81\xc9\xc9\x8b\x17\xdd\x1a\x39\x36\xa1\x5c\x3e\x7b\x2a\x39\xef\x7b\xa4\x1a\x3d\xe7\x5d\x7c\xfc\xf0\xcf\xf7\xbd\xf6\x78\x73\x5d\xea\x04\x6d\x72\xbc\xa5\x02\x46\xd8\x21\x1c\xad\x7d\xbc\x84\xca\xef\x58\x06\x3e\xa8\x80\xcb\x79\xda\x45\x42\x01\x5e\xff\xcc\xf7\x2a\xdf\xea\x97\xe9\x3a\x48\xb7\x4e\xa6\xb2\x92\x19\xcf\x57\xfc\x27\x8d\x5d\x9e\xce\xe7\x77\x25\xe1\x31\xb3\x26\xf7\xb0\xc2\xb0\x45\x1c\xdc\xd8\x2c\xaa\xd6\x97\x72\xb3\x27\x5f\xf1\x0f\xf6\xf3\x8d\xaa\x96\x8b\x17\x44\xe9\x31\x9c\xe3\x7a\x67\xb2\xd2\x59\xa3\x7f\x8e\xb7\xb6\x3f\xd7\x47\x4a\xbb\x65\x09\x74\xb7\x8b\x28\xa9\x76\xc4\x10\x74\xa0\xb1\xcd\x2e\x49\xea\xd1\xbd\x86\x76\x22\xf5\xfd\xbe\x5d\x57\x54\xff\xf7\x8d\xb1\xd4\x05\x0b\xba\x01\xa7\xf8\x8c\x93\xcd\x8b\xc7\xaf\xd1\xa0\xd7\xac\x84\x42\xf9\x40\x3b\x7a\xac\x54\xf9\x16\xeb\xc6\xda\xea\x41\x91\x3f\xda\x37\x0a\x23\xbb\x16\xfd\x1c\xa6\x53\xc8\x27\xd2\x75\xec\xef\x8e\xc9\x5d\x88\xfb\x5c\xf3\xe9\xc9\x9c\xff\xc9\xe5\x2e\xca\xb3\x7a\x83\xa2\x07\x72\x84\xf4\x5a\x1a\x43\x72\x69\xa9\x8e\xe7\x72\xc1\x29\xe3\x95\xa4\xce\x02\x31\x9d\x9e\x58\xe3\x75\xce\x37\x78\x14\x57\x2b\x3f\xa3\xb3\xf4\x7e\x2a\x47\xa3\x0e\x2b\xb5\x0b\xb7\x05\x22\x55\x3c\xf3\xf9\x9c\x63\xce\xf7\x2a\xe0\x11\xf7\x48\xe4\x9b\x87\x01\xed\xae\xf9\xb9\x51\x55\x8b\xb0\x38\x85\xaf\x60\x31\x9f\xcf\x65\xbb\xb1\x03\x52\x6b\xd3\x06\x76\x63\x26\x42\x34\x78\xa1\xe5\xe2\x54\xc2\x0c\x61\x5b\x8a\xa1\xeb\x12\x1a\xa7\xad\x23\x54\x4c\x61\x99\x47\x71\xff\x9a\x96\xb5\x0e\x2a\xbb\x3d\x2a\xf6\x38\x88\x98\x91\x86\xa6\xc9\xcb\x08\xd9\xa3\x28\x74\x8d\x5d\x5c\x50\x21\x60\xdd\x48\xd3\xd6\x53\x16\x30\xb8\x05\x6d\x36\x68\xd2\x67\x25\x6a\x74\x25\xac\x41\xc6\x92\x1f\xc6\x47\xa1\xa2\x36\xcc\xcf\xc0\x78\x38\x34\xca\xd8\x18\x7f\x9e\x4c\xa1\xf5\x70\x58\xeb\xcc\xf5\x8f\x48\x04\xfc\xb0\xaa\x74\x3f\xce\xc3\x61\xff\xa3\xa6\xd7\x24\x25\xfa\x51\xc2\x61\x69\x5b\xe7\x19\x30\x04\x47\x60\x1b\xbb\xa0\x75\x3a\xaf\xf9\x1c\xf5\x0d\xeb\xc3\xba\x86\x0f\xbd\x07\xda\x66\xeb\x0f\x96\xd4\x70\x47\x4e\xb5\xba\x95\x19\xe1\x36\x9d\x06\xbf\x96\xd6\x91\xec\x68\xac\x5a\x76\xdd\xe1\x8d\xad\x59\xfa\x6e\xc6\x13\x8e\x96\x84\xf4\x3d\x09\x7e\x5c\xf9\x8e\x88\x38\x5c\x2b\x97\xb3\x4d\xdb\xa2\xeb\xaf\x98\xbd\x0f\x28\x24\x57\x54\x6a\x67\xac\xf1\x21\x4f\xa4\xff\x83\x59\xf8\x42\xb4\x89\xd4\x90\xf8\x03\x29\x88\xf3\x5d\x97\x7e\xda\x70\x6b\xf9\x47\xad\x6e\xd9\xf5\x9e\x9d\x3e\x52\xe6\x90\x8f\xb4\x54\x05\x97\x9c\x53\x1f\x27\x4c\xbd\xe4\xb4\x4e\x08\x3c\xdd\x65\x00\x25\x41\xbe\x54\xbe\x3c\xa2\xbc\x39\x92\xb4\x24\xf8\x58\x30\xc8\x4d\x67\xc5\xa9\x69\xa4\x8d\xfe\x94\x3a\x5d\x33\x5b\x63\x70\x6a\x3b\x24\xf4\xfd\xd5\x2b\x36\xea\x5b\xa6\x28\x9a\xb8\x9f\x9b\xd8\x48\xfd\x2c\x86\xa4\xdc\xf1\xa8\x5c\x56\x8e\x17\xf5\x5c\x47\x74\xdc\xc5\xfb\x4d\xee\x01\x0e\xd2\x1a\xb6\xa0\xd8\xa6\x73\xb8\xd6\x75\x53\x21\xbc\xc1\x7c\x8d\x0e\xae\x9c\x0d\x36\xb3\x15\x1c\x5e\xbf\xe1\x3b\xd9\x37\x7c\x2a\x3d\x5a\x76\x24\xaf\x01\x56\x61\x40\x5f\x63\x28\x6d\x2e\x8d\x14\xb9\x92\x2c\xdf\x5e\x08\xf6\xaf\x31\x28\xfe\x7c\x6b\xc4\xb6\xaf\x9a\x01\xd7\x5f\xd8\x2e\xce\xe1\x5a\xaf\x8d\x0a\xad\x43\xf8\x3b\x3a\xe9\x1e\x91\xac\x5f\x91\xe1\x3f\x8a\x1d\x4a\x0c\x93\xcf\x5c\xd2\xd2\xec\x66\x12\x87\x6b\xc5\xe2\x3f\xa5\x44\x04\x68\x82\xd3\x82\xe3\xbc\x5e\x8f\x9c\xf1\x54\x92\xe0\x63\x88\xe4\x95\xd5\x06\xfe\x8a\x06\xe5\x2a\x0b\x1c\xbe\x65\x3d\x3d\xf9\x4d\x55\x0f\xd5\x67\x3d\x89\x04\xdb\x81\x12\x51\xa5\x28\x4d\xa6\x4f\x3f\xba\x3b\xe9\xb5\x74\xf2\x54\xff\xe1\x1f\xdf\x69\xb2\xed\xba\x8c\x9d\x96\x4c\x55\x15\x5f\x1c\xdb\x22\x39\x8a\x1f\x1f\xa9\xbd\xba\xfa\x48\x34\xd0\xc1\xa1\x2e\xe2\x9d\xf2\xfc\xc9\xe3\x20\xc4\xf8\x01\xc6\xfe\xda\x72\x76\x3a\x68\x0a\xc4\x9b\x15\xdd\xe7\x81\xdc\x8a\x89\xd7\x72\xb9\x06\x43\xcf\xad\x9d\xa6\x75\x8d\xf5\xd8\x1f\x7f\xc4\x2a\x5a\x8e\xe1\xe4\xab\x27\xf0\xda\x64\xd2\x1b\xea\x3e\xb5\x20\x8a\xec\xbf\xf4\x5e\x7b\x28\x94\x83\x60\xad\xc0\x0a\x5a\xa0\x67\xac\x3b\xfe\xd8\x5a\x17\x4a\xb9\xcf\xbf\x2d\x63\xff\x29\xaa\x0a\x97\x85\xaa\x3c\x0e\x8e\xaa\xe3\x1d\xda\x60\xa1\x51\x3b\x16\x6f\x3e\x28\xc0\xf6\x56\xe0\x13\x34\x1b\xa4\xd9\xc5\x25\x52\xb4\x84\x7d\xdd\xa7\xe5\xf2\xbe\xde\xc7\xc0\x83\xd2\x18\x0e\x9a\x77\xbe\x7c\xe8\x6e\xe9\xc8\x82\xf4\x66\xb9\xa0\x9d\xac\xa4\x15\x19\x87\x3e\x38\xe0\xe4\xc1\x11\x4f\xef\xf4\x6f\x23\xb0\x92\xad\xa4\xe4\x29\x88\x2f\x58\xf9\x78\x66\xff\x84\x88\xb4\xfd\xe9\xf8\xc8\x07\x4e\x68\xd8\xb6\x0b\x44\xcf\x67\x85\xa2\xb5\xf8\xb4\xc3\x84\xe9\x5e\x66\x3c\x36\xcf\xb9\x3f\x35\x90\xe0\x9e\x6c\x67\x30\xfe\xea\xed\x13\x7c\x33\x45\x2a\x4d\x51\x11\xb5\x88\x0e\xe5\xde\x7e\x55\xdd\x4f\x1a\xda\x26\x7e\xe6\x34\xdc\x50\x6b\x82\xae\xe2\xf1\x9c\x0a\x84\x77\xf9\x90\x74\x7c\xc9\x7b\x50\xbd\x93\xc4\x3a\x4c\x55\x6b\xc3\xd1\xec\xde\x76\xf9\x43\xe2\x66\x17\x13\x1c\x9e\x04\x15\xcf\x3d\xe5\x4b\x84\xd8\x6b\xf5\x68\x7c\xeb\xe5\x15\xe8\x22\xb2\x5b\x29\xb7\xee\xaf\x50\xaa\x20\x84\x7a\xe6\x62\xa8\xfd\xfa\xb4\x2b\x38\x06\x1c\x8e\x79\x8a\x08\x8a\x34\x78\x94\x54\x77\x9c\x90\xbb\x72\xa8\xa4\x4b\xd1\x7f\x63\x95\x16\xa1\x3d\xdc\xb5\x0f\xae\x59\x3c\x9f\x2d\x33\x93\xa0\x6a\xdb\x9a\xe0\xa7\x20\xf7\x3b\x9b\x96\xfe\x26\x7f\xf3\xb5\xa0\x12\x62\xc7\x77\x77\x01\x99\x11\xf4\xa1\x33\xa3\xe8\x4b\x2c\x8a\x9f\x5a\xa4\x40\xc2\x2c\xa7\xab\x5f\x2a\x50\xd4\x89\x0c\xcb\x87\x6b\x77\xcb\x1e\xb5\xc6\xa9\x7c\x88\xe0\x94\x96\x0f\x43\x3b\x33\xa5\xe2\x17\x57\x3b\xca\xfc\xf1\x3c\xa6\xe6\xcf\xc2\xb8\x00\xba\xc1\x6a\x17\xab\xb1\x64\xc6\x12\x1c\xf8\x23\xb8\x2c\xa5\x08\xf9\xf0\xac\x13\x4b\xaf\x5a\xed\x07\x5a\x5d\xed\x62\x17\x40\x75\x2a\x4a\x9d\x6e\xbe\x6f\x3f\x36\x03\xda\x96\x41\xcc\xe5\x7c\x9d\x69\x27\x9e\x87\x79\xf4\xbc\x0b\xd6\xca\x44\x6a\xaa\x8a\xab\x53\x5e\x6e\x9a\xd8\x3d\x13\x83\xd2\x26\x7e\x19\xdb\xb4\xf1\xfb\xe1\x94\xec\xd8\xe9\x78\x19\xfe\x7c\x59\x5c\x67\x06\x97\x21\x85\x05\xb6\x5f\xf9\x56\x9d\xeb\x31\x02\x01\x95\x68\xa0\x6f\x6e\x6c\x95\x8f\xc1\x96\x1d\x8e\x46\xcf\xe0\xb2\x88\xd7\xfd\x73\x29\x5f\xe4\xce\x38\xb1\x5d\xb4\x26\x13\x96\x49\x15\xbb\x78\xe5\xc1\x53\x4e\xe8\xbe\x43\x20\x1f\xdf\x81\x0f\x2e\x5e\xf0\xc9\x56\x45\xa5\xd6\x7e\x29\xac\x3c\x4e\xbb\x14\x57\xed\xfa\x71\xfa\x9a\x44\x19\x2a\xbb\x5e\xcb\x47\xa2\x1b\xac\xfa\xfe\x25\xff\x8c\xd7\x77\x83\x53\x19\x4e\x21\xa7\xf1\x53\x6e\xec\x4f\x61\xab\x9c\x99\x02\x3a\x67\xdd\x14\x32\xa7\xf9\x96\xfb\x7f\x07\x5f\x22\x70\xf3\x3e\xdd\x2b\xf8\xc6\xb7\x2b\xbf\xf3\x01\xeb\x6f\x97\xdf\x30\xe9\x6f\xa7\xfd\xb3\x93\xfe\xe1\x6c\x36\x93\x02\x9b\x83\xa0\x8d\x6c\xc5\x6b\x68\xb9\xde\xe8\xbc\x55\x15\x74\x33\x29\x52\x7f\xf4\x28\x27\x0a\x47\x47\xcc\x21\xcf\x58\x7a\x6e\x88\x49\x27\x7e\xfc\x89\x50\x3f\x97\xcf\x0d\xba\x19\xb4\xaf\x54\xdf\x71\x1f\x3f\x9d\x6e\x0c\x9a\xf9\x7f\xfb\xf0\xe1\x0a\x1a\x67\x0b\x5d\x61\x77\x46\x18\xbf\xa2\x48\x8f\xef\xbd\x9b\x22\x07\x47\xa3\xaf\xd3\xc7\x17\x7f\xc6\x74\x86\x07\x28\x64\x89\xf2\x21\x4d\xfa\xaf\x1f\xa8\x00\x65\x08\xcd\xd9\xf1\x71\x77\xe0\x74\xf6\x4d\x9c\x4a\xdc\x7f\x7b\xcc\x5b\x3b\x6e\xe8\x19\x58\x8a\x55\xb1\xbb\x1b\x3f\xa6\xa6\x81\xcb\xe7\xf3\xe7\x5c\x11\xfc\xc3\xe9\x80\x8c\x42\xd2\xea\x77\x3e\x31\x4a\xa7\x6c\x59\xd3\xa6\xd9\xc7\xa1\x6e\xd8\xf2\x67\xf4\x64\xf2\xbf\x01\x00\x00\xff\xff\x94\xe0\x08\x63\x34\x44\x00\x00") +var _sampleBchdConf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x7c\x6b\x73\x1c\xb7\xb1\xf6\xf7\xfd\x15\x5d\xa9\xa4\x48\xb9\x96\xcb\x5d\x4a\x94\x15\xd2\xeb\x2a\x4a\x72\x1c\xbe\xaf\x2e\x2c\x53\xca\xa5\x5c\x29\x17\x76\xa6\x67\x07\xe1\x0c\x30\x06\x30\xbb\x5c\x9f\x4a\x7e\xfb\xa9\xee\x06\xe6\xb2\x14\x4d\xd9\x47\xd4\x87\x84\x3b\x33\x68\x34\xfa\xfa\x74\x03\xf0\x8f\x17\x4d\x53\xe9\x4c\x05\x6d\x0d\xbc\x6f\xe8\xff\xfc\xbf\x26\x93\x73\x38\xfa\xa2\xff\x26\xe7\xf0\x5a\x05\x05\x1e\x43\xd0\x66\xed\xbf\xfc\x04\x93\x73\xf8\x50\x22\xe4\xda\x61\x16\xac\xdb\x41\xb0\xe0\x83\x75\x08\x39\x4f\xdc\x66\x25\x28\x0f\xa1\x44\x58\x55\x36\xbb\x81\xac\x54\xda\x80\x32\x39\x34\x88\x0e\x54\x9e\x3b\xf4\x1e\xfd\x0c\x88\xd0\xe4\x7c\xf4\x59\x50\x37\xe8\xc1\xe3\x06\x9d\xaa\xe0\xfb\x97\x53\xf0\x16\x42\xa9\x3d\x54\x36\x0a\xaf\x6e\x7d\x80\x52\x6d\x10\x14\x54\x36\x80\x2d\xa0\x70\x88\xe0\x1b\x95\xe1\x2c\xb1\x87\x85\x6a\xab\x00\xda\xc3\x7f\x8f\x67\xab\xac\xcc\x8f\x99\x3d\x6b\xe0\xea\xfd\xf5\xe5\x3f\xe0\xfd\x35\xfa\x29\xfc\xf1\xcd\xfb\x57\x17\x6f\x2e\xae\xae\x5e\x5f\x7c\xb8\x38\x7e\x39\xfc\xec\xef\xda\xe4\x76\xeb\xa7\x93\x73\xf8\xef\xf1\x1b\xbd\x72\xca\xed\x8e\x87\x4a\xbc\x6e\x9b\xc6\xba\x30\x1e\xf5\x56\x65\xf0\xfe\x7a\xca\xcb\xfd\x63\x69\x6b\x3c\x1e\xce\x3d\x39\x87\xab\x4a\x99\x3f\xcf\x00\xbe\x33\x1b\xed\xac\xa9\xd1\x04\xd8\x28\xa7\xd5\xaa\x42\x0f\xca\x21\xe0\x6d\xa3\x4c\x8e\xb9\xac\x1c\x77\x50\xab\x1d\xac\x10\x5a\x8f\xf9\x0c\xe0\xdd\xfb\x0f\xdf\x9d\x25\xee\x26\xe7\x80\xf7\x12\x0a\xbb\x46\x67\xaa\xaa\x76\xf0\xa7\xbf\x5d\xfc\x70\x79\xf1\xf2\xcd\x77\x7f\x9a\xc2\xaa\x0d\x91\x2c\xc9\x71\x85\xa0\xb2\x8c\xf4\x91\xc3\x56\x87\x72\x72\x0e\x7f\x4c\x1f\x43\x89\x0e\x67\x00\x17\x95\xb7\x53\xf8\x2f\xc9\xb2\xe3\x2d\xd8\xb1\xec\x06\x12\x23\x15\xd0\x7a\x73\xed\x96\x43\xd9\x4f\x1e\xc5\xda\xdf\x61\xd8\x5a\x77\xf3\xb8\x06\xff\xd1\x23\x04\xf4\xc1\x60\xa0\xd5\xc5\x3f\x97\x8b\xee\x5d\x89\xe0\x70\x4d\x76\x4d\x96\x41\xef\xc1\x08\x63\xf4\xbd\xc3\x35\x3d\x92\xef\x2f\xaa\xca\x6e\x21\xb3\xc6\x60\x46\x1c\x93\x28\xc9\x31\x3c\x14\xce\xd6\xa0\xcc\x0e\x4a\xeb\x03\x6c\x4b\x34\xd0\x7a\xfa\x62\x9f\x74\x6d\x73\x9c\xc1\xcb\x1d\x09\x5a\xec\x7c\x9a\xe6\x00\x63\x73\xf4\xb0\xd5\x55\x05\xd6\x54\xbb\x34\x11\xcd\x62\x43\x89\x2e\x7e\x40\x53\x60\x4e\x5a\x43\x4d\x8f\x27\xe7\xec\x60\x15\x4f\x6d\x1d\x2c\x4e\xbe\x9e\xcd\x67\xf3\xd9\x62\x06\x1f\xc8\xfb\x2c\x47\x2c\x32\x81\xd6\x63\xd1\x56\x43\xf6\x6a\x72\xfe\x50\x2a\x03\xd6\x20\x10\x53\x36\xbb\x41\x47\x53\x07\xa5\x0d\x2d\x2d\x58\x70\xad\xd9\x5f\x88\x1f\x08\x47\x99\x1d\xcd\x2d\x32\x7a\x6d\xcd\x41\x00\x87\x1e\x43\x1f\x48\x24\x40\x90\x25\xad\x94\x47\xd0\x77\xc8\x75\x72\xe9\xa4\x42\xba\xda\x1b\xbe\x12\xd9\xac\x30\x92\x57\x01\x7c\x50\x2e\xb4\xcd\x80\x19\x63\xf9\xe5\x58\xc1\x5e\xd7\x6d\x25\xae\x3f\x54\xf0\xe4\x9c\xde\x74\xe6\xf0\x2a\xca\x7b\xa3\x15\x28\xb8\x7e\xff\xea\xff\x5f\x9f\x42\xe3\xec\xed\xae\xf3\xdd\xeb\x06\x33\x5d\xec\x48\x74\x4a\x5e\x09\x4f\xb9\xf6\xe4\xbc\x50\x69\x1f\xd0\x68\xb3\x9e\x9c\x43\x61\x1d\x68\x93\xd9\x9a\xbe\x4e\x46\x63\x8d\x87\xd6\x54\xe8\x7d\xfc\xb6\x0f\xaa\xec\xf8\x8d\xb3\x1b\x4d\x5e\x4a\x4c\x10\xeb\x07\xf2\xd9\xc1\xe4\x3c\x2a\x92\xd6\xca\x33\x2f\x3b\x45\x9f\xfd\x79\x7e\x3a\x4f\x8f\x5b\x8f\x6e\x99\x7e\x34\xca\xfb\x65\x8a\xfb\xc3\x15\x81\x5a\xd9\x0d\x92\x51\x28\xef\xdb\x5a\xc2\xc2\x0a\xe1\x83\x75\x70\x58\x86\xd0\xf8\xb3\xe3\xe3\xed\x76\x3b\x0b\xd6\x35\xce\xfe\x1b\xb3\x30\xb3\x6e\xfd\x84\x66\xbf\x2c\x98\x33\xa1\xa3\x3d\x18\x4b\x36\xea\xf8\x61\x61\xc9\x47\xd8\xb4\xfa\xd0\xc7\x7e\xe2\x70\x43\x71\x4e\xec\x2e\x58\x32\x5b\xcf\xd2\xd4\x99\x70\x06\x3f\xb7\xe8\x34\xb2\xc5\x55\xd6\xde\xb4\xcd\x40\x36\x87\x9c\x48\xb4\xc9\x1c\x2a\x96\x95\xb1\x66\x57\xeb\xb0\x13\x6b\x16\x7a\x62\xe2\x39\xac\x76\x69\x3a\x9a\x6b\x67\x5b\x07\x97\x57\xb0\x42\xfa\x55\xa1\xba\x89\xe2\x7d\xfd\xee\x9a\xd7\x63\xac\x35\xda\x9a\xde\x64\x94\x01\x55\x05\x74\x46\x05\xbd\x49\x0b\x0d\x76\xe8\x90\x33\x1e\x32\xcc\x88\x1f\x86\x22\x89\x42\x25\x23\x66\xb1\x2a\x16\xac\x61\x23\x7f\x67\xcd\x9d\xe1\x9d\x65\xb3\xe3\x65\x21\x86\x74\x16\x69\x4d\xc6\xcf\x94\xc9\x06\x1c\xbf\xb0\x6d\xe8\x0c\x50\x17\x60\xc8\x7b\x35\x25\x5f\x0e\x72\x71\x39\x43\xf3\x58\xa4\xc7\xc9\x3c\xf8\x47\x67\x1e\xdf\x19\x36\x5f\x62\xd2\x07\x87\xaa\x06\xed\x6d\xf4\x98\xd5\x0e\x9c\x32\xb9\xad\xf5\x2f\x24\x40\x99\x94\xc8\x40\xe6\x30\x27\x21\xab\xca\x93\x4b\xb6\x15\xcb\x5b\x53\xae\x24\x4a\xa4\xab\x20\xae\x62\x70\x0b\x99\x76\x59\xab\x03\xfb\x05\xaa\xac\x1c\xf8\x04\xe3\x09\xed\xa1\x66\x08\xa1\x83\xc4\xa5\x5c\x17\x85\xce\xda\x2a\x88\x18\x33\xeb\x1c\x56\x2a\xe0\xd0\x99\x38\xa6\x5b\xd7\x71\xdb\x2b\xf1\xa3\xd1\x1b\x74\x5e\x55\x70\x55\xb5\x6b\xce\xea\x57\x95\xda\xc1\xe1\xc7\x2b\x73\xf5\x84\x08\xaa\x36\xd8\x5a\x85\x98\x68\x6d\x43\x76\x54\x26\x1f\x06\x02\x08\x93\x73\x1e\x67\x57\x81\x01\x4e\x49\x19\x9e\xed\xa2\x22\x83\x8a\xda\x93\xe0\xef\x05\x52\x60\x0e\x39\x6e\x74\xc6\x18\x49\x62\xc6\x20\x08\x4f\xce\x45\xd1\x0c\x81\x8c\x05\x2c\x0a\xb2\x27\x5d\x00\xde\xee\x93\x8d\x01\x21\xfa\x08\xe6\xb4\xd2\xb6\x31\x8d\xac\x30\x06\xa2\xfb\x78\x42\x2f\x66\x4f\x16\x47\x86\xd1\xc5\x25\x60\x61\xbf\x37\xd8\x71\xdf\x48\x06\xd1\x86\xf0\x02\x65\x7c\x61\x91\x9c\x3a\x1a\x23\x3c\x75\xf9\x51\xa3\x5c\xd8\x81\xd7\x41\x1c\x34\x8a\xa4\x9b\x5a\x0f\x9c\x55\x80\x1c\xa9\x13\x95\xf1\xb4\xba\x9d\x6d\x79\x31\x2b\x2c\xb5\xc9\xe1\xdd\xc5\x87\xe9\x80\xbf\x6e\x3e\x72\x14\x32\x43\xd2\x4d\xbe\x41\x17\x34\x39\x23\xc7\x76\x95\x95\xfc\x2a\x71\x1d\x63\x28\x11\xf6\x51\x14\x3a\x30\xea\x21\x17\x41\x31\x67\x8e\x9f\x24\xb3\x83\x94\x04\x0f\x95\x21\xa7\x8c\x10\x74\x5f\x67\x1c\x0d\xd2\x92\x74\xb3\x5c\xcc\x4e\x66\x4f\x67\xcf\xc6\x0f\x4f\xe6\xf3\x93\xb3\xb3\xc5\xc9\xd3\x67\xa4\x87\xaf\xbe\xe8\x3f\x52\x6c\x5b\xd7\xca\xed\x08\x1a\x1f\xa8\x3c\x27\x78\x71\x00\x64\xc8\xad\x87\x83\x68\xf8\x07\xb3\xc9\xf9\xe4\x1c\xde\x13\x48\x20\xcf\xb7\xc5\x5e\xec\x0d\x5b\x1b\x57\xec\xa7\x03\x32\x64\xcb\x1d\x8d\x69\x8c\xd0\x7d\x1c\x66\x8c\xfa\xd2\x86\x12\x14\x03\x1d\x12\x2e\x55\x08\x51\xbe\x82\x74\x42\xa9\x02\xbf\xd9\x2a\x13\xa4\x80\x50\x1d\x54\xe1\x88\x47\xf1\xa9\xc3\xaa\xa4\x72\xb5\xd1\x94\x0a\x3d\xf8\x4a\xaf\xcb\x50\xed\xd8\xb3\xd1\xa1\x09\x34\x61\x9f\xf3\x07\xe6\x47\xb9\x60\x47\x11\x5a\x7c\xbf\xd0\xb1\x06\xf1\xe3\x38\xcc\x35\xc6\xc0\x16\x92\x62\x53\x62\xa1\x6c\x61\x4d\xaa\x6c\x18\x53\x58\x4f\x25\x86\xcf\x9c\x5e\x51\xaa\xc0\xca\x6e\xd9\x18\x29\xb0\xad\xd4\xaa\xda\xc1\x96\x21\x8c\x41\x49\x5c\xb5\xcd\x69\xf5\xca\xec\x42\x49\xb2\x65\x64\xcd\xf2\xef\x05\x9b\x5b\x94\x34\x98\xb2\xdc\x30\xdd\x77\xf0\x4d\xf8\xcf\xb5\xcf\xec\x06\x1d\xe6\x1c\x38\x22\xce\x91\x77\xc9\x4f\x3a\x71\xb2\x2b\x98\x1c\x54\xe5\x2d\x54\x18\x7c\xc4\xab\xb5\x0d\x69\xcc\x8d\x89\xaa\x52\x8e\x74\xa9\x36\x4a\x57\x6c\xfd\xa9\x06\xc9\x94\x21\xde\x68\x11\x43\x3e\xba\x77\xe3\xc4\xb6\xb3\x6d\x8c\xc6\x1d\xe2\x80\x9a\xd4\x16\x93\x39\x01\xc8\x81\x47\x93\x72\x25\x29\xac\x2a\xac\x3d\x2b\x2a\x86\x7c\x72\x6d\x8a\xf5\xde\xd6\x28\x3e\x4c\xaa\x38\x6c\xd0\x95\xaa\xf1\x90\xb7\xe2\xe8\x50\x68\x87\x5b\x55\x55\x4f\xa2\x54\x7b\x03\xb5\x12\x73\x85\xeb\x52\x99\x7c\x2a\xc6\xf1\xfe\xdd\x9b\x7f\x0e\x79\x66\x88\x97\x6c\x38\x2e\x4f\x1c\xdd\x44\xd9\x53\x34\xbe\x0c\x22\xc6\x88\xd5\x86\x41\xf1\x70\x60\x42\x78\x4b\x75\xa2\x26\x33\x25\x90\x29\x1f\x91\x60\xbb\xc8\xba\x0f\xcd\xa2\x98\x9e\xb0\xa6\x5e\xbf\xbb\x06\x8f\x48\x42\x60\xe3\x64\x57\xe9\x03\x1c\x13\x8a\xa1\x2d\xa7\x62\x9b\xb0\x46\xa7\x32\xae\xb2\xe3\x82\x7a\x8b\x18\xac\x94\x66\x10\xf3\xa4\xd2\xaf\xa1\x04\x35\x34\xb5\xae\x0c\x19\x28\x7a\x06\x70\x6d\xa7\xc2\x70\x12\x6d\x52\xac\xe4\x1f\xbd\xc1\x6a\x27\x3e\x4f\x4a\x8f\x6e\xbf\x5f\x82\xfc\x21\xb8\x96\x0a\x8f\x3f\x44\xb2\x5f\x3e\xf8\x51\x85\x95\x93\xfe\x9c\x67\xc1\x86\x4f\x79\x3c\xc9\x2c\x47\xaf\x1d\x47\x2b\x4a\x64\x2c\xb4\x06\x9d\xe4\xb0\xc9\x39\xfc\xd3\xb6\x1c\xdb\x52\xe0\x62\xb0\x31\xc8\xd7\x8c\xac\xc6\x40\xca\xba\x20\x3d\x8d\xae\xfb\x40\x8f\x58\x71\x93\x73\xce\x4b\x39\x81\xf2\x31\x62\xd0\x05\x44\xdc\x45\xba\xed\x0d\x30\x46\x08\x88\xe1\x61\xb9\xf8\xf3\xc9\x6c\xf1\xfc\xc5\x6c\x31\x5b\x0c\x9f\xce\x19\x9d\x9d\x9c\xbd\x78\xfa\xf4\xe9\xe0\x79\x81\x2f\xe6\x67\x67\xc3\x2f\x7f\x94\x47\x27\xff\x92\x4f\xef\x15\x53\x8a\xcc\xec\x1e\x29\x3c\x3f\x24\x39\xaa\x14\x92\xec\xe0\xff\x24\xba\xbe\xa4\xed\x85\xf7\x7b\x45\x77\xa7\xda\x0a\x83\x4a\xb6\x54\x3e\x1a\xb8\xd7\x39\x46\x23\xf6\x71\x79\x31\xae\xc7\xf2\xc6\xc4\xf0\x7a\x7f\x2a\x05\x1f\x13\xae\x8f\x50\xb4\x77\xa9\x3d\xc5\x75\x4f\xf7\x14\x97\x9e\xf7\x8a\x4b\x4f\xee\x2a\xee\xad\xba\xd5\x75\x5b\x83\x69\xeb\x15\x3a\x4a\xdc\xda\xac\x6c\x4b\x11\x9e\x70\x66\x1b\xe4\x47\xe7\x61\xb5\xba\xe5\xbf\x97\x8b\x93\xd3\x38\xfe\xb3\xc6\xb2\x4e\x2f\xaf\x86\x24\x1a\x74\xba\x59\x32\x95\xd7\x94\x82\xc4\x2c\xfc\xce\x64\x71\x88\xaf\xec\x96\xc2\x4f\x49\x39\x81\xc4\x1d\x4a\x87\xbe\xb4\x55\x4e\x05\xfb\x6a\x17\xd0\x1f\x7b\xcc\x98\xa6\x36\x34\x90\xc6\xc5\x52\xda\x37\x88\xf9\xf2\x74\x71\x32\x9f\xd3\x0c\xef\x3a\x1e\x3b\xbe\xf6\x52\x22\x55\x35\x04\x21\x19\xc0\x2b\xb7\xc6\x90\xbe\x94\x05\xbf\x88\x8c\x72\x5c\x5c\x29\x23\xe0\xb5\x80\x5a\x7b\x81\x14\x94\x75\x92\x98\x8c\x8d\x5f\x08\x38\x4e\x52\xe6\x90\x46\x49\x5e\x19\xf0\x99\x65\x00\x5a\x48\x65\xe1\x07\x5d\x1c\x12\x5f\x9a\xe1\x93\xe4\x57\xca\x74\xb2\x58\x2e\x64\x85\x7f\xb5\x5b\xa8\xac\xf4\x80\x88\xfe\xdd\x81\xf0\x37\x55\xe9\x1c\x82\xae\x11\x5a\xa3\x83\xe0\xf9\xff\xf1\x53\xa8\xa7\x50\xfe\x87\x08\xbf\xd5\x86\x19\x5d\xa4\x69\xf2\xd6\x49\x19\x73\xf2\xac\xdc\x7b\xb2\x58\x94\x4f\xe7\xf5\xe2\xd4\xa7\x00\xb0\x2d\x75\x40\x4e\x41\x39\xb9\x68\x52\x04\x2f\xe7\xf2\xca\xcf\x52\x3f\xa3\x4b\x89\x5b\xc6\x3e\x97\x57\x50\xab\x90\x95\x54\x5f\x10\x5a\x4b\x54\xfa\x2c\xc5\x20\x2a\x94\xa8\xdd\x40\x72\xa9\xf4\xe6\x3a\xa4\x1b\xd4\x17\x99\xa3\xa7\xe2\x06\x83\xaf\xa2\x23\xcd\x67\xf3\xe3\x93\x67\xa3\x57\x45\x3e\x9f\x9f\x9d\x1d\x2f\x9e\x0f\xf5\x3d\x48\xa2\x0c\x21\x52\x22\x1b\x62\x45\xae\xfb\x19\x30\x72\x13\xc8\x4f\xa9\x00\xe0\x35\xb4\x9e\x62\x11\xd1\x08\x36\x02\x49\x22\x32\x4e\xb3\xa3\xb4\x42\xe1\x4c\xec\x28\x37\x9e\x26\xbe\x5b\x64\x69\x13\xd0\x15\x2a\x8b\xfd\x09\xa9\x11\xbb\x62\x6a\xdc\xcb\x19\x65\xa3\x54\x04\xee\xa5\x16\x2a\x8f\x08\x59\x6a\xe9\x57\x10\x48\x4a\x90\xbd\x6b\xc4\x1f\xc4\x6e\xe5\x01\x23\x09\x4d\x83\x18\x48\x65\xb6\xae\x31\xf5\x72\xfb\x00\xba\x8b\xe1\x38\x22\x46\x82\xf0\xdc\x23\x20\x6e\xd2\xdc\xd2\x8e\xc8\xc8\x12\x28\x36\x3e\x0c\x9d\x83\x85\x3c\x82\xa8\xad\xf6\xbc\xa2\x8b\xaa\x1a\x8a\xc3\x9a\xf1\xca\x62\xab\x46\xa0\x6a\x7c\xf3\xe4\x6c\x72\x0e\x51\x4a\xcb\x44\xa2\xd9\x3c\xfb\x15\x3a\xc3\x11\x12\x71\xe7\xfd\xc0\xe7\x0f\x0d\x4c\x23\xcf\xce\x3e\xc9\x30\x33\x4a\x41\x79\xfc\x71\x8c\xe8\xf7\x70\xf7\xe9\x41\x91\xb7\xbd\xb1\xfb\x0c\x7e\x7a\xec\x8f\x67\x67\xff\x4a\x03\xb9\x9a\xe3\x59\x07\xdd\xdc\xfb\x06\xf6\xbd\x9d\xbd\xd1\xcf\x3f\x67\xf4\x8f\x67\x67\x8b\x87\xe6\x35\xd6\x1c\xf9\xa0\x4c\xae\x5c\xde\x91\x79\x7e\x3f\x13\xcf\x3f\x29\xe7\xcf\xa0\x32\x1a\x7c\x57\xe8\x9f\x41\x61\xa0\x81\xe7\xf7\x6b\xe0\x33\x08\x25\x75\x8c\x62\x51\x5f\x25\xdc\xd7\xd0\x4d\xdd\x2b\xe9\xdc\x6f\xd0\x39\x82\x25\xaa\xaa\xe2\xd8\x2e\x49\x25\xb9\x0d\xc9\x33\x7a\x5d\x55\xd6\xd6\x50\xe8\x2a\xa0\xd3\x66\x4d\x90\x1d\x11\x5e\x5e\x5e\xcd\x17\x8b\x85\x8c\xa5\xef\xf8\x33\xf9\xca\xc7\x1d\x89\x3c\xa7\xa0\xa3\x89\x0f\x55\x41\x56\x62\x76\xd3\x58\x6d\x82\x9f\xc1\x5f\xac\xab\x55\x38\x83\x83\x6f\x4a\xa4\x02\xee\xdb\xb3\x6f\x4a\xe5\xcb\x6f\x0f\x04\x5a\xf6\xdf\x2e\xf7\x3e\x18\x65\xde\x56\x57\xe1\x48\x9b\x31\xe9\xd8\xe5\xcf\xe3\xfe\xde\x20\x8a\x70\x35\xba\x8d\x48\xf4\x80\x52\xad\xa5\x05\xf1\x12\x06\x24\x7a\xee\x25\x96\x05\x9f\xca\x1e\x6e\x2c\xaa\x35\xc1\x5a\x06\xb4\xda\x0f\x0b\xa6\xb4\xe1\xc2\xc9\xb3\xe5\x3d\x93\x40\x3a\xa9\xda\x9c\xa2\x9a\x72\x2a\x23\xe1\xc0\xc1\xf1\xc1\x14\x0e\xce\xe8\x7f\x0e\x63\xdf\xe3\xc9\x01\x77\xd0\x54\x9c\x70\x39\x5c\x25\x3d\xd3\x21\x65\xca\x5e\x11\x70\xf8\xea\x2f\xb1\x45\x9c\x0d\xe4\xfe\x18\x9b\x61\x3f\x5c\xbd\x02\x8f\x6e\x43\xa8\x29\xa6\x81\x23\xce\x1a\x7d\x57\x27\x3d\xcf\xac\x09\xce\x56\xd2\x5e\x49\xfa\xe9\xc7\x4b\x7a\xcd\xca\xae\x1d\x2e\x89\x8e\x87\x90\x24\x24\x23\x6a\x53\xb0\x7d\x10\xa0\x96\xb2\x11\x5c\x2b\x18\x88\x93\x6a\xe3\x6c\x86\xde\x4b\x4d\xde\xe7\xb0\x01\x9b\xda\xa7\x52\x9a\x33\x58\xb7\x6d\x5b\x80\x6b\x32\x56\xe3\xc5\xbb\xd7\xf4\x77\xa3\xbc\x9f\x02\x77\xe8\x5d\x93\x55\xba\xd6\x61\xf8\x9a\x1f\xc8\x37\x04\x90\x46\x05\xc1\xec\x51\xf6\x04\xaf\x31\x6b\x9d\xb4\x07\x69\x3d\x17\x57\x97\x9c\x82\x87\xd5\x86\x18\xa2\x51\x35\xca\xf6\xb7\xf2\x7e\x6b\x5d\x1e\x4b\xa4\x8c\x77\x08\xbc\xed\x7a\x67\x94\x7a\x79\x1d\x98\xff\xea\x40\xde\xb8\xed\x86\x04\xa8\x50\x71\xb8\x25\xc0\x52\xb4\x55\xc5\x2d\x07\x5b\x8c\x3a\xeb\x47\x1d\x65\x02\x31\x79\xad\x0d\x1c\x41\xdc\x6e\x19\xa8\xa3\xaf\x55\x93\x56\x66\x22\x70\xee\xf8\x93\x4b\xe2\x06\xdd\x4f\x4c\xe0\xa7\xc4\xe3\x4f\x3b\xdb\xfe\x44\xa5\xa2\x7c\x2a\xfb\x01\x63\x35\xf5\x43\x23\x1b\xf7\x0d\xee\xf4\xb8\xfc\x15\xec\x54\xdc\x65\xfc\x61\x2c\xd5\xf7\xa7\xbf\x08\x98\x22\xad\x45\x38\xf5\x05\xc0\x14\xd5\x7b\x0c\xa7\x7e\x07\x98\x1a\x23\xda\xc0\x35\xf4\x9e\x4a\xa5\x0f\xd3\xc9\x68\x90\xa4\x49\x94\x97\x57\x9b\x67\x11\xf0\x6f\x9e\x3f\x8c\xcd\x24\xdb\xb1\xae\x7e\x2b\x12\x1b\x8c\xfa\x1d\x68\xac\x1f\xfc\x00\x20\x7b\x76\xe7\x7b\x7a\xf8\x30\x26\xbb\x33\x6e\x00\x0a\x9e\x3d\x0c\xcb\xee\x0c\x4f\x50\xe0\xd9\xc3\xc8\xec\xce\xd8\x11\x2e\x7a\xf6\x30\x38\xfb\xd4\xe4\x8b\x87\x66\xff\x24\x9c\xf9\xfa\x57\x59\xf9\xfa\xf3\x21\xda\x1d\x42\xa3\xf1\x9f\x89\xd2\xee\x10\x19\xe8\xe4\xeb\xdf\x08\xd4\xee\xd0\x4a\x0a\xfa\x9a\x82\xcd\x5f\x74\x85\xe9\xcc\x42\x8a\xdf\x19\x61\x86\x42\x67\x2a\x20\x25\x74\x94\x20\x45\x4f\xbb\xa3\x2d\xae\xc9\x66\xf4\xe0\x73\x48\xdc\xe0\x4e\x28\xdc\xe0\x6e\x44\x80\x5e\xec\xc5\xbb\xfa\x4e\x97\x27\xb3\x26\x6b\x9d\x23\x54\x43\xfe\x9d\x55\x9a\x31\x0f\xb7\xc7\xd3\x52\xf7\x76\x35\x5d\x93\xd5\xea\x36\x7e\xb9\x5c\xcc\x7f\xf3\x24\x5b\x5c\x79\x9b\xdd\x60\x48\xd3\xf5\x54\xbb\x57\x7e\xf9\xa9\xbe\xd2\x1e\x21\x87\x3f\xb7\xe8\x43\xec\x30\xc6\x7d\xfd\x88\x0f\x30\x1f\x7c\x5d\xed\x06\x8c\x77\x4f\x1d\xfe\xec\x97\x27\xcc\xff\x5b\xed\x5c\xdc\x11\x80\xff\x77\xfd\xfe\xdd\x11\x91\xff\xb9\xd5\xee\xc6\xd3\xbc\x2f\x75\xc8\xac\x36\xf0\xca\x3a\x84\xa3\xa3\x18\xed\xb9\x5b\xd5\x3a\xb5\xa6\xdc\xca\x21\x76\x72\x2e\x26\x43\xc1\x58\xad\x74\xa5\xc3\x0e\xb4\xf7\x2d\xfa\x6e\xd7\x66\x85\xb0\xb5\xee\x06\x73\x50\xce\xb6\x26\xe5\x42\x99\x6b\x7c\x38\xa4\x07\x58\xf1\x20\x12\x87\xe9\x88\x0c\xf7\x72\x15\x6e\xd0\x10\xc2\xe1\x5d\x98\x88\x72\x64\xa7\x21\x66\xcf\xf1\x9e\xad\xb4\x21\x53\x7d\x20\x1d\x76\x6e\x7c\x72\x63\x42\x67\x37\xbc\x17\x36\x9a\x89\x92\x53\x8a\xfe\xd2\x63\x8d\x4d\xa5\x60\x79\xdf\x67\x83\x23\x70\xc0\xd0\x8d\x6d\xd5\x9a\x42\xaf\xd9\xd2\x05\xb0\xba\x26\xfb\x0d\xeb\xfc\xf0\xe6\xfa\x13\xb9\x79\xb4\x87\xdd\xef\x07\x71\x4a\x92\x66\x53\x94\xc5\x18\x16\x4a\xc3\x8f\x8f\x71\xa4\x88\x35\x70\xf1\xc3\x84\x4e\x63\x6f\x36\xb5\x08\x84\xed\x50\x3d\x1a\xc4\x5e\xff\x3e\x8c\x3d\x39\x87\xaf\xf0\xb6\x41\xa7\xa9\x6e\x50\xd5\x57\x23\x42\x0f\x43\x6d\xb6\xd6\xdf\x05\xb6\x87\xf3\xf0\xd6\x55\xeb\xd1\x27\xdb\xa3\xe0\xc4\x93\x48\x4c\x4a\x9c\x4b\x17\x5e\x1b\xe4\xae\x6d\xaf\x1b\x0e\x2c\xd1\x1e\x1f\x05\x54\x73\x29\x6a\x7a\x45\x1f\x73\xe8\xee\x7b\x65\x7c\xec\x63\x20\x46\x59\xdd\x20\xe8\x4d\xce\xe1\x70\x84\x1c\x28\xee\x9f\x4e\xd3\x91\xbd\x33\x58\xd0\x6f\x36\x93\x75\x9f\x07\xe8\x19\x4f\x6f\x40\xb5\xa1\x24\xbf\x88\x87\x3c\x83\xbd\x89\xd3\x86\x24\x4b\x42\xfa\x72\xf0\x23\x7d\x88\xc3\xe0\x48\x64\xe9\x1d\x8f\x5c\x7e\x63\xe9\xef\x93\x23\xfe\xf5\xed\xe3\x98\xe4\xeb\x74\x24\xee\x3a\x9e\x81\xfc\xac\xa2\xaf\x3b\x48\xc7\x01\xb9\xb4\x55\xee\x87\xc7\xe5\xe4\x3c\xee\xe3\x68\xb9\x63\x78\xa5\xb2\x1b\x14\x2f\x6f\x3d\x76\x62\x7e\xc9\x0c\xbc\x4a\x0c\x48\x0b\x3c\x77\x7c\x14\xe7\x0c\x8a\xa2\xca\x57\x64\xa1\xab\xb0\x6b\x70\x29\x3f\x89\x2a\x56\x18\x10\x4a\xed\x83\x75\x3a\x53\x95\x2c\x64\x18\xde\x98\x22\x5c\xc0\xaa\x2d\x0a\xc9\x52\xf1\x93\xb8\xcd\xc4\x8d\x51\x3e\xb3\xc8\x86\x9f\x11\x8f\xb6\x20\x47\x43\xeb\xd6\x72\x68\xae\x35\x28\x21\x91\x44\xdc\xa7\xbb\x48\x88\x03\x2c\x9f\x6a\xe1\xd6\x72\x72\x50\x3e\x7c\xd5\x12\x59\x3e\xa3\x38\x39\x87\x57\xca\xc4\xd3\x2a\x8c\xf7\x79\xc3\xe4\xe4\xc5\x8b\x6e\x8e\x1c\x9b\x50\x2e\x9f\x3d\x95\x9c\xf7\x03\x52\x8d\x9e\xf3\x2a\x3e\x7e\xf8\xc7\xfb\x5e\x7b\xbc\xb8\x2e\x75\x82\x36\x39\xde\x52\x01\x23\xec\x10\x8e\xd6\x3e\x1e\x42\xe5\x77\x2c\x03\x1f\x54\xc0\xe5\x3c\xad\x22\xa1\x00\xaf\x7f\xe1\x73\x95\x6f\xf5\xcb\x74\x1c\xa4\x9b\x27\x53\x59\xc9\x8c\xe7\x2b\xfe\x93\xbe\x5d\x9e\xce\xe7\x77\x25\xe1\x31\xb3\x26\xf7\xb0\xc2\xb0\x45\x1c\x9c\xd8\x2c\xaa\xd6\x97\x72\xb2\x27\x5f\xf1\x0f\xf6\xf3\x8d\xaa\x96\x8b\x17\x44\xe9\x31\x9c\xe3\x7a\x67\xb2\xd2\x59\xa3\x7f\x89\xa7\xb6\x3f\xd7\x47\x4a\xbb\x65\x09\x74\xa7\x8b\x28\xa9\x76\xc4\x10\x74\xa0\x6f\x9b\x5d\x92\xd4\xa3\x7b\x0d\xad\x44\xea\xfb\x7d\xbb\xae\xa8\xfe\xef\x1b\x63\xa9\x0b\x16\x74\x03\x4e\xf1\x1e\x27\x9b\x17\x7f\xbf\x46\x83\x5e\xb3\x12\x0a\xe5\x03\xad\xe8\xb1\x52\xe5\x5b\xac\x1b\x6b\xab\x07\x45\xfe\x68\x77\x14\x46\x76\x2d\xfa\x39\x4c\xbb\x90\x4f\xa4\xeb\xd8\x9f\x1d\x93\xb3\x10\xf7\xb9\xe6\xd3\x93\x39\xff\x93\xc3\x5d\x94\x67\xf5\x06\x45\x0f\xe4\x08\xe9\xb5\x34\x86\xe4\xd0\x52\x1d\xf7\xe5\x82\x53\xc6\x2b\x49\x9d\x05\x62\xda\x3d\xb1\xc6\xeb\x9c\x4f\xf0\x28\xae\x56\x7e\x41\x67\xe9\xfd\x54\xb6\x46\x1d\x56\x6a\x17\x6e\x0b\x44\xaa\x78\xe6\xf3\x39\xc7\x9c\x1f\x54\xc0\x23\xee\x91\xc8\x9d\x87\x01\xed\xae\xf9\xb9\x51\x55\x8b\xb0\x38\x85\xaf\x60\x31\x9f\xcf\x65\xb9\xb1\x03\x52\x6b\xd3\x06\x76\x63\x26\x42\x34\x78\xa2\xe5\xe2\x54\xc2\x0c\x61\x5b\x8a\xa1\xeb\x12\x1a\xa7\xad\x23\x54\x4c\x61\x99\xbf\xe2\xfe\x35\x4d\x6b\x1d\x54\x76\x7b\x54\xec\x71\x10\x31\x23\x7d\x9a\x06\x2f\x23\x64\x8f\xa2\xd0\x35\x76\x71\x41\x85\x80\x75\x23\x4d\x5b\x4f\x59\xc0\xe0\x16\xb4\xd9\xa0\x49\xd7\x4a\xd4\xe8\x48\x58\x83\x8c\x25\x3f\x8c\xb7\x42\x45\x6d\x98\x9f\x81\xf1\x70\x68\x94\xb1\x31\xfe\x3c\x99\x42\xeb\xe1\xb0\xd6\x99\xeb\x1f\x91\x08\xf8\x61\x55\xe9\xfe\x3b\x0f\x87\xfd\x8f\x9a\x5e\x93\x94\xe8\x47\x09\x87\xa5\x6d\x9d\x67\xc0\x10\x1c\x81\x6d\xec\x82\xd6\xe9\xbc\xe6\x7d\xd4\x37\xac\x0f\xeb\x1a\xde\xf4\x1e\x68\x9b\xad\x3f\x58\x52\xc3\x1d\x39\xd5\xea\x56\x46\x84\xdb\xb4\x1b\xfc\x5a\x5a\x47\xb2\xa2\xb1\x6a\xd9\x75\x87\x27\xb6\x66\xe9\xde\x8c\x27\x1c\x2d\x09\xe9\x07\x12\xfc\xb8\xf2\x1d\x11\x71\xb8\x56\x2e\x67\x9b\xb6\x45\xd7\x5f\x31\x7b\x17\x28\x24\x57\x54\x6a\x67\xac\xf1\x21\x4f\xa4\xff\x8d\x59\xf8\x42\xb4\x89\xd4\x90\xf8\x03\x29\x88\xf3\x5d\x97\x7e\xda\x70\x6b\xf9\x47\xad\x6e\xd9\xf5\x9e\x9d\x3e\x52\xe6\x90\x4b\x5a\xaa\x82\x4b\xce\xa9\x8f\x13\xa6\x5e\x72\x5a\x27\x04\x9e\xce\x32\x80\x92\x20\x5f\x2a\x5f\x1e\x51\xde\x1c\x49\x5a\x12\x7c\x2c\x18\xe4\xa4\xb3\xe2\xd4\x34\xd2\x46\xbf\x4b\x9d\x8e\x99\xad\x31\x38\xb5\x1d\x12\xfa\xe1\xea\x15\x1b\xf5\x2d\x53\x14\x4d\xdc\xcf\x4d\x6c\xa4\x7e\x16\x43\x52\xee\x78\x54\x2e\x2b\xc7\x93\x7a\xae\x23\x3a\xee\xe2\xf9\x26\xf7\x00\x07\x69\x0e\x5b\x50\x6c\xd3\x39\x5c\xeb\xba\xa9\x10\xde\x60\xbe\x46\x07\x57\xce\x06\x9b\xd9\x0a\x0e\xaf\xdf\xf0\x99\xec\x1b\xde\x95\x1e\x39\xdc\xf0\x64\xb8\x1a\x60\x15\x06\xf4\x35\x86\xd2\xe6\xd2\x48\x91\x23\xc9\x72\xf7\x42\xb0\x7f\x8d\x41\xf1\xf5\xad\x11\xdb\xbe\x6a\x06\x5c\xbf\xb1\x6a\x8f\x69\x5f\x35\x71\xfc\xda\xa9\xa6\xf4\xa0\xcd\x51\x8d\xb5\x75\xbb\xc8\x8b\xe6\x53\x7b\xa3\x5a\xa6\x40\x15\x5a\x3e\x7f\xc9\x90\xdc\x49\x30\xf6\xdd\x5c\x3c\x43\xd4\x97\xdc\x30\x23\x8c\x99\x36\xca\xe5\xb8\x72\xce\x07\xdf\x07\x6a\xf8\x1e\xc3\x75\xd5\x7c\x4f\x4c\x5c\xb3\x46\x86\x6b\xbe\xb3\x26\x61\x96\xbf\x93\x95\x7d\x61\x8b\x3f\x87\x6b\xbd\x36\xbc\x4c\xf8\x1b\x3a\xe9\x8b\x91\x15\xbd\x22\x97\x7e\x14\x0f\x93\xe8\x2c\x17\x78\xd2\xd4\x1c\x40\x24\xc3\xd4\x8a\x0d\xeb\x94\x52\x2c\xa0\x09\x4e\x0b\x42\xf5\x7a\x3d\x0a\x33\xa7\x92\xde\x1f\x43\x24\xaf\xac\x36\xf0\x3d\x1a\x94\x43\x3a\x70\xf8\x96\x2d\xf0\xc9\x6f\xaa\xe7\xa8\xf2\xec\x49\xa4\x82\x04\x28\xc5\x56\x8a\x00\x40\xba\xd4\xd2\x9d\xb6\xaf\xa5\x47\xa9\xfa\x2b\x8d\x7c\x5a\xcb\xb6\xeb\x32\xf6\x90\x32\x55\x55\x7c\x24\x6e\x8b\x14\x02\xfc\x78\xb3\xf0\xd5\xd5\x47\xa2\x81\x0e\x0e\x75\x91\xcc\xef\xc9\xe3\x60\xdf\x78\xb5\x64\x7f\x6e\xd9\x15\x1e\xb4\x3b\xe2\x99\x91\xee\xe2\x23\x37\x99\xe2\x81\x63\xae\x2e\xd1\x73\xd3\xaa\x69\x5d\x63\x3d\xf6\x1b\x3b\xb1\x3f\x20\x1b\x8c\x72\x9f\x0b\xbc\x36\x99\x74\xbd\xba\x4b\x24\x44\x91\x9d\x9c\xde\x6b\x0f\x85\x72\x10\xac\x15\xc0\x44\x13\xf4\x8c\x75\x1b\x3b\x5b\xeb\x42\x29\x37\x15\xb6\x65\xec\xac\x45\x55\xe1\xb2\x50\x95\xc7\xc1\x26\x7c\x3c\x1d\x1c\x2c\x34\x6a\xc7\xe2\xcd\x07\xa5\xe5\xde\x0c\xbc\x37\x68\x83\xb4\xf1\xb8\xf8\x8b\x96\xb0\xaf\xfb\x34\x5d\xde\x77\x32\x30\xf0\x47\xe9\x1b\x4e\x07\x77\xee\x74\x74\xe7\x8f\x64\x42\x7a\xb3\x5c\xd0\x4a\x56\xd2\x64\x8d\x9f\x3e\xf8\xc1\xc9\x83\x5f\x3c\xbd\xd3\x99\x8e\x90\x51\x96\x92\x60\x81\x60\xd9\x60\xe5\x5a\xd0\xfe\xde\x17\x69\x7b\x3f\x15\x4a\x62\xe2\xad\x34\x34\x6c\xdb\x05\xa2\xe7\x5d\x50\xd1\x5a\x7c\xda\xa1\xdd\x74\xe2\x34\x1e\x08\xc8\xb9\xf3\x36\x90\xe0\x9e\x6c\x67\x30\xbe\xcf\xf7\x09\xbe\x99\x22\x15\xdd\xa8\x88\x5a\xc4\xbd\x72\x23\xa1\xaa\xee\x27\x0d\x6d\x13\x2f\x70\x0d\x17\xd4\x9a\xa0\xab\xb8\xf1\xa8\x02\x21\x79\xde\xfe\x1d\x1f\x5f\x1f\xf4\x25\x48\x62\x1d\x5a\xac\xb5\xe1\x68\x76\xef\x46\xc0\x43\xe2\x66\x17\x93\x0a\x23\x09\x2a\xee\xe8\xca\x1d\x8b\xd8\x45\xf6\x68\x7c\xeb\xe5\x15\xe8\x22\xb2\x5b\x29\xb7\xee\x0f\x87\xaa\x20\x84\x7a\xe6\x62\xa8\xfd\xfa\xb4\x2b\xa5\x06\x1c\x8e\x79\x8a\xd8\x90\x34\x78\x94\x54\x77\x9c\x6a\x12\xe5\x50\x49\xff\xa5\xbf\x3d\x96\x26\xa1\x35\xdc\xb5\x0f\xae\xc6\x3c\xef\x9a\x33\x93\xa0\x6a\xdb\x9a\xe0\xa7\x20\x27\x57\x9b\x96\xfe\x26\x7f\xf3\xb5\xe0\x2d\x62\xc7\x77\xa7\x1c\x99\x11\xf4\xa1\x33\xa3\xe8\x4b\x2c\x8a\x9f\x5b\xa4\x40\xc2\x2c\xa7\x43\x6d\x2a\x50\xd4\x89\x0c\xcb\x95\xbc\xbb\x05\x9d\x5a\xe3\x54\xae\x58\x38\xa5\xe5\xca\x6b\x67\xa6\x54\xd6\xe3\x6a\x47\xb9\x3e\xee\x34\xd5\x7c\xe1\x8d\x4b\xbb\x1b\xac\x76\xb1\xce\x4c\x66\x2c\xc1\x81\xaf\xf7\x65\x29\x45\xc8\x95\xba\x4e\x2c\xbd\x6a\xb5\x1f\x68\x75\xb5\x8b\xfd\x0d\xd5\xa9\x28\xf5\xf0\x19\x83\x8c\xcd\x80\x96\x65\x10\x73\x39\x39\xc0\xb4\x13\xcf\xc3\x3c\x7a\x3e\x44\x41\x36\x21\x6d\x99\x9d\xf2\x72\xd3\xc4\xbe\xa0\x18\x94\x36\xf1\xce\x6f\xd3\xc6\x9b\xd1\x29\xd9\xb1\xd3\xf1\x34\x7c\x31\x5b\x5c\x67\x06\x97\x21\x85\x05\xb6\x5f\xb9\x85\xcf\x95\x26\x81\x80\x4a\x34\xd0\xb7\x6d\xb6\xca\xc7\x60\xcb\x0e\x47\x5f\xcf\xe0\xb2\x88\x17\x19\x72\x29\xcc\xe4\x34\x3c\xb1\x5d\xb4\x26\x13\x96\x49\x15\xbb\x78\x98\xc3\x53\x4e\xe8\x6e\x58\x90\x8f\xef\xc0\x07\x17\x8f\x2e\x65\xab\xa2\x52\x6b\xbf\x14\x56\x1e\xa7\x11\x8c\xab\x76\xfd\x38\x1d\x5b\xa2\x0c\x95\x5d\xaf\xe5\xfa\xeb\x06\xab\xbe\x33\xcb\x3f\xe3\xc1\xe4\xe0\x54\x86\x53\xc8\xe9\xfb\x29\x6f\x59\x4c\x61\xab\x9c\x99\x02\x3a\x67\xdd\x14\x32\xa7\xf9\xfc\xfe\x7f\x06\x77\x2c\x78\x5b\x22\x9d\x98\xf8\xc6\xb7\x2b\xbf\xf3\x01\xeb\x6f\x97\xdf\x30\xe9\x6f\xa7\xfd\xb3\x93\xfe\xe1\x6c\x36\x93\xd6\x01\x07\x41\x1b\xd9\x8a\x07\xec\x72\xbd\xd1\x79\xab\x2a\xe8\x46\x52\xa4\xfe\xe8\x51\xf6\x4a\x8e\x8e\x98\x43\x1e\xb1\xf4\xdc\xea\x93\x3d\x86\xf1\xe5\xa7\x7e\x2c\xef\x88\x74\x23\x68\x5d\xa9\x72\xe5\x1d\x8a\xb4\x6f\x33\xd8\xa6\xf8\xeb\x87\x0f\x57\xd0\x38\x5b\xe8\x0a\xbb\xdd\xcf\x78\x3f\x24\x3d\xbe\xf7\xd4\x8d\x6c\x89\x8d\xee\xdd\x8f\x8f\x34\x8d\xe9\x0c\xb7\x86\xc8\x12\xe5\x8a\x50\xfa\xef\x3a\xa8\x00\x65\x08\xcd\xd9\xf1\x71\xb7\x95\x76\xf6\x4d\x1c\x4a\xdc\x7f\x7b\xcc\x4b\x3b\x6e\xe8\x19\x58\x8a\x55\xb1\x6f\x1d\xaf\x89\xd3\x87\xcb\xe7\xf3\xe7\x5c\x11\xfc\xdd\xe9\x80\x8c\x42\xd2\xec\x77\x2e\x4f\xa5\xfd\xc3\xac\x69\xd3\xe8\xe3\x50\x37\x6c\xf9\x33\x7a\x32\xf9\xdf\x00\x00\x00\xff\xff\x44\x24\x08\x2d\x0e\x45\x00\x00") func sampleBchdConfBytes() ([]byte, error) { return bindataRead( @@ -92,7 +92,7 @@ func sampleBchdConf() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "sample-bchd.conf", size: 17460, mode: os.FileMode(436), modTime: time.Unix(1617457938, 0)} + info := bindataFileInfo{name: "sample-bchd.conf", size: 17678, mode: os.FileMode(436), modTime: time.Unix(1620840435, 0)} a := &asset{bytes: bytes, info: info} return a, nil } diff --git a/blockchain/indexers/slpcache.go b/blockchain/indexers/slpcache.go index 1462f8395..629d26e13 100644 --- a/blockchain/indexers/slpcache.go +++ b/blockchain/indexers/slpcache.go @@ -101,3 +101,34 @@ func (s *SlpCache) RemoveMempoolSlpTxItems(txs []*bchutil.Tx) { delete(s.mempoolSlpTxEntries, hash) } } + +// GetMempoolItem gets items from only mempool entries +func (s *SlpCache) GetMempoolItem(hash *chainhash.Hash) *SlpTxEntry { + s.RLock() + defer s.RUnlock() + + return s.mempoolSlpTxEntries[*hash] +} + +// MempoolSize returns the size of the slp mempool cache +func (s *SlpCache) MempoolSize() int { + s.RLock() + defer s.RUnlock() + + return len(s.mempoolSlpTxEntries) +} + +// ForEachMempoolItem provides thread-safe access to all mempool entries +func (s *SlpCache) ForEachMempoolItem(fnc func(hash *chainhash.Hash, entry *SlpTxEntry) error) error { + s.RLock() + defer s.RUnlock() + + for k, v := range s.mempoolSlpTxEntries { + err := fnc(&k, v) + if err != nil { + return err + } + } + + return nil +} diff --git a/blockchain/indexers/slpindex.go b/blockchain/indexers/slpindex.go index 0d83f48af..54058276a 100644 --- a/blockchain/indexers/slpindex.go +++ b/blockchain/indexers/slpindex.go @@ -5,12 +5,17 @@ package indexers import ( + "bytes" "encoding/hex" "errors" "fmt" "math/big" + "runtime" + "sync" + "sync/atomic" "github.com/gcash/bchd/blockchain" + "github.com/gcash/bchd/blockchain/slpgraphsearch" "github.com/gcash/bchd/chaincfg/chainhash" "github.com/gcash/bchd/database" "github.com/gcash/bchd/wire" @@ -61,32 +66,41 @@ var ( // unique uint32 ID back to the TokenID hash. // // +// DB Bucket Variable: "tokenIDByHashIndexBucketName" // The serialized format for keys and values in the TokenID hash to ID bucket is: // = // // Field Type Size +// ----- ----- ----- // TokenID hash chainhash.Hash 32 bytes // ID uint32 4 bytes -// ----- -// Total: 36 bytes // +// Total Item Size: 36 bytes +// +// +// DB Bucket Variable: "tokenMetadataByIDIndexBucketName" // The serialized format for keys and values in the ID to TokenID hash bucket is: // = // +// // Field Type Size +// ----- ----- ----- // ID uint32 4 bytes // TokenID hash chainhash.Hash 32 bytes // slp version uint16 2 bytes // Mint baton hash (or nft group id) chainhash.Hash 32 bytes (optional) // Mint baton vout uint32 4 bytes (optional) -// ----- -// Max: 74 bytes max // -// The serialized format for the keys and values in the slp index bucket is: +// Max Item Size: 74 bytes +// Min Item Size: 36 bytes +// // +// DB Bucket Variable: "slpIndexKey" +// The serialized format for the keys and values in the slp index bucket is: // = // // Field Type Size +// ----- ----- ----- // txhash chainhash.Hash 32 bytes // token ID uint32 4 bytes // slp version uint16 2 bytes @@ -388,10 +402,11 @@ func dbRemoveSlpIndexEntries(dbTx database.Tx, block *bchutil.Block) error { // SlpIndex implements a transaction by hash index. That is to say, it supports // querying all transactions by their hash. type SlpIndex struct { - db database.DB - curTokenID uint32 - config *SlpConfig - cache *SlpCache + db database.DB + curTokenID uint32 + config *SlpConfig + cache *SlpCache + graphSearchDb *slpgraphsearch.Db } // Ensure the SlpIndex type implements the Indexer interface. @@ -439,6 +454,11 @@ func (idx *SlpIndex) Init() error { return nil } +// GraphSearchEnabled indicates if slp graph search is enabled +func (idx *SlpIndex) GraphSearchEnabled() bool { + return idx.config.SlpGraphSearchEnabled +} + // StartBlock is used to indicate the proper start block for the index manager. // // This is part of the Indexer interface. @@ -576,6 +596,12 @@ func (idx *SlpIndex) ConnectBlock(dbTx database.Tx, block *bchutil.Block, stxos if txnInputsBurned != nil { burnedInputs = append(burnedInputs, txnInputsBurned...) } + + // Add Graph search entries here once the gs db is available + if idx.GraphSearchEnabled() && isValid { + go idx.AddGraphSearchTxn(tx) + } + } // Remove block transactions from the slp mempool cache @@ -596,6 +622,146 @@ func (idx *SlpIndex) ConnectBlock(dbTx database.Tx, block *bchutil.Block, stxos return nil } +// AddGraphSearchTxn +func (idx *SlpIndex) AddGraphSearchTxn(tx *wire.MsgTx) { + if idx.graphSearchDb == nil { + return + } + + if !idx.graphSearchDb.IsReady() { + idx.graphSearchDb.SetReady() + } + + err := idx.graphSearchDb.AddTxn(tx) + if err != nil { + log.Criticalf("Failed to add transcation %v to graph search db due to error: %v", tx.TxHash(), err) + } +} + +// LoadSlpGraphSearchDb is used to load data needed for slp graph search +// +// NOTE: this is launched as a goroutine and does not return errors! +// +func (idx *SlpIndex) LoadSlpGraphSearchDb(fetchTxn func(txnHash *chainhash.Hash) ([]byte, error), initWg *sync.WaitGroup, interupt *int32) { + + // this method shouldn't be called more than once or if gs is disabled + if idx.graphSearchDb != nil || !idx.config.SlpGraphSearchEnabled { + return + } + + idx.graphSearchDb = slpgraphsearch.NewDb() + + // now that graphSearchDB is set we can call Done() + if initWg != nil { + initWg.Done() + } + + // build an initial map containing all slp transactions mapped to their token ID hash + txnTokenIDMap, err := idx.buildGraphSearchTokenMap() + if err != nil { + log.Debugf("slp graph search failed to load with error: %v", err) + return + } + + // loop through the map and load full transactions into s.slpGraphSearchDb + // + // Future TODO: this can be optimized by storing slp txn block region in an index + // + // Future TODO: to reduce memory footprint either lazy loading and/or a whitelist + // of token IDs for graph search can be added. + log.Debugf("fetching %s transactions for slp graph search db...", fmt.Sprint(len(*txnTokenIDMap))) + getTxn := func(txnHash chainhash.Hash, tokenIDHash *chainhash.Hash, wg *sync.WaitGroup) error { + if wg != nil { + defer wg.Done() + } + + var msgTx wire.MsgTx + + txBytes, err := fetchTxn(&txnHash) + if err != nil { + log.Debugf("slp graph search transaction %v was not found") + } else { + err = msgTx.Deserialize(bytes.NewReader(txBytes)) + if err != nil { + return fmt.Errorf("loadSlpGraphSearchDb failed to deserialize transaction: %v", err) + } + } + + return idx.graphSearchDb.AddTxn(&msgTx) + } + + // Limit the number of goroutines to do script validation based on the + // number of processor cores. This helps ensure the system stays + // reasonably responsive under heavy load. + maxGoroutines := runtime.NumCPU() * 3 + guard := make(chan struct{}, maxGoroutines) + var wg sync.WaitGroup + + txnCount := 0 + for txnHash, tokenIDHash := range *txnTokenIDMap { + if interupt != nil && atomic.LoadInt32(interupt) == 1 { + log.Warn("slp graph search loading interupted signal received") + break + } + + if txnCount > 0 && txnCount%10000 == 0 { + log.Infof("slp graph search %s transactions loaded...", fmt.Sprint(txnCount)) + } + txnCount++ + + if len(*txnTokenIDMap) > maxGoroutines && maxGoroutines > 0 { + if txnCount == 1 { + log.Debug("loading slp graph search transactions concurrently") + } + guard <- struct{}{} + wg.Add(1) + go func(txnHash chainhash.Hash, tokenIDHash *chainhash.Hash, wg *sync.WaitGroup) { + err := getTxn(txnHash, tokenIDHash, wg) + if err != nil { + log.Warn(err.Error()) + } + <-guard + }(txnHash, tokenIDHash, &wg) + } else { + err := getTxn(txnHash, tokenIDHash, nil) + if err != nil { + log.Warn(err.Error()) + } + } + } + + wg.Wait() + + // try to set db state to loaded + err = idx.graphSearchDb.SetLoaded() + if err != nil { + log.Debug("couldn't set state to loaded: %v", err) + } else { + log.Infof("slp graph search finished fetching %s transactions", fmt.Sprint(txnCount)) + } +} + +// GetGraphSearchDb checks if graph search is enabled and returns the db +func (idx *SlpIndex) GetGraphSearchDb() (*slpgraphsearch.Db, error) { + if !idx.config.SlpGraphSearchEnabled { + return nil, errors.New("slp graph search is not enabled") + } + + if idx.graphSearchDb == nil { + return nil, errors.New("an internal error has occurred, slp graph search db has not been created yet") + } + + if !idx.graphSearchDb.IsLoaded() { + return idx.graphSearchDb, fmt.Errorf("graph search db is loading") + } + + if !idx.graphSearchDb.IsReady() { + return idx.graphSearchDb, fmt.Errorf("graph search db is waiting on the next block") + } + + return idx.graphSearchDb, nil +} + func (idx *SlpIndex) checkBurnedInputForMintBaton(dbTx database.Tx, burn *BurnedInput) (bool, error) { // we can skip nft children since they don't have mint batons @@ -964,22 +1130,74 @@ func (idx *SlpIndex) AddPotentialSlpEntries(dbTx database.Tx, msgTx *wire.MsgTx) } valid, _, err := CheckSlpTx(msgTx, getSlpIndexEntry, putTxIndexEntry) + if err != nil { + return valid, err + } - return valid, err + return valid, nil } // removeMempoolSlpTxs removes a list of transactions from the temporary cache that holds // both mempool and recently queried SlpIndexEntries func (idx *SlpIndex) removeMempoolSlpTxs(txs []*bchutil.Tx) { + // skip removal if slp graph search enabled but is still loading, this way gs db won't miss any txns + if idx.config.SlpGraphSearchEnabled && (idx.graphSearchDb == nil || !idx.graphSearchDb.IsLoaded()) { + return + } idx.cache.RemoveMempoolSlpTxItems(txs) } +// buildGraphSearchTokenMap is used to load transactions and associated tokenID +func (idx *SlpIndex) buildGraphSearchTokenMap() (*map[chainhash.Hash]*chainhash.Hash, error) { + + db := make(map[chainhash.Hash]*chainhash.Hash) + + err := idx.db.View(func(dbTx database.Tx) error { + idxBucket := dbTx.Metadata().Bucket(slpIndexKey) + + // loop through all of the valid slp txn items stored in the db + err := idxBucket.ForEach(func(k []byte, v []byte) error { + ch, err := chainhash.NewHash(k) + if err != nil { + return err + } + tm, err := dbFetchTokenMetadataBySerializedID(dbTx, v[0:4]) + if err != nil { + return err + } + db[*ch] = tm.TokenID + return nil + }) + if err != nil { + return err + } + + return nil + }) + if err != nil { + return nil, err + } + + // loop through all of the valid slp txn items in the mempool slp cache + err = idx.cache.ForEachMempoolItem(func(h *chainhash.Hash, e *SlpTxEntry) error { + db[*h] = &e.TokenIDHash + return nil + }) + if err != nil { + return nil, err + } + + log.Infof("SLP graph search is loading %s transactions...", fmt.Sprint(len(db))) + return &db, nil +} + // SlpConfig provides the proper starting height and hash type SlpConfig struct { - StartHash *chainhash.Hash - StartHeight int32 - AddrPrefix string - MaxCacheSize int + StartHash *chainhash.Hash + StartHeight int32 + AddrPrefix string + MaxCacheSize int + SlpGraphSearchEnabled bool } // NewSlpIndex returns a new instance of an indexer that is used to create a @@ -990,11 +1208,13 @@ type SlpConfig struct { // turn is used by the blockchain package. This allows the index to be // seamlessly maintained along with the chain. func NewSlpIndex(db database.DB, cfg *SlpConfig) *SlpIndex { - return &SlpIndex{ + idx := &SlpIndex{ db: db, config: cfg, cache: InitSlpCache(cfg.MaxCacheSize), } + + return idx } // dropTokenIndexes drops the internal token id index. diff --git a/blockchain/slpgraphsearch/db.go b/blockchain/slpgraphsearch/db.go new file mode 100644 index 000000000..d92054f3b --- /dev/null +++ b/blockchain/slpgraphsearch/db.go @@ -0,0 +1,234 @@ +package slpgraphsearch + +import ( + "bytes" + "fmt" + "sync" + + "github.com/gcash/bchd/chaincfg/chainhash" + "github.com/gcash/bchd/wire" + "github.com/simpleledgerinc/goslp" + "github.com/simpleledgerinc/goslp/v1parser" +) + +// Db manages slp token graphs for graph search and TODO: recently queried items +type Db struct { + sync.RWMutex + graphs map[chainhash.Hash]*tokenGraph + state uint32 // 0 = initial load incomplete, 1 = initial load complete, 2 = block found after load completed +} + +// NewDb creates a new instance of SlpCache +func NewDb() *Db { + return &Db{ + graphs: make(map[chainhash.Hash]*tokenGraph), + state: 0, + } +} + +// IsLoaded indicates the db is initially loaded and can be used internally +func (gs *Db) IsLoaded() bool { + gs.RLock() + defer gs.RUnlock() + + return gs.state > 0 +} + +// IsReady indicates the db is loaded and ready for client queries +func (gs *Db) IsReady() bool { + gs.RLock() + defer gs.RUnlock() + + return gs.state > 1 +} + +// SetLoaded allows external callers to determine when all of the graph search db has been loaded +func (gs *Db) SetLoaded() error { + gs.RLock() + state := gs.state + gs.RUnlock() + + if state == 1 { + return nil + } + + if state == 0 { + gs.Lock() + defer gs.Unlock() + + gs.state++ + return nil + } + return fmt.Errorf("slp gs db was not set to loaded with current state is %s", fmt.Sprint(gs.state)) +} + +// SetReady allows external callers to determine when the graph search db is ready for use +func (gs *Db) SetReady() error { + gs.RLock() + state := gs.state + gs.RUnlock() + + if state == 2 { + return nil + } + + if state == 1 { + gs.Lock() + defer gs.Unlock() + + gs.state++ + return nil + } + return fmt.Errorf("slp gs db was not set to ready with current state is %s", fmt.Sprint(gs.state)) +} + +// AddTxn adds a transaction to the graph search database +func (gs *Db) AddTxn(msgTx *wire.MsgTx) error { + tokenIDBuf, err := goslp.GetSlpTokenID(msgTx) + if err != nil { + return err + } + tokenID, err := chainhash.NewHash(tokenIDBuf) + if err != nil { + return err + } + + tg := gs.getTokenGraph(tokenID) + err = tg.addTxn(msgTx) + if err != nil { + return err + } + + return nil + +} + +// Find performs a graph search for a given transaction hash +func (gs *Db) Find(hash *chainhash.Hash, tokenID *chainhash.Hash, validityCache *map[chainhash.Hash]struct{}) ([][]byte, error) { + + // get token graph + tokenGraph := gs.getTokenGraph(tokenID) + if tokenGraph == nil { + return nil, fmt.Errorf("graph search graph is missing for token ID %v", tokenID) + } + + seen := make(map[chainhash.Hash]struct{}) + txdata := make([][]byte, tokenGraph.size()) + i := 0 + + // check client validity cache transactions are valid + for hash := range *validityCache { + if txn := (*tokenGraph).getTxn(&hash); txn == nil { + return nil, fmt.Errorf("client provided validity cache with hash %v that is not in the token graph", hash) + } + } + + txMsg := tokenGraph.getTxn(hash) + if txMsg == nil { + return nil, fmt.Errorf("txn %v not in token graph, implies invalid slp", hash) + } + + // perform the recursive graph search + err := gs.findInternal(txMsg, tokenGraph, &seen, validityCache, &txdata, &i) + if err != nil { + return nil, err + } + + // TODO: Do an integrity check before returning results to client! + + return txdata[0:i], nil +} + +func (gs *Db) findInternal(txMsg *wire.MsgTx, graph *tokenGraph, seen *map[chainhash.Hash]struct{}, validityCache *map[chainhash.Hash]struct{}, txdata *[][]byte, counter *int) error { + + hash := txMsg.TxHash() + + // check seen list + if _, ok := (*seen)[hash]; ok { + return fmt.Errorf("txn %v already seen in graph search", hash) + } + (*seen)[hash] = struct{}{} + + // add txn buffer to results + txBuf := bytes.NewBuffer(make([]byte, 0, txMsg.SerializeSize())) + if err := txMsg.Serialize(txBuf); err != nil { + return err + } + (*txdata)[*counter] = txBuf.Bytes() + (*counter)++ + + // check exclude txids here, don't return with error + if _, ok := (*validityCache)[hash]; ok { + //gs.logger.Debugf("skipping valid slp txn provided by client exclude list for %v", hash) + return nil + } + + // loop through inputs and recurse + for _, txn := range txMsg.TxIn { + prevTxHash := &txn.PreviousOutPoint.Hash + prevTxVout := txn.PreviousOutPoint.Index + + inpTxMsg := graph.getTxn(prevTxHash) + if inpTxMsg == nil { + continue + } + + // try to parse slp msg to check if this input contributes to this transaction + inpSlpMsg, err := v1parser.ParseSLP(inpTxMsg.TxOut[0].PkScript) + if err != nil { + continue + } + + // check to see if this parent contributed + switch msg := inpSlpMsg.(type) { + case *v1parser.SlpGenesis: + if prevTxVout != 1 && prevTxVout != uint32(msg.MintBatonVout) { + continue + } + if prevTxVout == 1 && msg.Qty == 0 { + continue + } + case *v1parser.SlpMint: + if prevTxVout != 1 && prevTxVout != uint32(msg.MintBatonVout) { + continue + } + if prevTxVout == 1 && msg.Qty == 0 { + continue + } + case *v1parser.SlpSend: + if int(prevTxVout) > len(msg.Amounts) { + continue + } + default: + return fmt.Errorf("txn %v was parsed as an unknown kind of slp transaction", prevTxHash) + } + + err = gs.findInternal(inpTxMsg, graph, seen, validityCache, txdata, counter) + if err != nil { + continue + } + } + return nil +} + +// getTokenGraph gets a token graph item from the db +func (gs *Db) getTokenGraph(tokenID *chainhash.Hash) *tokenGraph { + + gs.RLock() + if tg, ok := gs.graphs[*tokenID]; ok { + gs.RUnlock() + return tg + } + gs.RUnlock() + + gs.Lock() + defer gs.Unlock() + + if tg, ok := gs.graphs[*tokenID]; ok { + return tg + } + + item := newTokenGraph(tokenID) + gs.graphs[*tokenID] = item + return item +} diff --git a/blockchain/slpgraphsearch/db_test.go b/blockchain/slpgraphsearch/db_test.go new file mode 100644 index 000000000..63e3bfa53 --- /dev/null +++ b/blockchain/slpgraphsearch/db_test.go @@ -0,0 +1,142 @@ +package slpgraphsearch + +import ( + "bytes" + "encoding/hex" + "encoding/json" + "io/ioutil" + "os" + "testing" + + "github.com/gcash/bchd/chaincfg/chainhash" + "github.com/gcash/bchd/wire" + "github.com/simpleledgerinc/goslp" +) + +func TestSlpGraphSearch(t *testing.T) { + inputTestsFile, err := os.Open("db_test.json") + if err != nil { + t.Fatal(err.Error()) + } + data, err := ioutil.ReadAll(inputTestsFile) + defer inputTestsFile.Close() + + type TestCase struct { + Description string + TokenGraph []string + SearchTxid string + ClientValidityCache []string + ExpectedResultTxids []string + } + var tests []TestCase + err = json.Unmarshal(data, &tests) + if err != nil { + t.Fatal(err.Error()) + } + + // slpindex_test_graphsearch.json contains txids, they need to be reversed for BCHD + reverseTxidFromString := func(txidHex string) (*chainhash.Hash, error) { + txid, err := chainhash.NewHashFromStr(txidHex) + if err != nil { + return nil, err + } + return txid, nil + } + + for _, test := range tests { + hash, err := reverseTxidFromString(test.SearchTxid) + if err != nil { + t.Fatal(err.Error()) + } + + txns := make(map[chainhash.Hash]*wire.MsgTx) + for _, txnHex := range test.TokenGraph { // TODO: rename this to txn DB + txnBuf, err := hex.DecodeString(txnHex) + if err != nil { + t.Fatal(err.Error()) + } + + r := bytes.NewReader(txnBuf) + msgTx := &wire.MsgTx{} + msgTx.Deserialize(r) + txns[msgTx.TxHash()] = msgTx + } + + tokenIDBuf, err := goslp.GetSlpTokenID(txns[*hash]) + if err != nil { + t.Fatal(err.Error()) + } + tokenID, err := chainhash.NewHashFromStr(hex.EncodeToString(tokenIDBuf)) + println(hex.EncodeToString(tokenID[:])) + if err != nil { + t.Fatal(err.Error()) + } + tokenGraph := newTokenGraph(tokenID) + if tx, ok := txns[*tokenID]; ok { + err = tokenGraph.addTxn(tx) + if err != nil { + t.Fatal(err.Error()) + } + } else { + t.Fatalf("missing genesis transaction %s", hex.EncodeToString(tokenID[:])) + } + tokenGraph.addTxn(txns[*tokenID]) + for _, txn := range txns { + err = tokenGraph.addTxn(txn) + if err != nil { + t.Fatal(err.Error()) + } + } + if tokenGraph.size() != len(test.TokenGraph) { + t.Fatal("token graph size does not match test inputs") + } + + // load client's validity cache set (GS expects hashes, not txids) + validityCacheSet := make(map[chainhash.Hash]struct{}) + for _, exTxid := range test.ClientValidityCache { + hash, err := reverseTxidFromString(exTxid) + if err != nil { + t.Fatal(err.Error()) + } + validityCacheSet[*hash] = struct{}{} + } + if len(validityCacheSet) != len(test.ClientValidityCache) { + t.Fatal("exclude set size does not match test excludes") + } + + // perform the graph search + gsDb := NewDb() + gsDb.graphs[*tokenID] = tokenGraph + gsRes, err := gsDb.Find(hash, tokenID, &validityCacheSet) + if err != nil { + t.Fatal(err.Error()) + } + + // check the graph search length matches the expected results length + if len(test.ExpectedResultTxids) != len(gsRes) { + t.Fatal("expected result has different size") + } + + // create set of expected results + expectedResults := make(map[chainhash.Hash]struct{}) + for _, resTxid := range test.ExpectedResultTxids { + hash, err := reverseTxidFromString(resTxid) + if err != nil { + t.Fatal(err.Error()) + } + expectedResults[*hash] = struct{}{} + } + + // check each graph search results is part of the expected result + for _, txnBuf := range gsRes { + r := bytes.NewReader(txnBuf) + msgTx := wire.MsgTx{} + msgTx.Deserialize(r) + + // check the expected txid is included + if _, ok := expectedResults[msgTx.TxHash()]; ok != true { + t.Fatalf("missing txid in graph search result: %v", msgTx.TxHash()) + } + } + } +} diff --git a/blockchain/slpgraphsearch/db_test.json b/blockchain/slpgraphsearch/db_test.json new file mode 100644 index 000000000..a824e6809 --- /dev/null +++ b/blockchain/slpgraphsearch/db_test.json @@ -0,0 +1,70 @@ +[ + { + "description": "genesis -> send", + "tokenGraph": [ + "01000000020e1fe868110886d4cc42f0cdac1327a3f849a45c88c6fe3d38451640801fd910010000006a4730440220761e2f8e97bd084bd834d046ab3fc523b0c2bdeda12bbbe6463feccb81aca4550220012ddb50343ddcc6f0e358024247bf0a4aa7123bfde366a25c8721c930e4977c4121023dbc5c56aaf34c98205fd84ec4e31d9f82acd7eee9373951fcf2ebaf487f08c1feffffff4f55029010cbd3886c635d45d0adb6584146a962bef91e81bbbdb507a98c1b39000000006b483045022100eacdff6f2ef91e303c46a4c14c4efb174c9527687b5db4b92275b04c002abdd602205ca74f57ab3b8c4e383d31957ee5b8e8865f2712ddee055b2c01df4c97a63dac41210210498e96cf18a4c98dbc228c15c2e709bec0767758cbc019b4c22c431281e356feffffff030000000000000000406a04534c500001010453454e442010d91f80401645383dfec6885ca449f8a32713accdf042ccd486081168e81f0e0800000000000186a00800000000000dbba022020000000000001976a914b2ae60e0dec443f3be51fb4e66cd4cf738977d2488ac22020000000000001976a9149df9d63f8d4d07b01f1309ac11eaf5acd4492ce588ac78ba0900", + "0100000001e3b628a987f8385595a0eda68e7499f4ce78d60ccb06a7b6c4b37c392ea6f1bb000000006b4830450221008dc1c231dbca0cb864b806e42072e965818879b4a564710467655a3891455cb002205c75e8c466cb5ba2ab6c5c51a187ea043437cc9b35dc3ae48b2ec9664913d5bd412103a05368437584b3648e52b7f0558d7c255974dd6cc9300aa417d016f0c1ac7d27feffffff020000000000000000256a04534c500001010747454e455349534c004c004c004c0001004c000800000000000f424022020000000000001976a914ef3f8948c8ac0b76d670a721fc7dee6cdbd1729288ac78ba0900", + "010000000297b92f0c5b43e960e833ee9e1ec9e9be2406eb21a134fc8c6675680bde1d153f020000006b48304502210091c4af46420a36df05258ac1c71b17cefe67bb1ddae483ddf35b352af54dd3470220598f9c9d5f7c31f1b4b9f4fc78569a6a60ab75a34975e84a6b389e5af0caec924121032582b53eaed18c1273c79e7ef07afa602c7911836b94d2f493f48f665daa7367feffffff86a37b1ff4c7505c975ca9a3e9bee6437fbb8fd032e9b4000eb6f2d2ed3c5f17000000006a47304402206932f28873f72a3509f904d2e9e996e25437fe5cb2c1662583552b837468d4e00220700c1c8bf2a750023f34ea2e4f3acaba8a3c002818e487bd4952ad9b3ee95aea412103b2952c4fff38c4e79754c71fd57ff7660608892249fa1e520efd941ccfd5e029feffffff040000000000000000406a04534c500001010453454e442010d91f80401645383dfec6885ca449f8a32713accdf042ccd486081168e81f0e0800000000000000010800000000000dbb9f22020000000000001976a914778124e1974983a11490a91baf1f155168e64b1788ac22020000000000001976a914a5e4d8a742fa178392bad95413bb3dfb631b2aa488ac0d230000000000001976a914d724a86046dea076adb1c42fc43a1188f4f2171c88acc4150a00" + ], + "searchTxid": "3f151dde0b6875668cfc34a121eb0624bee9c91e9eee33e860e9435b0c2fb997", + "clientValidityCache": [], + "expectedResultTxids": [ + "3f151dde0b6875668cfc34a121eb0624bee9c91e9eee33e860e9435b0c2fb997", + "10d91f80401645383dfec6885ca449f8a32713accdf042ccd486081168e81f0e" + ] + }, + { + "description": "genesis -> mint -> mint -> send", + "tokenGraph": [ + "0100000001063af3eb1067bd835e5590ddb4b982d01af7d2e68df5c05f4f12e24092033b90020000006a47304402205b26fd3eabd0b00642b1f777053ba2795bbd6b0f700a7cce66b164182136d37c022032a55e4c81f1c9044581a3043882da699a7a35111d385ab9a79451bb2927d7e3412102d9ac30970e39aafcadaefdb54e819c905a85ba90d44a2c1867e2a036d1207cbcfeffffff040000000000000000266a04534c500001010747454e455349534c000267734c004c000100010208000000000000006422020000000000001976a914ca5f4be3506a3c576b12d77875120b9ae3825cc388ac22020000000000001976a914ca5f4be3506a3c576b12d77875120b9ae3825cc388ace31f0000000000001976a91442639889a96e3ca61db1661b6f53cf2639d25f0288ac86230a00", + "010000000251184a8f5b066b1d6535dfd14726095f11f04a7372a8ea892202385eccd77d89020000006b483045022100bd80ff7f18b1145262a2c519c3dbb2277b42367f3c0c25a4545f88f24e74fcb70220307e5dece3ec769e4220beff3cd10c967734fce5e121ee680e8e5f7d9e6c2c8041210221a25fc9b0b8860414ef76f809e469c35834bd9eb77fbcf902398506664431c0feffffff51184a8f5b066b1d6535dfd14726095f11f04a7372a8ea892202385eccd77d89030000006b48304502210096768888b61d7c85b61af3c30ce174c8eae98f58c2f179af17e2d2b07422a93302200246353042f93d6e1753ead954afe1ff32d25807a22d120a9371ec66573daff5412102e39cf0ec180c53b97dd85c8709d86cf2f24539ba801bd5ec04beb2caa4621f8cfeffffff040000000000000000396a04534c50000101044d494e54204d4ad4297dfc2f5ed26766f8c33d3438c0fa914882e042475933b2af39a1f226010208000000000000006422020000000000001976a9149eb9addb3c9b7c37b5590144b603fa289d68a2ec88ac22020000000000001976a9149eb9addb3c9b7c37b5590144b603fa289d68a2ec88aceb170000000000001976a9148dc5fff8685803ee9f242f9b861d1b079c36401488ac86230a00", + "010000000226f2a139afb233594742e0824891fac038343dc3f86667d25e2ffc7d29d44a4d020000006b4830450221008feb2c9a26ca06251f14eacb9c4a36471f33996b62f3c891d6f528b88bc6705a0220770987aa0fa1a4037474c9ec6113e3be618a74602018c4fd56604976fb34d678412103e4d23f839b8a2b51efa2188f0752470ec397f6bb5427adc0b621a99121af5fbafeffffff26f2a139afb233594742e0824891fac038343dc3f86667d25e2ffc7d29d44a4d030000006b483045022100fd3f0a7446a68e926f1dd55820664b708a673a9a613e7db79749bac2e3a124c402207c0d71abb0da2e0efa29daf61970b101be0b4097ae9e129f9b12978ec21e713e41210350a6167df66cc88f22db0d70453435529f364b6f248214de8c138e3eaa21993efeffffff040000000000000000396a04534c50000101044d494e54204d4ad4297dfc2f5ed26766f8c33d3438c0fa914882e042475933b2af39a1f226010208000000000000006422020000000000001976a9140cac93504633f5610994c6c0625a6ac90748ad8e88ac22020000000000001976a9140cac93504633f5610994c6c0625a6ac90748ad8e88ace71b0000000000001976a9145fc1a2cc592c93fcd7241c1d411de1744491f3a188ac86230a00", + "010000000451184a8f5b066b1d6535dfd14726095f11f04a7372a8ea892202385eccd77d89010000006a47304402201e63061ca7b22ac176a1a1381f7d68d458c6033b6d922cad67669ac0f16430a102203cf0375ac6553653d1e707a12561c70be40fb1f7fa98114a0661b2163d84ccc041210221a25fc9b0b8860414ef76f809e469c35834bd9eb77fbcf902398506664431c0feffffff4a0cf76e59d1564c70c4cfed7b87b31809b6536840d050f8d9546e12e19c5090010000006b483045022100d647f066ce25a6d66b4bdbcd1751c0d6dea377f6363f5da4c3a3efdc2455040a02206dc17e318cf0f6b268dcbec2e088cb8e0d077265fffadbfb7c740906cca98d6e412103e0df71de36939a28fa88acb756cc68bc0c0e028c0e128ae11d9ff452e9052a7bfeffffff26f2a139afb233594742e0824891fac038343dc3f86667d25e2ffc7d29d44a4d010000006a473044022038ca77e74a8b7897df1d543944a72aac76bec7d83f6036f4d25f15b9ac9ab49a0220279c9065dfcfec99a3878461d62744632a8dec0b96a9160b0c7d3815e5e08660412103e4d23f839b8a2b51efa2188f0752470ec397f6bb5427adc0b621a99121af5fbafeffffff27a482e63085c1459c1d09a2b3f1bda2f4a6f3b1fbb8d284c858d586f410a308030000006b483045022100dd4bd130f8d771c60dd85464a19342d2ecc0280b96e73e8e2567016b8a5f84c70220563689e90b8bfb4cf4a0edbe7b6516673df8a687397f9e8b223b036a33654846412102509084506a6c33938e1a808cd52f6a54d0d84ae215dd436255e0b8574ea7385efeffffff030000000000000000376a04534c500001010453454e44204d4ad4297dfc2f5ed26766f8c33d3438c0fa914882e042475933b2af39a1f22608000000000000012c22020000000000001976a9147c08d2232a42bc7cc5a1f056f81d0378743c746f88ac38050000000000001976a914d9cd1a1642b95d55dccad82647ddaf6306b5ba1a88ac86230a00" + ], + "searchTxid": "151db8c5b9d63694f084d08fde3979723bec71b6f0f2693fbce841d3122723b7", + "clientValidityCache": [], + "expectedResultTxids": [ + "4d4ad4297dfc2f5ed26766f8c33d3438c0fa914882e042475933b2af39a1f226", + "90509ce1126e54d9f850d0406853b60918b3877bedcfc4704c56d1596ef70c4a", + "897dd7cc5e38022289eaa872734af0115f092647d1df35651d6b065b8f4a1851", + "151db8c5b9d63694f084d08fde3979723bec71b6f0f2693fbce841d3122723b7" + ] + }, + { + "description": "genesis -> mint -> mint -> send", + "tokenGraph": [ + "0100000001063af3eb1067bd835e5590ddb4b982d01af7d2e68df5c05f4f12e24092033b90020000006a47304402205b26fd3eabd0b00642b1f777053ba2795bbd6b0f700a7cce66b164182136d37c022032a55e4c81f1c9044581a3043882da699a7a35111d385ab9a79451bb2927d7e3412102d9ac30970e39aafcadaefdb54e819c905a85ba90d44a2c1867e2a036d1207cbcfeffffff040000000000000000266a04534c500001010747454e455349534c000267734c004c000100010208000000000000006422020000000000001976a914ca5f4be3506a3c576b12d77875120b9ae3825cc388ac22020000000000001976a914ca5f4be3506a3c576b12d77875120b9ae3825cc388ace31f0000000000001976a91442639889a96e3ca61db1661b6f53cf2639d25f0288ac86230a00", + "010000000251184a8f5b066b1d6535dfd14726095f11f04a7372a8ea892202385eccd77d89020000006b483045022100bd80ff7f18b1145262a2c519c3dbb2277b42367f3c0c25a4545f88f24e74fcb70220307e5dece3ec769e4220beff3cd10c967734fce5e121ee680e8e5f7d9e6c2c8041210221a25fc9b0b8860414ef76f809e469c35834bd9eb77fbcf902398506664431c0feffffff51184a8f5b066b1d6535dfd14726095f11f04a7372a8ea892202385eccd77d89030000006b48304502210096768888b61d7c85b61af3c30ce174c8eae98f58c2f179af17e2d2b07422a93302200246353042f93d6e1753ead954afe1ff32d25807a22d120a9371ec66573daff5412102e39cf0ec180c53b97dd85c8709d86cf2f24539ba801bd5ec04beb2caa4621f8cfeffffff040000000000000000396a04534c50000101044d494e54204d4ad4297dfc2f5ed26766f8c33d3438c0fa914882e042475933b2af39a1f226010208000000000000006422020000000000001976a9149eb9addb3c9b7c37b5590144b603fa289d68a2ec88ac22020000000000001976a9149eb9addb3c9b7c37b5590144b603fa289d68a2ec88aceb170000000000001976a9148dc5fff8685803ee9f242f9b861d1b079c36401488ac86230a00", + "010000000226f2a139afb233594742e0824891fac038343dc3f86667d25e2ffc7d29d44a4d020000006b4830450221008feb2c9a26ca06251f14eacb9c4a36471f33996b62f3c891d6f528b88bc6705a0220770987aa0fa1a4037474c9ec6113e3be618a74602018c4fd56604976fb34d678412103e4d23f839b8a2b51efa2188f0752470ec397f6bb5427adc0b621a99121af5fbafeffffff26f2a139afb233594742e0824891fac038343dc3f86667d25e2ffc7d29d44a4d030000006b483045022100fd3f0a7446a68e926f1dd55820664b708a673a9a613e7db79749bac2e3a124c402207c0d71abb0da2e0efa29daf61970b101be0b4097ae9e129f9b12978ec21e713e41210350a6167df66cc88f22db0d70453435529f364b6f248214de8c138e3eaa21993efeffffff040000000000000000396a04534c50000101044d494e54204d4ad4297dfc2f5ed26766f8c33d3438c0fa914882e042475933b2af39a1f226010208000000000000006422020000000000001976a9140cac93504633f5610994c6c0625a6ac90748ad8e88ac22020000000000001976a9140cac93504633f5610994c6c0625a6ac90748ad8e88ace71b0000000000001976a9145fc1a2cc592c93fcd7241c1d411de1744491f3a188ac86230a00", + "010000000451184a8f5b066b1d6535dfd14726095f11f04a7372a8ea892202385eccd77d89010000006a47304402201e63061ca7b22ac176a1a1381f7d68d458c6033b6d922cad67669ac0f16430a102203cf0375ac6553653d1e707a12561c70be40fb1f7fa98114a0661b2163d84ccc041210221a25fc9b0b8860414ef76f809e469c35834bd9eb77fbcf902398506664431c0feffffff4a0cf76e59d1564c70c4cfed7b87b31809b6536840d050f8d9546e12e19c5090010000006b483045022100d647f066ce25a6d66b4bdbcd1751c0d6dea377f6363f5da4c3a3efdc2455040a02206dc17e318cf0f6b268dcbec2e088cb8e0d077265fffadbfb7c740906cca98d6e412103e0df71de36939a28fa88acb756cc68bc0c0e028c0e128ae11d9ff452e9052a7bfeffffff26f2a139afb233594742e0824891fac038343dc3f86667d25e2ffc7d29d44a4d010000006a473044022038ca77e74a8b7897df1d543944a72aac76bec7d83f6036f4d25f15b9ac9ab49a0220279c9065dfcfec99a3878461d62744632a8dec0b96a9160b0c7d3815e5e08660412103e4d23f839b8a2b51efa2188f0752470ec397f6bb5427adc0b621a99121af5fbafeffffff27a482e63085c1459c1d09a2b3f1bda2f4a6f3b1fbb8d284c858d586f410a308030000006b483045022100dd4bd130f8d771c60dd85464a19342d2ecc0280b96e73e8e2567016b8a5f84c70220563689e90b8bfb4cf4a0edbe7b6516673df8a687397f9e8b223b036a33654846412102509084506a6c33938e1a808cd52f6a54d0d84ae215dd436255e0b8574ea7385efeffffff030000000000000000376a04534c500001010453454e44204d4ad4297dfc2f5ed26766f8c33d3438c0fa914882e042475933b2af39a1f22608000000000000012c22020000000000001976a9147c08d2232a42bc7cc5a1f056f81d0378743c746f88ac38050000000000001976a914d9cd1a1642b95d55dccad82647ddaf6306b5ba1a88ac86230a00" + ], + "searchTxid": "151db8c5b9d63694f084d08fde3979723bec71b6f0f2693fbce841d3122723b7", + "clientValidityCache": [ + "90509ce1126e54d9f850d0406853b60918b3877bedcfc4704c56d1596ef70c4a" + ], + "expectedResultTxids": [ + "4d4ad4297dfc2f5ed26766f8c33d3438c0fa914882e042475933b2af39a1f226", + "90509ce1126e54d9f850d0406853b60918b3877bedcfc4704c56d1596ef70c4a", + "897dd7cc5e38022289eaa872734af0115f092647d1df35651d6b065b8f4a1851", + "151db8c5b9d63694f084d08fde3979723bec71b6f0f2693fbce841d3122723b7" + ] + }, + { + "description": "genesis -> mint -> mint -> send (validity cache) -> send", + "tokenGraph": [ + "0100000001063af3eb1067bd835e5590ddb4b982d01af7d2e68df5c05f4f12e24092033b90020000006a47304402205b26fd3eabd0b00642b1f777053ba2795bbd6b0f700a7cce66b164182136d37c022032a55e4c81f1c9044581a3043882da699a7a35111d385ab9a79451bb2927d7e3412102d9ac30970e39aafcadaefdb54e819c905a85ba90d44a2c1867e2a036d1207cbcfeffffff040000000000000000266a04534c500001010747454e455349534c000267734c004c000100010208000000000000006422020000000000001976a914ca5f4be3506a3c576b12d77875120b9ae3825cc388ac22020000000000001976a914ca5f4be3506a3c576b12d77875120b9ae3825cc388ace31f0000000000001976a91442639889a96e3ca61db1661b6f53cf2639d25f0288ac86230a00", + "010000000251184a8f5b066b1d6535dfd14726095f11f04a7372a8ea892202385eccd77d89020000006b483045022100bd80ff7f18b1145262a2c519c3dbb2277b42367f3c0c25a4545f88f24e74fcb70220307e5dece3ec769e4220beff3cd10c967734fce5e121ee680e8e5f7d9e6c2c8041210221a25fc9b0b8860414ef76f809e469c35834bd9eb77fbcf902398506664431c0feffffff51184a8f5b066b1d6535dfd14726095f11f04a7372a8ea892202385eccd77d89030000006b48304502210096768888b61d7c85b61af3c30ce174c8eae98f58c2f179af17e2d2b07422a93302200246353042f93d6e1753ead954afe1ff32d25807a22d120a9371ec66573daff5412102e39cf0ec180c53b97dd85c8709d86cf2f24539ba801bd5ec04beb2caa4621f8cfeffffff040000000000000000396a04534c50000101044d494e54204d4ad4297dfc2f5ed26766f8c33d3438c0fa914882e042475933b2af39a1f226010208000000000000006422020000000000001976a9149eb9addb3c9b7c37b5590144b603fa289d68a2ec88ac22020000000000001976a9149eb9addb3c9b7c37b5590144b603fa289d68a2ec88aceb170000000000001976a9148dc5fff8685803ee9f242f9b861d1b079c36401488ac86230a00", + "010000000226f2a139afb233594742e0824891fac038343dc3f86667d25e2ffc7d29d44a4d020000006b4830450221008feb2c9a26ca06251f14eacb9c4a36471f33996b62f3c891d6f528b88bc6705a0220770987aa0fa1a4037474c9ec6113e3be618a74602018c4fd56604976fb34d678412103e4d23f839b8a2b51efa2188f0752470ec397f6bb5427adc0b621a99121af5fbafeffffff26f2a139afb233594742e0824891fac038343dc3f86667d25e2ffc7d29d44a4d030000006b483045022100fd3f0a7446a68e926f1dd55820664b708a673a9a613e7db79749bac2e3a124c402207c0d71abb0da2e0efa29daf61970b101be0b4097ae9e129f9b12978ec21e713e41210350a6167df66cc88f22db0d70453435529f364b6f248214de8c138e3eaa21993efeffffff040000000000000000396a04534c50000101044d494e54204d4ad4297dfc2f5ed26766f8c33d3438c0fa914882e042475933b2af39a1f226010208000000000000006422020000000000001976a9140cac93504633f5610994c6c0625a6ac90748ad8e88ac22020000000000001976a9140cac93504633f5610994c6c0625a6ac90748ad8e88ace71b0000000000001976a9145fc1a2cc592c93fcd7241c1d411de1744491f3a188ac86230a00", + "010000000451184a8f5b066b1d6535dfd14726095f11f04a7372a8ea892202385eccd77d89010000006a47304402201e63061ca7b22ac176a1a1381f7d68d458c6033b6d922cad67669ac0f16430a102203cf0375ac6553653d1e707a12561c70be40fb1f7fa98114a0661b2163d84ccc041210221a25fc9b0b8860414ef76f809e469c35834bd9eb77fbcf902398506664431c0feffffff4a0cf76e59d1564c70c4cfed7b87b31809b6536840d050f8d9546e12e19c5090010000006b483045022100d647f066ce25a6d66b4bdbcd1751c0d6dea377f6363f5da4c3a3efdc2455040a02206dc17e318cf0f6b268dcbec2e088cb8e0d077265fffadbfb7c740906cca98d6e412103e0df71de36939a28fa88acb756cc68bc0c0e028c0e128ae11d9ff452e9052a7bfeffffff26f2a139afb233594742e0824891fac038343dc3f86667d25e2ffc7d29d44a4d010000006a473044022038ca77e74a8b7897df1d543944a72aac76bec7d83f6036f4d25f15b9ac9ab49a0220279c9065dfcfec99a3878461d62744632a8dec0b96a9160b0c7d3815e5e08660412103e4d23f839b8a2b51efa2188f0752470ec397f6bb5427adc0b621a99121af5fbafeffffff27a482e63085c1459c1d09a2b3f1bda2f4a6f3b1fbb8d284c858d586f410a308030000006b483045022100dd4bd130f8d771c60dd85464a19342d2ecc0280b96e73e8e2567016b8a5f84c70220563689e90b8bfb4cf4a0edbe7b6516673df8a687397f9e8b223b036a33654846412102509084506a6c33938e1a808cd52f6a54d0d84ae215dd436255e0b8574ea7385efeffffff030000000000000000376a04534c500001010453454e44204d4ad4297dfc2f5ed26766f8c33d3438c0fa914882e042475933b2af39a1f22608000000000000012c22020000000000001976a9147c08d2232a42bc7cc5a1f056f81d0378743c746f88ac38050000000000001976a914d9cd1a1642b95d55dccad82647ddaf6306b5ba1a88ac86230a00", + "0100000002b7232712d341e8bc3f69f2f0b671ec3b727939de8fd084f09436d6b9c5b81d15010000006a47304402200665ef43aadeac9b6eff2da1e8de87364610a6e2b0ac7b0272305d30a5788c030220163e2a590f0377f125a664ca236b69cd8ff91a0f682a4a427816d004d65cd22541210221a8e41079fda30910e1e4d17b394843f41efffe1273f88664a7bd95f77477d4feffffffb7232712d341e8bc3f69f2f0b671ec3b727939de8fd084f09436d6b9c5b81d15020000006b483045022100ec79f12808f102adff2634a3e07ea8a3d79e6c356e4ae9cc604c6640042f297a022061a4bdcb961a145027092ee653d9f56acd20f529e06544460d6a42cae00cd15441210205b086609c6f27599acee449921310950a65e995e09fb35168ff017329a49746feffffff030000000000000000376a04534c500001010453454e44204d4ad4297dfc2f5ed26766f8c33d3438c0fa914882e042475933b2af39a1f22608000000000000012c22020000000000001976a914facf42c7cbc2dc477a3501b1a1e50c583986bb4888ac82030000000000001976a9142a6e1ee5b25658872111343f6c1e56eb7b291ea088ac88230a00" + ], + "searchTxid": "a06ebcff290e82dde8bef5bb384826ac868276538587feee332ba94d7bb57b62", + "clientValidityCache": [ + "151db8c5b9d63694f084d08fde3979723bec71b6f0f2693fbce841d3122723b7" + ], + "expectedResultTxids": [ + "151db8c5b9d63694f084d08fde3979723bec71b6f0f2693fbce841d3122723b7", + "a06ebcff290e82dde8bef5bb384826ac868276538587feee332ba94d7bb57b62" + ] + } +] diff --git a/blockchain/slpgraphsearch/tokengraph.go b/blockchain/slpgraphsearch/tokengraph.go new file mode 100644 index 000000000..45c084a20 --- /dev/null +++ b/blockchain/slpgraphsearch/tokengraph.go @@ -0,0 +1,61 @@ +package slpgraphsearch + +import ( + "errors" + "sync" + + "github.com/gcash/bchd/chaincfg/chainhash" + "github.com/gcash/bchd/wire" +) + +// tokenGraph manages slp token graphs for graph search and TODO: recently queried items +type tokenGraph struct { + sync.RWMutex + TokenID *chainhash.Hash + graph map[chainhash.Hash]*wire.MsgTx +} + +// newSlpTokenGraph creates a new instance of SlpCache +func newTokenGraph(tokenID *chainhash.Hash) *tokenGraph { + return &tokenGraph{ + graph: make(map[chainhash.Hash]*wire.MsgTx), + TokenID: tokenID, + } +} + +// size gets the current size of the token graph +func (g *tokenGraph) size() int { + return len(g.graph) +} + +// getTxn gets graph items allowing concurrent read access without +func (g *tokenGraph) getTxn(hash *chainhash.Hash) *wire.MsgTx { + g.RLock() + defer g.RUnlock() + + return g.graph[*hash] +} + +// addTxn puts new graph items in a token graph +func (g *tokenGraph) addTxn(tx *wire.MsgTx) error { + g.Lock() + defer g.Unlock() + size0 := g.size() + g.graph[tx.TxHash()] = tx + if g.size() < size0 { + return errors.New("token graph db should never get smaller") + } + return nil +} + +// removeTxn removes a transaction from the graph +func (g *tokenGraph) removeTxn(tx *wire.MsgTx) error { + g.Lock() + defer g.Unlock() + + if _, ok := g.graph[tx.TxHash()]; !ok { + return errors.New("transaction doesn't exist in graph") + } + delete(g.graph, tx.TxHash()) + return nil +} diff --git a/config.go b/config.go index 0f909debf..514c34a59 100644 --- a/config.go +++ b/config.go @@ -66,6 +66,7 @@ const ( defaultAddrIndex = false defaultSlpIndex = false defaultSlpCacheMaxSize = 100000 + defaultSlpGraphSearch = false defaultUtxoCacheMaxSizeMiB = 450 defaultMinSyncPeerNetworkSpeed = 51200 defaultPruneDepth = 4320 @@ -191,6 +192,7 @@ type config struct { SlpIndex bool `long:"slpindex" description:"Maintain an index which makes slp transaction validity and token metadata available via various gRPC methods"` SlpCacheMaxSize uint `long:"slpcachemaxsize" description:"The maximum number of entries in the slp indexer cache"` DropSlpIndex bool `long:"dropslpindex" description:"Deletes the slp index from the database on start up and then exits."` + SlpGraphSearch bool `long:"slpgraphsearch" description:"Enables gRPC calls related to slp graph search."` RelayNonStd bool `long:"relaynonstd" description:"Relay non-standard transactions regardless of the default settings for the active network."` RejectNonStd bool `long:"rejectnonstd" description:"Reject non-standard transactions regardless of the default settings for the active network."` Prune bool `long:"prune" description:"Delete historical blocks from the chain. A buffer of blocks will be retained in case of a reorg."` @@ -475,6 +477,7 @@ func loadConfig() (*config, []string, error) { AddrIndex: defaultAddrIndex, SlpIndex: defaultSlpIndex, SlpCacheMaxSize: defaultSlpCacheMaxSize, + SlpGraphSearch: defaultSlpGraphSearch, PruneDepth: defaultPruneDepth, TargetOutboundPeers: defaultTargetOutboundPeers, DBCacheSize: defaultDBCacheSize, @@ -652,6 +655,15 @@ func loadConfig() (*config, []string, error) { return nil, nil, err } + // SlpGraphSearch doesn't work without txindex and slpindex + if cfg.SlpGraphSearch && (!cfg.TxIndex || !cfg.SlpIndex) { + str := "%s: slpgraphsearch can not be used without both txindex and slpindex." + err := fmt.Errorf(str, funcName) + fmt.Fprintln(os.Stderr, err) + fmt.Fprintln(os.Stderr, usageMessage) + return nil, nil, err + } + // Set the default policy for relaying non-standard transactions // according to the default of the active network. The set // configuration value takes precedence over the default value for the diff --git a/sample-bchd.conf b/sample-bchd.conf index e42830adf..c39d9308b 100644 --- a/sample-bchd.conf +++ b/sample-bchd.conf @@ -381,10 +381,15 @@ ; addrindex=1 ; Build and maintain an index of valid Simple Ledger Protocol (SLP) token -; transactions which makes a number of gRPC methods for obtaining +; transactions. This makes a number of gRPC methods for obtaining ; token metadata available. ; slpindex=1 +; Load and maintain slp token graphs in-memory. This is an experimental feature +; that requires slpindex and txindex, and whenthis is enabled it makes the +; GetSlpGraphSearch gRPC method available. +; slpgraphsearch=1 + ; ------------------------------------------------------------------------------ ; Signature Verification Cache ; ------------------------------------------------------------------------------ diff --git a/server.go b/server.go index 7bff5ec89..530869813 100644 --- a/server.go +++ b/server.go @@ -3201,10 +3201,11 @@ func newServer(listenAddrs, agentBlacklist, agentWhitelist []string, db database indxLog.Info("Slp index is enabled") slpCfg := &indexers.SlpConfig{ - AddrPrefix: chainParams.SlpAddressPrefix, - StartHash: chainParams.SlpIndexStartHash, - StartHeight: chainParams.SlpIndexStartHeight, - MaxCacheSize: int(cfg.SlpCacheMaxSize), + AddrPrefix: chainParams.SlpAddressPrefix, + StartHash: chainParams.SlpIndexStartHash, + StartHeight: chainParams.SlpIndexStartHeight, + MaxCacheSize: int(cfg.SlpCacheMaxSize), + SlpGraphSearchEnabled: cfg.SlpGraphSearch, } s.slpIndex = indexers.NewSlpIndex(db, slpCfg) indexes = append(indexes, s.slpIndex)