From 9bb2a26948b6fd6933c8a974268895c9fbedcd28 Mon Sep 17 00:00:00 2001 From: AdamISZ Date: Thu, 27 Sep 2018 15:49:44 +0200 Subject: [PATCH] Add listunspent RPC call Returns a brief json summary of each utxo found by calling ListUnspentWitness in the wallet. The two arguments are the minimum and maximum number of conrfirmations (0=include unconfirmed) --- cmd/lncli/commands.go | 101 ++- cmd/lncli/main.go | 1 + lnd_test.go | 4 +- lnrpc/README.md | 2 + lnrpc/rpc.pb.go | 1236 +++++++++++++++++-------------- lnrpc/rpc.pb.gw.go | 50 ++ lnrpc/rpc.proto | 51 +- lnrpc/rpc.swagger.json | 88 +++ lntest/harness.go | 10 +- lnwallet/btcwallet/btcwallet.go | 1 + lnwallet/interface.go | 1 + rpcserver.go | 89 ++- 12 files changed, 1076 insertions(+), 558 deletions(-) diff --git a/cmd/lncli/commands.go b/cmd/lncli/commands.go index 5407f6722..5bc9b5f5d 100644 --- a/cmd/lncli/commands.go +++ b/cmd/lncli/commands.go @@ -120,12 +120,12 @@ func newAddress(ctx *cli.Context) error { // Map the string encoded address type, to the concrete typed address // type enum. An unrecognized address type will result in an error. - var addrType lnrpc.NewAddressRequest_AddressType + var addrType lnrpc.AddressType switch stringAddrType { // TODO(roasbeef): make them ints on the cli? case "p2wkh": - addrType = lnrpc.NewAddressRequest_WITNESS_PUBKEY_HASH + addrType = lnrpc.AddressType_WITNESS_PUBKEY_HASH case "np2wkh": - addrType = lnrpc.NewAddressRequest_NESTED_PUBKEY_HASH + addrType = lnrpc.AddressType_NESTED_PUBKEY_HASH default: return fmt.Errorf("invalid address type %v, support address type "+ "are: p2wkh and np2wkh", stringAddrType) @@ -242,6 +242,101 @@ func sendCoins(ctx *cli.Context) error { return nil } +var listUnspentCommand = cli.Command{ + Name: "listunspent", + Category: "On-chain", + Usage: "List utxos available for spending.", + ArgsUsage: "min-confs max-confs", + Description: ` + For each spendable utxo currently in the wallet, with at least min_confs + confirmations, and at most max_confs confirmations, lists the txid, index, + amount, address, address type, scriptPubkey and number of confirmations. + Use --min_confs=0 to include unconfirmed coins. To list all coins + with at least min_confs confirmations, omit the second argument or flag + '--max_confs'. + `, + Flags: []cli.Flag{ + cli.Int64Flag{ + Name: "min_confs", + Usage: "the minimum number of confirmations for a utxo", + }, + cli.Int64Flag{ + Name: "max_confs", + Usage: "the maximum number of confirmations for a utxo", + }, + }, + Action: actionDecorator(listUnspent), +} + +func listUnspent(ctx *cli.Context) error { + var ( + minConfirms int64 + maxConfirms int64 + err error + ) + args := ctx.Args() + + if ctx.NArg() == 0 && ctx.NumFlags() == 0 { + cli.ShowCommandHelp(ctx, "listunspent") + return nil + } + + if ctx.IsSet("max_confs") && !ctx.IsSet("min_confs") { + return fmt.Errorf("max_confs cannot be set without " + + "min_confs being set") + } + + switch { + case ctx.IsSet("min_confs"): + minConfirms = ctx.Int64("min_confs") + case args.Present(): + minConfirms, err = strconv.ParseInt(args.First(), 10, 64) + if err != nil { + cli.ShowCommandHelp(ctx, "listunspent") + return nil + } + args = args.Tail() + default: + return fmt.Errorf("minimum confirmations argument missing") + } + + switch { + case ctx.IsSet("max_confs"): + maxConfirms = ctx.Int64("max_confs") + case args.Present(): + maxConfirms, err = strconv.ParseInt(args.First(), 10, 64) + if err != nil { + cli.ShowCommandHelp(ctx, "listunspent") + return nil + } + args = args.Tail() + default: + // No maxconfs was specified; we use max as flag; + // the default for ctx.Int64 (0) is *not* appropriate here. + maxConfirms = math.MaxInt32 + } + + if minConfirms < 0 || maxConfirms < minConfirms { + return fmt.Errorf("maximum confirmations must be greater or " + + "equal to minimum confirmations") + } + + ctxb := context.Background() + client, cleanUp := getClient(ctx) + defer cleanUp() + + req := &lnrpc.ListUnspentRequest{ + MinConfs: int32(minConfirms), + MaxConfs: int32(maxConfirms), + } + jsonResponse, err := client.ListUnspent(ctxb, req) + if err != nil { + return err + } + printRespJSON(jsonResponse) + return nil +} + var sendManyCommand = cli.Command{ Name: "sendmany", Category: "On-chain", diff --git a/cmd/lncli/main.go b/cmd/lncli/main.go index 3588ba57d..b9c1c0438 100644 --- a/cmd/lncli/main.go +++ b/cmd/lncli/main.go @@ -256,6 +256,7 @@ func main() { newAddressCommand, sendManyCommand, sendCoinsCommand, + listUnspentCommand, connectCommand, disconnectCommand, openChannelCommand, diff --git a/lnd_test.go b/lnd_test.go index 1473d269d..3d839284c 100644 --- a/lnd_test.go +++ b/lnd_test.go @@ -599,8 +599,8 @@ func getChanInfo(ctx context.Context, node *lntest.HarnessNode) ( } const ( - AddrTypeWitnessPubkeyHash = lnrpc.NewAddressRequest_WITNESS_PUBKEY_HASH - AddrTypeNestedPubkeyHash = lnrpc.NewAddressRequest_NESTED_PUBKEY_HASH + AddrTypeWitnessPubkeyHash = lnrpc.AddressType_WITNESS_PUBKEY_HASH + AddrTypeNestedPubkeyHash = lnrpc.AddressType_NESTED_PUBKEY_HASH ) // testOnchainFundRecovery checks lnd's ability to rescan for onchain outputs diff --git a/lnrpc/README.md b/lnrpc/README.md index 45e3ccc7c..63757a5db 100644 --- a/lnrpc/README.md +++ b/lnrpc/README.md @@ -29,6 +29,8 @@ description): `lnd`. * SendCoins * Sends an amount of satoshis to a specific address. + * ListUnspent + * Lists available utxos within a range of confirmations. * SubscribeTransactions * Returns a stream which sends async notifications each time a transaction is created or one is received that pays to us. diff --git a/lnrpc/rpc.pb.go b/lnrpc/rpc.pb.go index 56e99959b..2438d2c38 100644 --- a/lnrpc/rpc.pb.go +++ b/lnrpc/rpc.pb.go @@ -16,6 +16,7 @@ It has these top-level messages: UnlockWalletResponse ChangePasswordRequest ChangePasswordResponse + Utxo Transaction GetTransactionsRequest TransactionDetails @@ -29,6 +30,8 @@ It has these top-level messages: SendManyResponse SendCoinsRequest SendCoinsResponse + ListUnspentRequest + ListUnspentResponse NewAddressRequest NewAddressResponse SignMessageRequest @@ -139,28 +142,31 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package -type NewAddressRequest_AddressType int32 +// * +// `AddressType` has to be one of: +// +// - `p2wkh`: Pay to witness key hash (`WITNESS_PUBKEY_HASH` = 0) +// - `np2wkh`: Pay to nested witness key hash (`NESTED_PUBKEY_HASH` = 1) +type AddressType int32 const ( - NewAddressRequest_WITNESS_PUBKEY_HASH NewAddressRequest_AddressType = 0 - NewAddressRequest_NESTED_PUBKEY_HASH NewAddressRequest_AddressType = 1 + AddressType_WITNESS_PUBKEY_HASH AddressType = 0 + AddressType_NESTED_PUBKEY_HASH AddressType = 1 ) -var NewAddressRequest_AddressType_name = map[int32]string{ +var AddressType_name = map[int32]string{ 0: "WITNESS_PUBKEY_HASH", 1: "NESTED_PUBKEY_HASH", } -var NewAddressRequest_AddressType_value = map[string]int32{ +var AddressType_value = map[string]int32{ "WITNESS_PUBKEY_HASH": 0, "NESTED_PUBKEY_HASH": 1, } -func (x NewAddressRequest_AddressType) String() string { - return proto.EnumName(NewAddressRequest_AddressType_name, int32(x)) -} -func (NewAddressRequest_AddressType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor0, []int{21, 0} +func (x AddressType) String() string { + return proto.EnumName(AddressType_name, int32(x)) } +func (AddressType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } type ChannelCloseSummary_ClosureType int32 @@ -194,7 +200,7 @@ func (x ChannelCloseSummary_ClosureType) String() string { return proto.EnumName(ChannelCloseSummary_ClosureType_name, int32(x)) } func (ChannelCloseSummary_ClosureType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor0, []int{35, 0} + return fileDescriptor0, []int{38, 0} } type GenSeedRequest struct { @@ -405,6 +411,70 @@ func (m *ChangePasswordResponse) String() string { return proto.Compa func (*ChangePasswordResponse) ProtoMessage() {} func (*ChangePasswordResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } +type Utxo struct { + // / The type of address + Type AddressType `protobuf:"varint,1,opt,name=type,json=address_type,enum=lnrpc.AddressType" json:"type,omitempty"` + // / The address + Address string `protobuf:"bytes,2,opt,name=address" json:"address,omitempty"` + // / The value of the unspent coin in satoshis + AmountSat int64 `protobuf:"varint,3,opt,name=amount_sat" json:"amount_sat,omitempty"` + // / The scriptpubkey in hex + ScriptPubkey string `protobuf:"bytes,4,opt,name=script_pubkey" json:"script_pubkey,omitempty"` + // / The outpoint in format txid:n + // / Note that this reuses the `ChannelPoint` message but + // / is not actually a channel related outpoint, of course + Outpoint *ChannelPoint `protobuf:"bytes,5,opt,name=outpoint" json:"outpoint,omitempty"` + // / The number of confirmations for the Utxo + Confirmations int64 `protobuf:"varint,6,opt,name=confirmations" json:"confirmations,omitempty"` +} + +func (m *Utxo) Reset() { *m = Utxo{} } +func (m *Utxo) String() string { return proto.CompactTextString(m) } +func (*Utxo) ProtoMessage() {} +func (*Utxo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } + +func (m *Utxo) GetType() AddressType { + if m != nil { + return m.Type + } + return AddressType_WITNESS_PUBKEY_HASH +} + +func (m *Utxo) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +func (m *Utxo) GetAmountSat() int64 { + if m != nil { + return m.AmountSat + } + return 0 +} + +func (m *Utxo) GetScriptPubkey() string { + if m != nil { + return m.ScriptPubkey + } + return "" +} + +func (m *Utxo) GetOutpoint() *ChannelPoint { + if m != nil { + return m.Outpoint + } + return nil +} + +func (m *Utxo) GetConfirmations() int64 { + if m != nil { + return m.Confirmations + } + return 0 +} + type Transaction struct { // / The transaction hash TxHash string `protobuf:"bytes,1,opt,name=tx_hash" json:"tx_hash,omitempty"` @@ -427,7 +497,7 @@ type Transaction struct { func (m *Transaction) Reset() { *m = Transaction{} } func (m *Transaction) String() string { return proto.CompactTextString(m) } func (*Transaction) ProtoMessage() {} -func (*Transaction) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } +func (*Transaction) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } func (m *Transaction) GetTxHash() string { if m != nil { @@ -491,7 +561,7 @@ type GetTransactionsRequest struct { func (m *GetTransactionsRequest) Reset() { *m = GetTransactionsRequest{} } func (m *GetTransactionsRequest) String() string { return proto.CompactTextString(m) } func (*GetTransactionsRequest) ProtoMessage() {} -func (*GetTransactionsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } +func (*GetTransactionsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } type TransactionDetails struct { // / The list of transactions relevant to the wallet. @@ -501,7 +571,7 @@ type TransactionDetails struct { func (m *TransactionDetails) Reset() { *m = TransactionDetails{} } func (m *TransactionDetails) String() string { return proto.CompactTextString(m) } func (*TransactionDetails) ProtoMessage() {} -func (*TransactionDetails) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } +func (*TransactionDetails) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } func (m *TransactionDetails) GetTransactions() []*Transaction { if m != nil { @@ -520,7 +590,7 @@ type FeeLimit struct { func (m *FeeLimit) Reset() { *m = FeeLimit{} } func (m *FeeLimit) String() string { return proto.CompactTextString(m) } func (*FeeLimit) ProtoMessage() {} -func (*FeeLimit) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } +func (*FeeLimit) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } type isFeeLimit_Limit interface{ isFeeLimit_Limit() } @@ -650,7 +720,7 @@ type SendRequest struct { func (m *SendRequest) Reset() { *m = SendRequest{} } func (m *SendRequest) String() string { return proto.CompactTextString(m) } func (*SendRequest) ProtoMessage() {} -func (*SendRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } +func (*SendRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } func (m *SendRequest) GetDest() []byte { if m != nil { @@ -718,7 +788,7 @@ type SendResponse struct { func (m *SendResponse) Reset() { *m = SendResponse{} } func (m *SendResponse) String() string { return proto.CompactTextString(m) } func (*SendResponse) ProtoMessage() {} -func (*SendResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } +func (*SendResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } func (m *SendResponse) GetPaymentError() string { if m != nil { @@ -760,7 +830,7 @@ type SendToRouteRequest struct { func (m *SendToRouteRequest) Reset() { *m = SendToRouteRequest{} } func (m *SendToRouteRequest) String() string { return proto.CompactTextString(m) } func (*SendToRouteRequest) ProtoMessage() {} -func (*SendToRouteRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } +func (*SendToRouteRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } func (m *SendToRouteRequest) GetPaymentHash() []byte { if m != nil { @@ -795,11 +865,9 @@ type ChannelPoint struct { func (m *ChannelPoint) Reset() { *m = ChannelPoint{} } func (m *ChannelPoint) String() string { return proto.CompactTextString(m) } func (*ChannelPoint) ProtoMessage() {} -func (*ChannelPoint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } +func (*ChannelPoint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } -type isChannelPoint_FundingTxid interface { - isChannelPoint_FundingTxid() -} +type isChannelPoint_FundingTxid interface{ isChannelPoint_FundingTxid() } type ChannelPoint_FundingTxidBytes struct { FundingTxidBytes []byte `protobuf:"bytes,1,opt,name=funding_txid_bytes,proto3,oneof"` @@ -915,7 +983,7 @@ type LightningAddress struct { func (m *LightningAddress) Reset() { *m = LightningAddress{} } func (m *LightningAddress) String() string { return proto.CompactTextString(m) } func (*LightningAddress) ProtoMessage() {} -func (*LightningAddress) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } +func (*LightningAddress) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } func (m *LightningAddress) GetPubkey() string { if m != nil { @@ -943,7 +1011,7 @@ type SendManyRequest struct { func (m *SendManyRequest) Reset() { *m = SendManyRequest{} } func (m *SendManyRequest) String() string { return proto.CompactTextString(m) } func (*SendManyRequest) ProtoMessage() {} -func (*SendManyRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } +func (*SendManyRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } func (m *SendManyRequest) GetAddrToAmount() map[string]int64 { if m != nil { @@ -974,7 +1042,7 @@ type SendManyResponse struct { func (m *SendManyResponse) Reset() { *m = SendManyResponse{} } func (m *SendManyResponse) String() string { return proto.CompactTextString(m) } func (*SendManyResponse) ProtoMessage() {} -func (*SendManyResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } +func (*SendManyResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } func (m *SendManyResponse) GetTxid() string { if m != nil { @@ -997,7 +1065,7 @@ type SendCoinsRequest struct { func (m *SendCoinsRequest) Reset() { *m = SendCoinsRequest{} } func (m *SendCoinsRequest) String() string { return proto.CompactTextString(m) } func (*SendCoinsRequest) ProtoMessage() {} -func (*SendCoinsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } +func (*SendCoinsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } func (m *SendCoinsRequest) GetAddr() string { if m != nil { @@ -1035,7 +1103,7 @@ type SendCoinsResponse struct { func (m *SendCoinsResponse) Reset() { *m = SendCoinsResponse{} } func (m *SendCoinsResponse) String() string { return proto.CompactTextString(m) } func (*SendCoinsResponse) ProtoMessage() {} -func (*SendCoinsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } +func (*SendCoinsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} } func (m *SendCoinsResponse) GetTxid() string { if m != nil { @@ -1044,26 +1112,64 @@ func (m *SendCoinsResponse) GetTxid() string { return "" } -// * -// `AddressType` has to be one of: -// -// - `p2wkh`: Pay to witness key hash (`WITNESS_PUBKEY_HASH` = 0) -// - `np2wkh`: Pay to nested witness key hash (`NESTED_PUBKEY_HASH` = 1) +type ListUnspentRequest struct { + // / The minimum number of confirmations to be included. + MinConfs int32 `protobuf:"varint,1,opt,name=min_confs,json=minConfs" json:"min_confs,omitempty"` + // / The maximum number of confirmations to be included. + MaxConfs int32 `protobuf:"varint,2,opt,name=max_confs,json=maxConfs" json:"max_confs,omitempty"` +} + +func (m *ListUnspentRequest) Reset() { *m = ListUnspentRequest{} } +func (m *ListUnspentRequest) String() string { return proto.CompactTextString(m) } +func (*ListUnspentRequest) ProtoMessage() {} +func (*ListUnspentRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} } + +func (m *ListUnspentRequest) GetMinConfs() int32 { + if m != nil { + return m.MinConfs + } + return 0 +} + +func (m *ListUnspentRequest) GetMaxConfs() int32 { + if m != nil { + return m.MaxConfs + } + return 0 +} + +type ListUnspentResponse struct { + // / A list of utxos + Utxos []*Utxo `protobuf:"bytes,1,rep,name=utxos" json:"utxos,omitempty"` +} + +func (m *ListUnspentResponse) Reset() { *m = ListUnspentResponse{} } +func (m *ListUnspentResponse) String() string { return proto.CompactTextString(m) } +func (*ListUnspentResponse) ProtoMessage() {} +func (*ListUnspentResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} } + +func (m *ListUnspentResponse) GetUtxos() []*Utxo { + if m != nil { + return m.Utxos + } + return nil +} + type NewAddressRequest struct { // / The address type - Type NewAddressRequest_AddressType `protobuf:"varint,1,opt,name=type,enum=lnrpc.NewAddressRequest_AddressType" json:"type,omitempty"` + Type AddressType `protobuf:"varint,1,opt,name=type,enum=lnrpc.AddressType" json:"type,omitempty"` } func (m *NewAddressRequest) Reset() { *m = NewAddressRequest{} } func (m *NewAddressRequest) String() string { return proto.CompactTextString(m) } func (*NewAddressRequest) ProtoMessage() {} -func (*NewAddressRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} } +func (*NewAddressRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} } -func (m *NewAddressRequest) GetType() NewAddressRequest_AddressType { +func (m *NewAddressRequest) GetType() AddressType { if m != nil { return m.Type } - return NewAddressRequest_WITNESS_PUBKEY_HASH + return AddressType_WITNESS_PUBKEY_HASH } type NewAddressResponse struct { @@ -1074,7 +1180,7 @@ type NewAddressResponse struct { func (m *NewAddressResponse) Reset() { *m = NewAddressResponse{} } func (m *NewAddressResponse) String() string { return proto.CompactTextString(m) } func (*NewAddressResponse) ProtoMessage() {} -func (*NewAddressResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} } +func (*NewAddressResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} } func (m *NewAddressResponse) GetAddress() string { if m != nil { @@ -1091,7 +1197,7 @@ type SignMessageRequest struct { func (m *SignMessageRequest) Reset() { *m = SignMessageRequest{} } func (m *SignMessageRequest) String() string { return proto.CompactTextString(m) } func (*SignMessageRequest) ProtoMessage() {} -func (*SignMessageRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} } +func (*SignMessageRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} } func (m *SignMessageRequest) GetMsg() []byte { if m != nil { @@ -1108,7 +1214,7 @@ type SignMessageResponse struct { func (m *SignMessageResponse) Reset() { *m = SignMessageResponse{} } func (m *SignMessageResponse) String() string { return proto.CompactTextString(m) } func (*SignMessageResponse) ProtoMessage() {} -func (*SignMessageResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} } +func (*SignMessageResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} } func (m *SignMessageResponse) GetSignature() string { if m != nil { @@ -1127,7 +1233,7 @@ type VerifyMessageRequest struct { func (m *VerifyMessageRequest) Reset() { *m = VerifyMessageRequest{} } func (m *VerifyMessageRequest) String() string { return proto.CompactTextString(m) } func (*VerifyMessageRequest) ProtoMessage() {} -func (*VerifyMessageRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} } +func (*VerifyMessageRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} } func (m *VerifyMessageRequest) GetMsg() []byte { if m != nil { @@ -1153,7 +1259,7 @@ type VerifyMessageResponse struct { func (m *VerifyMessageResponse) Reset() { *m = VerifyMessageResponse{} } func (m *VerifyMessageResponse) String() string { return proto.CompactTextString(m) } func (*VerifyMessageResponse) ProtoMessage() {} -func (*VerifyMessageResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} } +func (*VerifyMessageResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} } func (m *VerifyMessageResponse) GetValid() bool { if m != nil { @@ -1180,7 +1286,7 @@ type ConnectPeerRequest struct { func (m *ConnectPeerRequest) Reset() { *m = ConnectPeerRequest{} } func (m *ConnectPeerRequest) String() string { return proto.CompactTextString(m) } func (*ConnectPeerRequest) ProtoMessage() {} -func (*ConnectPeerRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} } +func (*ConnectPeerRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} } func (m *ConnectPeerRequest) GetAddr() *LightningAddress { if m != nil { @@ -1202,7 +1308,7 @@ type ConnectPeerResponse struct { func (m *ConnectPeerResponse) Reset() { *m = ConnectPeerResponse{} } func (m *ConnectPeerResponse) String() string { return proto.CompactTextString(m) } func (*ConnectPeerResponse) ProtoMessage() {} -func (*ConnectPeerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} } +func (*ConnectPeerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} } type DisconnectPeerRequest struct { // / The pubkey of the node to disconnect from @@ -1212,7 +1318,7 @@ type DisconnectPeerRequest struct { func (m *DisconnectPeerRequest) Reset() { *m = DisconnectPeerRequest{} } func (m *DisconnectPeerRequest) String() string { return proto.CompactTextString(m) } func (*DisconnectPeerRequest) ProtoMessage() {} -func (*DisconnectPeerRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} } +func (*DisconnectPeerRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} } func (m *DisconnectPeerRequest) GetPubKey() string { if m != nil { @@ -1227,7 +1333,7 @@ type DisconnectPeerResponse struct { func (m *DisconnectPeerResponse) Reset() { *m = DisconnectPeerResponse{} } func (m *DisconnectPeerResponse) String() string { return proto.CompactTextString(m) } func (*DisconnectPeerResponse) ProtoMessage() {} -func (*DisconnectPeerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} } +func (*DisconnectPeerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} } type HTLC struct { Incoming bool `protobuf:"varint,1,opt,name=incoming" json:"incoming,omitempty"` @@ -1239,7 +1345,7 @@ type HTLC struct { func (m *HTLC) Reset() { *m = HTLC{} } func (m *HTLC) String() string { return proto.CompactTextString(m) } func (*HTLC) ProtoMessage() {} -func (*HTLC) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} } +func (*HTLC) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} } func (m *HTLC) GetIncoming() bool { if m != nil { @@ -1329,7 +1435,7 @@ type Channel struct { func (m *Channel) Reset() { *m = Channel{} } func (m *Channel) String() string { return proto.CompactTextString(m) } func (*Channel) ProtoMessage() {} -func (*Channel) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} } +func (*Channel) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} } func (m *Channel) GetActive() bool { if m != nil { @@ -1460,7 +1566,7 @@ type ListChannelsRequest struct { func (m *ListChannelsRequest) Reset() { *m = ListChannelsRequest{} } func (m *ListChannelsRequest) String() string { return proto.CompactTextString(m) } func (*ListChannelsRequest) ProtoMessage() {} -func (*ListChannelsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} } +func (*ListChannelsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} } func (m *ListChannelsRequest) GetActiveOnly() bool { if m != nil { @@ -1498,7 +1604,7 @@ type ListChannelsResponse struct { func (m *ListChannelsResponse) Reset() { *m = ListChannelsResponse{} } func (m *ListChannelsResponse) String() string { return proto.CompactTextString(m) } func (*ListChannelsResponse) ProtoMessage() {} -func (*ListChannelsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} } +func (*ListChannelsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} } func (m *ListChannelsResponse) GetChannels() []*Channel { if m != nil { @@ -1533,7 +1639,7 @@ type ChannelCloseSummary struct { func (m *ChannelCloseSummary) Reset() { *m = ChannelCloseSummary{} } func (m *ChannelCloseSummary) String() string { return proto.CompactTextString(m) } func (*ChannelCloseSummary) ProtoMessage() {} -func (*ChannelCloseSummary) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} } +func (*ChannelCloseSummary) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} } func (m *ChannelCloseSummary) GetChannelPoint() string { if m != nil { @@ -1617,7 +1723,7 @@ type ClosedChannelsRequest struct { func (m *ClosedChannelsRequest) Reset() { *m = ClosedChannelsRequest{} } func (m *ClosedChannelsRequest) String() string { return proto.CompactTextString(m) } func (*ClosedChannelsRequest) ProtoMessage() {} -func (*ClosedChannelsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} } +func (*ClosedChannelsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} } func (m *ClosedChannelsRequest) GetCooperative() bool { if m != nil { @@ -1668,7 +1774,7 @@ type ClosedChannelsResponse struct { func (m *ClosedChannelsResponse) Reset() { *m = ClosedChannelsResponse{} } func (m *ClosedChannelsResponse) String() string { return proto.CompactTextString(m) } func (*ClosedChannelsResponse) ProtoMessage() {} -func (*ClosedChannelsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} } +func (*ClosedChannelsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} } func (m *ClosedChannelsResponse) GetChannels() []*ChannelCloseSummary { if m != nil { @@ -1699,7 +1805,7 @@ type Peer struct { func (m *Peer) Reset() { *m = Peer{} } func (m *Peer) String() string { return proto.CompactTextString(m) } func (*Peer) ProtoMessage() {} -func (*Peer) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} } +func (*Peer) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} } func (m *Peer) GetPubKey() string { if m != nil { @@ -1763,7 +1869,7 @@ type ListPeersRequest struct { func (m *ListPeersRequest) Reset() { *m = ListPeersRequest{} } func (m *ListPeersRequest) String() string { return proto.CompactTextString(m) } func (*ListPeersRequest) ProtoMessage() {} -func (*ListPeersRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} } +func (*ListPeersRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} } type ListPeersResponse struct { // / The list of currently connected peers @@ -1773,7 +1879,7 @@ type ListPeersResponse struct { func (m *ListPeersResponse) Reset() { *m = ListPeersResponse{} } func (m *ListPeersResponse) String() string { return proto.CompactTextString(m) } func (*ListPeersResponse) ProtoMessage() {} -func (*ListPeersResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} } +func (*ListPeersResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43} } func (m *ListPeersResponse) GetPeers() []*Peer { if m != nil { @@ -1788,7 +1894,7 @@ type GetInfoRequest struct { func (m *GetInfoRequest) Reset() { *m = GetInfoRequest{} } func (m *GetInfoRequest) String() string { return proto.CompactTextString(m) } func (*GetInfoRequest) ProtoMessage() {} -func (*GetInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} } +func (*GetInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} } type GetInfoResponse struct { // / The identity pubkey of the current node. @@ -1824,7 +1930,7 @@ type GetInfoResponse struct { func (m *GetInfoResponse) Reset() { *m = GetInfoResponse{} } func (m *GetInfoResponse) String() string { return proto.CompactTextString(m) } func (*GetInfoResponse) ProtoMessage() {} -func (*GetInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} } +func (*GetInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{45} } func (m *GetInfoResponse) GetIdentityPubkey() string { if m != nil { @@ -1933,7 +2039,7 @@ type ConfirmationUpdate struct { func (m *ConfirmationUpdate) Reset() { *m = ConfirmationUpdate{} } func (m *ConfirmationUpdate) String() string { return proto.CompactTextString(m) } func (*ConfirmationUpdate) ProtoMessage() {} -func (*ConfirmationUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43} } +func (*ConfirmationUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{46} } func (m *ConfirmationUpdate) GetBlockSha() []byte { if m != nil { @@ -1963,7 +2069,7 @@ type ChannelOpenUpdate struct { func (m *ChannelOpenUpdate) Reset() { *m = ChannelOpenUpdate{} } func (m *ChannelOpenUpdate) String() string { return proto.CompactTextString(m) } func (*ChannelOpenUpdate) ProtoMessage() {} -func (*ChannelOpenUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} } +func (*ChannelOpenUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{47} } func (m *ChannelOpenUpdate) GetChannelPoint() *ChannelPoint { if m != nil { @@ -1980,7 +2086,7 @@ type ChannelCloseUpdate struct { func (m *ChannelCloseUpdate) Reset() { *m = ChannelCloseUpdate{} } func (m *ChannelCloseUpdate) String() string { return proto.CompactTextString(m) } func (*ChannelCloseUpdate) ProtoMessage() {} -func (*ChannelCloseUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{45} } +func (*ChannelCloseUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{48} } func (m *ChannelCloseUpdate) GetClosingTxid() []byte { if m != nil { @@ -2013,7 +2119,7 @@ type CloseChannelRequest struct { func (m *CloseChannelRequest) Reset() { *m = CloseChannelRequest{} } func (m *CloseChannelRequest) String() string { return proto.CompactTextString(m) } func (*CloseChannelRequest) ProtoMessage() {} -func (*CloseChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{46} } +func (*CloseChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{49} } func (m *CloseChannelRequest) GetChannelPoint() *ChannelPoint { if m != nil { @@ -2054,11 +2160,9 @@ type CloseStatusUpdate struct { func (m *CloseStatusUpdate) Reset() { *m = CloseStatusUpdate{} } func (m *CloseStatusUpdate) String() string { return proto.CompactTextString(m) } func (*CloseStatusUpdate) ProtoMessage() {} -func (*CloseStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{47} } +func (*CloseStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{50} } -type isCloseStatusUpdate_Update interface { - isCloseStatusUpdate_Update() -} +type isCloseStatusUpdate_Update interface{ isCloseStatusUpdate_Update() } type CloseStatusUpdate_ClosePending struct { ClosePending *PendingUpdate `protobuf:"bytes,1,opt,name=close_pending,oneof"` @@ -2203,7 +2307,7 @@ type PendingUpdate struct { func (m *PendingUpdate) Reset() { *m = PendingUpdate{} } func (m *PendingUpdate) String() string { return proto.CompactTextString(m) } func (*PendingUpdate) ProtoMessage() {} -func (*PendingUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{48} } +func (*PendingUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{51} } func (m *PendingUpdate) GetTxid() []byte { if m != nil { @@ -2247,7 +2351,7 @@ type OpenChannelRequest struct { func (m *OpenChannelRequest) Reset() { *m = OpenChannelRequest{} } func (m *OpenChannelRequest) String() string { return proto.CompactTextString(m) } func (*OpenChannelRequest) ProtoMessage() {} -func (*OpenChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{49} } +func (*OpenChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{52} } func (m *OpenChannelRequest) GetNodePubkey() []byte { if m != nil { @@ -2337,11 +2441,9 @@ type OpenStatusUpdate struct { func (m *OpenStatusUpdate) Reset() { *m = OpenStatusUpdate{} } func (m *OpenStatusUpdate) String() string { return proto.CompactTextString(m) } func (*OpenStatusUpdate) ProtoMessage() {} -func (*OpenStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{50} } +func (*OpenStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{53} } -type isOpenStatusUpdate_Update interface { - isOpenStatusUpdate_Update() -} +type isOpenStatusUpdate_Update interface{ isOpenStatusUpdate_Update() } type OpenStatusUpdate_ChanPending struct { ChanPending *PendingUpdate `protobuf:"bytes,1,opt,name=chan_pending,oneof"` @@ -2499,7 +2601,7 @@ type PendingHTLC struct { func (m *PendingHTLC) Reset() { *m = PendingHTLC{} } func (m *PendingHTLC) String() string { return proto.CompactTextString(m) } func (*PendingHTLC) ProtoMessage() {} -func (*PendingHTLC) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{51} } +func (*PendingHTLC) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{54} } func (m *PendingHTLC) GetIncoming() bool { if m != nil { @@ -2549,7 +2651,7 @@ type PendingChannelsRequest struct { func (m *PendingChannelsRequest) Reset() { *m = PendingChannelsRequest{} } func (m *PendingChannelsRequest) String() string { return proto.CompactTextString(m) } func (*PendingChannelsRequest) ProtoMessage() {} -func (*PendingChannelsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{52} } +func (*PendingChannelsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{55} } type PendingChannelsResponse struct { // / The balance in satoshis encumbered in pending channels @@ -2567,7 +2669,7 @@ type PendingChannelsResponse struct { func (m *PendingChannelsResponse) Reset() { *m = PendingChannelsResponse{} } func (m *PendingChannelsResponse) String() string { return proto.CompactTextString(m) } func (*PendingChannelsResponse) ProtoMessage() {} -func (*PendingChannelsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{53} } +func (*PendingChannelsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{56} } func (m *PendingChannelsResponse) GetTotalLimboBalance() int64 { if m != nil { @@ -2618,7 +2720,7 @@ func (m *PendingChannelsResponse_PendingChannel) Reset() { func (m *PendingChannelsResponse_PendingChannel) String() string { return proto.CompactTextString(m) } func (*PendingChannelsResponse_PendingChannel) ProtoMessage() {} func (*PendingChannelsResponse_PendingChannel) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{53, 0} + return fileDescriptor0, []int{56, 0} } func (m *PendingChannelsResponse_PendingChannel) GetRemoteNodePub() string { @@ -2685,7 +2787,7 @@ func (m *PendingChannelsResponse_PendingOpenChannel) String() string { } func (*PendingChannelsResponse_PendingOpenChannel) ProtoMessage() {} func (*PendingChannelsResponse_PendingOpenChannel) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{53, 1} + return fileDescriptor0, []int{56, 1} } func (m *PendingChannelsResponse_PendingOpenChannel) GetChannel() *PendingChannelsResponse_PendingChannel { @@ -2738,7 +2840,7 @@ func (m *PendingChannelsResponse_WaitingCloseChannel) String() string { } func (*PendingChannelsResponse_WaitingCloseChannel) ProtoMessage() {} func (*PendingChannelsResponse_WaitingCloseChannel) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{53, 2} + return fileDescriptor0, []int{56, 2} } func (m *PendingChannelsResponse_WaitingCloseChannel) GetChannel() *PendingChannelsResponse_PendingChannel { @@ -2766,7 +2868,7 @@ func (m *PendingChannelsResponse_ClosedChannel) Reset() { *m = PendingCh func (m *PendingChannelsResponse_ClosedChannel) String() string { return proto.CompactTextString(m) } func (*PendingChannelsResponse_ClosedChannel) ProtoMessage() {} func (*PendingChannelsResponse_ClosedChannel) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{53, 3} + return fileDescriptor0, []int{56, 3} } func (m *PendingChannelsResponse_ClosedChannel) GetChannel() *PendingChannelsResponse_PendingChannel { @@ -2810,7 +2912,7 @@ func (m *PendingChannelsResponse_ForceClosedChannel) String() string { } func (*PendingChannelsResponse_ForceClosedChannel) ProtoMessage() {} func (*PendingChannelsResponse_ForceClosedChannel) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{53, 4} + return fileDescriptor0, []int{56, 4} } func (m *PendingChannelsResponse_ForceClosedChannel) GetChannel() *PendingChannelsResponse_PendingChannel { @@ -2868,7 +2970,7 @@ type WalletBalanceRequest struct { func (m *WalletBalanceRequest) Reset() { *m = WalletBalanceRequest{} } func (m *WalletBalanceRequest) String() string { return proto.CompactTextString(m) } func (*WalletBalanceRequest) ProtoMessage() {} -func (*WalletBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{54} } +func (*WalletBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{57} } type WalletBalanceResponse struct { // / The balance of the wallet @@ -2882,7 +2984,7 @@ type WalletBalanceResponse struct { func (m *WalletBalanceResponse) Reset() { *m = WalletBalanceResponse{} } func (m *WalletBalanceResponse) String() string { return proto.CompactTextString(m) } func (*WalletBalanceResponse) ProtoMessage() {} -func (*WalletBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{55} } +func (*WalletBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{58} } func (m *WalletBalanceResponse) GetTotalBalance() int64 { if m != nil { @@ -2911,7 +3013,7 @@ type ChannelBalanceRequest struct { func (m *ChannelBalanceRequest) Reset() { *m = ChannelBalanceRequest{} } func (m *ChannelBalanceRequest) String() string { return proto.CompactTextString(m) } func (*ChannelBalanceRequest) ProtoMessage() {} -func (*ChannelBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{56} } +func (*ChannelBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{59} } type ChannelBalanceResponse struct { // / Sum of channels balances denominated in satoshis @@ -2923,7 +3025,7 @@ type ChannelBalanceResponse struct { func (m *ChannelBalanceResponse) Reset() { *m = ChannelBalanceResponse{} } func (m *ChannelBalanceResponse) String() string { return proto.CompactTextString(m) } func (*ChannelBalanceResponse) ProtoMessage() {} -func (*ChannelBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{57} } +func (*ChannelBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{60} } func (m *ChannelBalanceResponse) GetBalance() int64 { if m != nil { @@ -2959,7 +3061,7 @@ type QueryRoutesRequest struct { func (m *QueryRoutesRequest) Reset() { *m = QueryRoutesRequest{} } func (m *QueryRoutesRequest) String() string { return proto.CompactTextString(m) } func (*QueryRoutesRequest) ProtoMessage() {} -func (*QueryRoutesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{58} } +func (*QueryRoutesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{61} } func (m *QueryRoutesRequest) GetPubKey() string { if m != nil { @@ -3003,7 +3105,7 @@ type QueryRoutesResponse struct { func (m *QueryRoutesResponse) Reset() { *m = QueryRoutesResponse{} } func (m *QueryRoutesResponse) String() string { return proto.CompactTextString(m) } func (*QueryRoutesResponse) ProtoMessage() {} -func (*QueryRoutesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{59} } +func (*QueryRoutesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{62} } func (m *QueryRoutesResponse) GetRoutes() []*Route { if m != nil { @@ -3033,7 +3135,7 @@ type Hop struct { func (m *Hop) Reset() { *m = Hop{} } func (m *Hop) String() string { return proto.CompactTextString(m) } func (*Hop) ProtoMessage() {} -func (*Hop) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{60} } +func (*Hop) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{63} } func (m *Hop) GetChanId() uint64 { if m != nil { @@ -3130,7 +3232,7 @@ type Route struct { func (m *Route) Reset() { *m = Route{} } func (m *Route) String() string { return proto.CompactTextString(m) } func (*Route) ProtoMessage() {} -func (*Route) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{61} } +func (*Route) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{64} } func (m *Route) GetTotalTimeLock() uint32 { if m != nil { @@ -3182,7 +3284,7 @@ type NodeInfoRequest struct { func (m *NodeInfoRequest) Reset() { *m = NodeInfoRequest{} } func (m *NodeInfoRequest) String() string { return proto.CompactTextString(m) } func (*NodeInfoRequest) ProtoMessage() {} -func (*NodeInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{62} } +func (*NodeInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{65} } func (m *NodeInfoRequest) GetPubKey() string { if m != nil { @@ -3205,7 +3307,7 @@ type NodeInfo struct { func (m *NodeInfo) Reset() { *m = NodeInfo{} } func (m *NodeInfo) String() string { return proto.CompactTextString(m) } func (*NodeInfo) ProtoMessage() {} -func (*NodeInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{63} } +func (*NodeInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{66} } func (m *NodeInfo) GetNode() *LightningNode { if m != nil { @@ -3244,7 +3346,7 @@ type LightningNode struct { func (m *LightningNode) Reset() { *m = LightningNode{} } func (m *LightningNode) String() string { return proto.CompactTextString(m) } func (*LightningNode) ProtoMessage() {} -func (*LightningNode) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{64} } +func (*LightningNode) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{67} } func (m *LightningNode) GetLastUpdate() uint32 { if m != nil { @@ -3289,7 +3391,7 @@ type NodeAddress struct { func (m *NodeAddress) Reset() { *m = NodeAddress{} } func (m *NodeAddress) String() string { return proto.CompactTextString(m) } func (*NodeAddress) ProtoMessage() {} -func (*NodeAddress) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{65} } +func (*NodeAddress) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{68} } func (m *NodeAddress) GetNetwork() string { if m != nil { @@ -3316,7 +3418,7 @@ type RoutingPolicy struct { func (m *RoutingPolicy) Reset() { *m = RoutingPolicy{} } func (m *RoutingPolicy) String() string { return proto.CompactTextString(m) } func (*RoutingPolicy) ProtoMessage() {} -func (*RoutingPolicy) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{66} } +func (*RoutingPolicy) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{69} } func (m *RoutingPolicy) GetTimeLockDelta() uint32 { if m != nil { @@ -3377,7 +3479,7 @@ type ChannelEdge struct { func (m *ChannelEdge) Reset() { *m = ChannelEdge{} } func (m *ChannelEdge) String() string { return proto.CompactTextString(m) } func (*ChannelEdge) ProtoMessage() {} -func (*ChannelEdge) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{67} } +func (*ChannelEdge) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{70} } func (m *ChannelEdge) GetChannelId() uint64 { if m != nil { @@ -3446,7 +3548,7 @@ type ChannelGraphRequest struct { func (m *ChannelGraphRequest) Reset() { *m = ChannelGraphRequest{} } func (m *ChannelGraphRequest) String() string { return proto.CompactTextString(m) } func (*ChannelGraphRequest) ProtoMessage() {} -func (*ChannelGraphRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{68} } +func (*ChannelGraphRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{71} } func (m *ChannelGraphRequest) GetIncludeUnannounced() bool { if m != nil { @@ -3466,7 +3568,7 @@ type ChannelGraph struct { func (m *ChannelGraph) Reset() { *m = ChannelGraph{} } func (m *ChannelGraph) String() string { return proto.CompactTextString(m) } func (*ChannelGraph) ProtoMessage() {} -func (*ChannelGraph) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{69} } +func (*ChannelGraph) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{72} } func (m *ChannelGraph) GetNodes() []*LightningNode { if m != nil { @@ -3493,7 +3595,7 @@ type ChanInfoRequest struct { func (m *ChanInfoRequest) Reset() { *m = ChanInfoRequest{} } func (m *ChanInfoRequest) String() string { return proto.CompactTextString(m) } func (*ChanInfoRequest) ProtoMessage() {} -func (*ChanInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{70} } +func (*ChanInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{73} } func (m *ChanInfoRequest) GetChanId() uint64 { if m != nil { @@ -3508,7 +3610,7 @@ type NetworkInfoRequest struct { func (m *NetworkInfoRequest) Reset() { *m = NetworkInfoRequest{} } func (m *NetworkInfoRequest) String() string { return proto.CompactTextString(m) } func (*NetworkInfoRequest) ProtoMessage() {} -func (*NetworkInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{71} } +func (*NetworkInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{74} } type NetworkInfo struct { GraphDiameter uint32 `protobuf:"varint,1,opt,name=graph_diameter" json:"graph_diameter,omitempty"` @@ -3525,7 +3627,7 @@ type NetworkInfo struct { func (m *NetworkInfo) Reset() { *m = NetworkInfo{} } func (m *NetworkInfo) String() string { return proto.CompactTextString(m) } func (*NetworkInfo) ProtoMessage() {} -func (*NetworkInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{72} } +func (*NetworkInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{75} } func (m *NetworkInfo) GetGraphDiameter() uint32 { if m != nil { @@ -3596,7 +3698,7 @@ type StopRequest struct { func (m *StopRequest) Reset() { *m = StopRequest{} } func (m *StopRequest) String() string { return proto.CompactTextString(m) } func (*StopRequest) ProtoMessage() {} -func (*StopRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{73} } +func (*StopRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{76} } type StopResponse struct { } @@ -3604,7 +3706,7 @@ type StopResponse struct { func (m *StopResponse) Reset() { *m = StopResponse{} } func (m *StopResponse) String() string { return proto.CompactTextString(m) } func (*StopResponse) ProtoMessage() {} -func (*StopResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{74} } +func (*StopResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{77} } type GraphTopologySubscription struct { } @@ -3612,7 +3714,7 @@ type GraphTopologySubscription struct { func (m *GraphTopologySubscription) Reset() { *m = GraphTopologySubscription{} } func (m *GraphTopologySubscription) String() string { return proto.CompactTextString(m) } func (*GraphTopologySubscription) ProtoMessage() {} -func (*GraphTopologySubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{75} } +func (*GraphTopologySubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{78} } type GraphTopologyUpdate struct { NodeUpdates []*NodeUpdate `protobuf:"bytes,1,rep,name=node_updates,json=nodeUpdates" json:"node_updates,omitempty"` @@ -3623,7 +3725,7 @@ type GraphTopologyUpdate struct { func (m *GraphTopologyUpdate) Reset() { *m = GraphTopologyUpdate{} } func (m *GraphTopologyUpdate) String() string { return proto.CompactTextString(m) } func (*GraphTopologyUpdate) ProtoMessage() {} -func (*GraphTopologyUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{76} } +func (*GraphTopologyUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{79} } func (m *GraphTopologyUpdate) GetNodeUpdates() []*NodeUpdate { if m != nil { @@ -3656,7 +3758,7 @@ type NodeUpdate struct { func (m *NodeUpdate) Reset() { *m = NodeUpdate{} } func (m *NodeUpdate) String() string { return proto.CompactTextString(m) } func (*NodeUpdate) ProtoMessage() {} -func (*NodeUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{77} } +func (*NodeUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{80} } func (m *NodeUpdate) GetAddresses() []string { if m != nil { @@ -3702,7 +3804,7 @@ type ChannelEdgeUpdate struct { func (m *ChannelEdgeUpdate) Reset() { *m = ChannelEdgeUpdate{} } func (m *ChannelEdgeUpdate) String() string { return proto.CompactTextString(m) } func (*ChannelEdgeUpdate) ProtoMessage() {} -func (*ChannelEdgeUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{78} } +func (*ChannelEdgeUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{81} } func (m *ChannelEdgeUpdate) GetChanId() uint64 { if m != nil { @@ -3760,7 +3862,7 @@ type ClosedChannelUpdate struct { func (m *ClosedChannelUpdate) Reset() { *m = ClosedChannelUpdate{} } func (m *ClosedChannelUpdate) String() string { return proto.CompactTextString(m) } func (*ClosedChannelUpdate) ProtoMessage() {} -func (*ClosedChannelUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{79} } +func (*ClosedChannelUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{82} } func (m *ClosedChannelUpdate) GetChanId() uint64 { if m != nil { @@ -3808,7 +3910,7 @@ type HopHint struct { func (m *HopHint) Reset() { *m = HopHint{} } func (m *HopHint) String() string { return proto.CompactTextString(m) } func (*HopHint) ProtoMessage() {} -func (*HopHint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{80} } +func (*HopHint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{83} } func (m *HopHint) GetNodeId() string { if m != nil { @@ -3855,7 +3957,7 @@ type RouteHint struct { func (m *RouteHint) Reset() { *m = RouteHint{} } func (m *RouteHint) String() string { return proto.CompactTextString(m) } func (*RouteHint) ProtoMessage() {} -func (*RouteHint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{81} } +func (*RouteHint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{84} } func (m *RouteHint) GetHopHints() []*HopHint { if m != nil { @@ -3944,7 +4046,7 @@ type Invoice struct { func (m *Invoice) Reset() { *m = Invoice{} } func (m *Invoice) String() string { return proto.CompactTextString(m) } func (*Invoice) ProtoMessage() {} -func (*Invoice) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{82} } +func (*Invoice) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{85} } func (m *Invoice) GetMemo() string { if m != nil { @@ -4104,7 +4206,7 @@ type AddInvoiceResponse struct { func (m *AddInvoiceResponse) Reset() { *m = AddInvoiceResponse{} } func (m *AddInvoiceResponse) String() string { return proto.CompactTextString(m) } func (*AddInvoiceResponse) ProtoMessage() {} -func (*AddInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{83} } +func (*AddInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{86} } func (m *AddInvoiceResponse) GetRHash() []byte { if m != nil { @@ -4139,7 +4241,7 @@ type PaymentHash struct { func (m *PaymentHash) Reset() { *m = PaymentHash{} } func (m *PaymentHash) String() string { return proto.CompactTextString(m) } func (*PaymentHash) ProtoMessage() {} -func (*PaymentHash) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{84} } +func (*PaymentHash) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{87} } func (m *PaymentHash) GetRHashStr() string { if m != nil { @@ -4173,7 +4275,7 @@ type ListInvoiceRequest struct { func (m *ListInvoiceRequest) Reset() { *m = ListInvoiceRequest{} } func (m *ListInvoiceRequest) String() string { return proto.CompactTextString(m) } func (*ListInvoiceRequest) ProtoMessage() {} -func (*ListInvoiceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{85} } +func (*ListInvoiceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{88} } func (m *ListInvoiceRequest) GetPendingOnly() bool { if m != nil { @@ -4221,7 +4323,7 @@ type ListInvoiceResponse struct { func (m *ListInvoiceResponse) Reset() { *m = ListInvoiceResponse{} } func (m *ListInvoiceResponse) String() string { return proto.CompactTextString(m) } func (*ListInvoiceResponse) ProtoMessage() {} -func (*ListInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{86} } +func (*ListInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{89} } func (m *ListInvoiceResponse) GetInvoices() []*Invoice { if m != nil { @@ -4262,7 +4364,7 @@ type InvoiceSubscription struct { func (m *InvoiceSubscription) Reset() { *m = InvoiceSubscription{} } func (m *InvoiceSubscription) String() string { return proto.CompactTextString(m) } func (*InvoiceSubscription) ProtoMessage() {} -func (*InvoiceSubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{87} } +func (*InvoiceSubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{90} } func (m *InvoiceSubscription) GetAddIndex() uint64 { if m != nil { @@ -4300,7 +4402,7 @@ type Payment struct { func (m *Payment) Reset() { *m = Payment{} } func (m *Payment) String() string { return proto.CompactTextString(m) } func (*Payment) ProtoMessage() {} -func (*Payment) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{88} } +func (*Payment) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{91} } func (m *Payment) GetPaymentHash() string { if m != nil { @@ -4364,7 +4466,7 @@ type ListPaymentsRequest struct { func (m *ListPaymentsRequest) Reset() { *m = ListPaymentsRequest{} } func (m *ListPaymentsRequest) String() string { return proto.CompactTextString(m) } func (*ListPaymentsRequest) ProtoMessage() {} -func (*ListPaymentsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{89} } +func (*ListPaymentsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{92} } type ListPaymentsResponse struct { // / The list of payments @@ -4374,7 +4476,7 @@ type ListPaymentsResponse struct { func (m *ListPaymentsResponse) Reset() { *m = ListPaymentsResponse{} } func (m *ListPaymentsResponse) String() string { return proto.CompactTextString(m) } func (*ListPaymentsResponse) ProtoMessage() {} -func (*ListPaymentsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{90} } +func (*ListPaymentsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{93} } func (m *ListPaymentsResponse) GetPayments() []*Payment { if m != nil { @@ -4389,7 +4491,7 @@ type DeleteAllPaymentsRequest struct { func (m *DeleteAllPaymentsRequest) Reset() { *m = DeleteAllPaymentsRequest{} } func (m *DeleteAllPaymentsRequest) String() string { return proto.CompactTextString(m) } func (*DeleteAllPaymentsRequest) ProtoMessage() {} -func (*DeleteAllPaymentsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{91} } +func (*DeleteAllPaymentsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{94} } type DeleteAllPaymentsResponse struct { } @@ -4397,7 +4499,7 @@ type DeleteAllPaymentsResponse struct { func (m *DeleteAllPaymentsResponse) Reset() { *m = DeleteAllPaymentsResponse{} } func (m *DeleteAllPaymentsResponse) String() string { return proto.CompactTextString(m) } func (*DeleteAllPaymentsResponse) ProtoMessage() {} -func (*DeleteAllPaymentsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{92} } +func (*DeleteAllPaymentsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{95} } type AbandonChannelRequest struct { ChannelPoint *ChannelPoint `protobuf:"bytes,1,opt,name=channel_point,json=channelPoint" json:"channel_point,omitempty"` @@ -4406,7 +4508,7 @@ type AbandonChannelRequest struct { func (m *AbandonChannelRequest) Reset() { *m = AbandonChannelRequest{} } func (m *AbandonChannelRequest) String() string { return proto.CompactTextString(m) } func (*AbandonChannelRequest) ProtoMessage() {} -func (*AbandonChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{93} } +func (*AbandonChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{96} } func (m *AbandonChannelRequest) GetChannelPoint() *ChannelPoint { if m != nil { @@ -4421,7 +4523,7 @@ type AbandonChannelResponse struct { func (m *AbandonChannelResponse) Reset() { *m = AbandonChannelResponse{} } func (m *AbandonChannelResponse) String() string { return proto.CompactTextString(m) } func (*AbandonChannelResponse) ProtoMessage() {} -func (*AbandonChannelResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{94} } +func (*AbandonChannelResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{97} } type DebugLevelRequest struct { Show bool `protobuf:"varint,1,opt,name=show" json:"show,omitempty"` @@ -4431,7 +4533,7 @@ type DebugLevelRequest struct { func (m *DebugLevelRequest) Reset() { *m = DebugLevelRequest{} } func (m *DebugLevelRequest) String() string { return proto.CompactTextString(m) } func (*DebugLevelRequest) ProtoMessage() {} -func (*DebugLevelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{95} } +func (*DebugLevelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{98} } func (m *DebugLevelRequest) GetShow() bool { if m != nil { @@ -4454,7 +4556,7 @@ type DebugLevelResponse struct { func (m *DebugLevelResponse) Reset() { *m = DebugLevelResponse{} } func (m *DebugLevelResponse) String() string { return proto.CompactTextString(m) } func (*DebugLevelResponse) ProtoMessage() {} -func (*DebugLevelResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{96} } +func (*DebugLevelResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{99} } func (m *DebugLevelResponse) GetSubSystems() string { if m != nil { @@ -4471,7 +4573,7 @@ type PayReqString struct { func (m *PayReqString) Reset() { *m = PayReqString{} } func (m *PayReqString) String() string { return proto.CompactTextString(m) } func (*PayReqString) ProtoMessage() {} -func (*PayReqString) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{97} } +func (*PayReqString) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{100} } func (m *PayReqString) GetPayReq() string { if m != nil { @@ -4496,7 +4598,7 @@ type PayReq struct { func (m *PayReq) Reset() { *m = PayReq{} } func (m *PayReq) String() string { return proto.CompactTextString(m) } func (*PayReq) ProtoMessage() {} -func (*PayReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{98} } +func (*PayReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{101} } func (m *PayReq) GetDestination() string { if m != nil { @@ -4574,7 +4676,7 @@ type FeeReportRequest struct { func (m *FeeReportRequest) Reset() { *m = FeeReportRequest{} } func (m *FeeReportRequest) String() string { return proto.CompactTextString(m) } func (*FeeReportRequest) ProtoMessage() {} -func (*FeeReportRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{99} } +func (*FeeReportRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{102} } type ChannelFeeReport struct { // / The channel that this fee report belongs to. @@ -4590,7 +4692,7 @@ type ChannelFeeReport struct { func (m *ChannelFeeReport) Reset() { *m = ChannelFeeReport{} } func (m *ChannelFeeReport) String() string { return proto.CompactTextString(m) } func (*ChannelFeeReport) ProtoMessage() {} -func (*ChannelFeeReport) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{100} } +func (*ChannelFeeReport) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{103} } func (m *ChannelFeeReport) GetChanPoint() string { if m != nil { @@ -4634,7 +4736,7 @@ type FeeReportResponse struct { func (m *FeeReportResponse) Reset() { *m = FeeReportResponse{} } func (m *FeeReportResponse) String() string { return proto.CompactTextString(m) } func (*FeeReportResponse) ProtoMessage() {} -func (*FeeReportResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{101} } +func (*FeeReportResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{104} } func (m *FeeReportResponse) GetChannelFees() []*ChannelFeeReport { if m != nil { @@ -4680,11 +4782,9 @@ type PolicyUpdateRequest struct { func (m *PolicyUpdateRequest) Reset() { *m = PolicyUpdateRequest{} } func (m *PolicyUpdateRequest) String() string { return proto.CompactTextString(m) } func (*PolicyUpdateRequest) ProtoMessage() {} -func (*PolicyUpdateRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{102} } +func (*PolicyUpdateRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{105} } -type isPolicyUpdateRequest_Scope interface { - isPolicyUpdateRequest_Scope() -} +type isPolicyUpdateRequest_Scope interface{ isPolicyUpdateRequest_Scope() } type PolicyUpdateRequest_Global struct { Global bool `protobuf:"varint,1,opt,name=global,oneof"` @@ -4817,7 +4917,7 @@ type PolicyUpdateResponse struct { func (m *PolicyUpdateResponse) Reset() { *m = PolicyUpdateResponse{} } func (m *PolicyUpdateResponse) String() string { return proto.CompactTextString(m) } func (*PolicyUpdateResponse) ProtoMessage() {} -func (*PolicyUpdateResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{103} } +func (*PolicyUpdateResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{106} } type ForwardingHistoryRequest struct { // / Start time is the starting point of the forwarding history request. All records beyond this point will be included, respecting the end time, and the index offset. @@ -4833,7 +4933,7 @@ type ForwardingHistoryRequest struct { func (m *ForwardingHistoryRequest) Reset() { *m = ForwardingHistoryRequest{} } func (m *ForwardingHistoryRequest) String() string { return proto.CompactTextString(m) } func (*ForwardingHistoryRequest) ProtoMessage() {} -func (*ForwardingHistoryRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{104} } +func (*ForwardingHistoryRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{107} } func (m *ForwardingHistoryRequest) GetStartTime() uint64 { if m != nil { @@ -4881,7 +4981,7 @@ type ForwardingEvent struct { func (m *ForwardingEvent) Reset() { *m = ForwardingEvent{} } func (m *ForwardingEvent) String() string { return proto.CompactTextString(m) } func (*ForwardingEvent) ProtoMessage() {} -func (*ForwardingEvent) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{105} } +func (*ForwardingEvent) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{108} } func (m *ForwardingEvent) GetTimestamp() uint64 { if m != nil { @@ -4935,7 +5035,7 @@ type ForwardingHistoryResponse struct { func (m *ForwardingHistoryResponse) Reset() { *m = ForwardingHistoryResponse{} } func (m *ForwardingHistoryResponse) String() string { return proto.CompactTextString(m) } func (*ForwardingHistoryResponse) ProtoMessage() {} -func (*ForwardingHistoryResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{106} } +func (*ForwardingHistoryResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{109} } func (m *ForwardingHistoryResponse) GetForwardingEvents() []*ForwardingEvent { if m != nil { @@ -4960,6 +5060,7 @@ func init() { proto.RegisterType((*UnlockWalletResponse)(nil), "lnrpc.UnlockWalletResponse") proto.RegisterType((*ChangePasswordRequest)(nil), "lnrpc.ChangePasswordRequest") proto.RegisterType((*ChangePasswordResponse)(nil), "lnrpc.ChangePasswordResponse") + proto.RegisterType((*Utxo)(nil), "lnrpc.Utxo") proto.RegisterType((*Transaction)(nil), "lnrpc.Transaction") proto.RegisterType((*GetTransactionsRequest)(nil), "lnrpc.GetTransactionsRequest") proto.RegisterType((*TransactionDetails)(nil), "lnrpc.TransactionDetails") @@ -4973,6 +5074,8 @@ func init() { proto.RegisterType((*SendManyResponse)(nil), "lnrpc.SendManyResponse") proto.RegisterType((*SendCoinsRequest)(nil), "lnrpc.SendCoinsRequest") proto.RegisterType((*SendCoinsResponse)(nil), "lnrpc.SendCoinsResponse") + proto.RegisterType((*ListUnspentRequest)(nil), "lnrpc.ListUnspentRequest") + proto.RegisterType((*ListUnspentResponse)(nil), "lnrpc.ListUnspentResponse") proto.RegisterType((*NewAddressRequest)(nil), "lnrpc.NewAddressRequest") proto.RegisterType((*NewAddressResponse)(nil), "lnrpc.NewAddressResponse") proto.RegisterType((*SignMessageRequest)(nil), "lnrpc.SignMessageRequest") @@ -5064,7 +5167,7 @@ func init() { proto.RegisterType((*ForwardingHistoryRequest)(nil), "lnrpc.ForwardingHistoryRequest") proto.RegisterType((*ForwardingEvent)(nil), "lnrpc.ForwardingEvent") proto.RegisterType((*ForwardingHistoryResponse)(nil), "lnrpc.ForwardingHistoryResponse") - proto.RegisterEnum("lnrpc.NewAddressRequest_AddressType", NewAddressRequest_AddressType_name, NewAddressRequest_AddressType_value) + proto.RegisterEnum("lnrpc.AddressType", AddressType_name, AddressType_value) proto.RegisterEnum("lnrpc.ChannelCloseSummary_ClosureType", ChannelCloseSummary_ClosureType_name, ChannelCloseSummary_ClosureType_value) } @@ -5318,6 +5421,10 @@ type LightningClient interface { // consult its fee model to determine a fee for the default confirmation // target. SendCoins(ctx context.Context, in *SendCoinsRequest, opts ...grpc.CallOption) (*SendCoinsResponse, error) + // * lncli: `listunspent` + // ListUnspent returns a list of all utxos spendable by the wallet with a + // number of confirmations between the specified minimum and maximum. + ListUnspent(ctx context.Context, in *ListUnspentRequest, opts ...grpc.CallOption) (*ListUnspentResponse, error) // * // SubscribeTransactions creates a uni-directional stream from the server to // the client in which any newly discovered transactions relevant to the @@ -5581,6 +5688,15 @@ func (c *lightningClient) SendCoins(ctx context.Context, in *SendCoinsRequest, o return out, nil } +func (c *lightningClient) ListUnspent(ctx context.Context, in *ListUnspentRequest, opts ...grpc.CallOption) (*ListUnspentResponse, error) { + out := new(ListUnspentResponse) + err := grpc.Invoke(ctx, "/lnrpc.Lightning/ListUnspent", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *lightningClient) SubscribeTransactions(ctx context.Context, in *GetTransactionsRequest, opts ...grpc.CallOption) (Lightning_SubscribeTransactionsClient, error) { stream, err := grpc.NewClientStream(ctx, &_Lightning_serviceDesc.Streams[0], c.cc, "/lnrpc.Lightning/SubscribeTransactions", opts...) if err != nil { @@ -6105,6 +6221,10 @@ type LightningServer interface { // consult its fee model to determine a fee for the default confirmation // target. SendCoins(context.Context, *SendCoinsRequest) (*SendCoinsResponse, error) + // * lncli: `listunspent` + // ListUnspent returns a list of all utxos spendable by the wallet with a + // number of confirmations between the specified minimum and maximum. + ListUnspent(context.Context, *ListUnspentRequest) (*ListUnspentResponse, error) // * // SubscribeTransactions creates a uni-directional stream from the server to // the client in which any newly discovered transactions relevant to the @@ -6400,6 +6520,24 @@ func _Lightning_SendCoins_Handler(srv interface{}, ctx context.Context, dec func return interceptor(ctx, in, info, handler) } +func _Lightning_ListUnspent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListUnspentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LightningServer).ListUnspent(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/lnrpc.Lightning/ListUnspent", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LightningServer).ListUnspent(ctx, req.(*ListUnspentRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Lightning_SubscribeTransactions_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(GetTransactionsRequest) if err := stream.RecvMsg(m); err != nil { @@ -7135,6 +7273,10 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{ MethodName: "SendCoins", Handler: _Lightning_SendCoins_Handler, }, + { + MethodName: "ListUnspent", + Handler: _Lightning_ListUnspent_Handler, + }, { MethodName: "SendMany", Handler: _Lightning_SendMany_Handler, @@ -7305,411 +7447,419 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("rpc.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 6486 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7c, 0x5d, 0x6c, 0x24, 0xd9, - 0x55, 0xff, 0x54, 0xbb, 0xdb, 0xee, 0x3e, 0xdd, 0xb6, 0xdb, 0xd7, 0x1f, 0xd3, 0xd3, 0x3b, 0x3b, - 0x3b, 0x5b, 0x59, 0xed, 0x4c, 0xfc, 0xdf, 0xff, 0xcc, 0xac, 0x93, 0xac, 0x36, 0xbb, 0xff, 0x7f, - 0x82, 0xc7, 0xf6, 0x8c, 0x87, 0x78, 0x67, 0x9c, 0xf2, 0x6c, 0x96, 0x24, 0xa0, 0x4e, 0xb9, 0xfb, - 0xba, 0x5d, 0x99, 0xee, 0xaa, 0x4e, 0x55, 0xb5, 0xbd, 0x9d, 0x65, 0x25, 0xbe, 0x04, 0x12, 0x22, - 0x8a, 0x10, 0x42, 0x28, 0x48, 0x08, 0x29, 0xf0, 0x90, 0x3c, 0xf2, 0x40, 0x84, 0x04, 0xbc, 0xf1, - 0x02, 0x12, 0xe2, 0x21, 0x4f, 0x08, 0x89, 0x17, 0x78, 0x01, 0xde, 0x90, 0x78, 0x04, 0xa1, 0x73, - 0xee, 0x47, 0xdd, 0x5b, 0x55, 0x1e, 0x4f, 0x3e, 0xe0, 0xad, 0xef, 0xef, 0x9e, 0xba, 0x9f, 0xe7, - 0xeb, 0x9e, 0x7b, 0x6e, 0x43, 0x23, 0x9e, 0xf4, 0xef, 0x4c, 0xe2, 0x28, 0x8d, 0x58, 0x6d, 0x14, - 0xc6, 0x93, 0x7e, 0xf7, 0xfa, 0x30, 0x8a, 0x86, 0x23, 0x7e, 0xd7, 0x9f, 0x04, 0x77, 0xfd, 0x30, - 0x8c, 0x52, 0x3f, 0x0d, 0xa2, 0x30, 0x11, 0x44, 0xee, 0xd7, 0x60, 0xe9, 0x21, 0x0f, 0x8f, 0x38, - 0x1f, 0x78, 0xfc, 0x1b, 0x53, 0x9e, 0xa4, 0xec, 0xff, 0xc0, 0x8a, 0xcf, 0xbf, 0xc9, 0xf9, 0xa0, - 0x37, 0xf1, 0x93, 0x64, 0x72, 0x1a, 0xfb, 0x09, 0xef, 0x38, 0x37, 0x9d, 0xdb, 0x2d, 0xaf, 0x2d, - 0x2a, 0x0e, 0x35, 0xce, 0x5e, 0x85, 0x56, 0x82, 0xa4, 0x3c, 0x4c, 0xe3, 0x68, 0x32, 0xeb, 0x54, - 0x88, 0xae, 0x89, 0xd8, 0x9e, 0x80, 0xdc, 0x11, 0x2c, 0xeb, 0x1e, 0x92, 0x49, 0x14, 0x26, 0x9c, - 0xdd, 0x83, 0xb5, 0x7e, 0x30, 0x39, 0xe5, 0x71, 0x8f, 0x3e, 0x1e, 0x87, 0x7c, 0x1c, 0x85, 0x41, - 0xbf, 0xe3, 0xdc, 0x9c, 0xbb, 0xdd, 0xf0, 0x98, 0xa8, 0xc3, 0x2f, 0xde, 0x93, 0x35, 0xec, 0x16, - 0x2c, 0xf3, 0x50, 0xe0, 0x7c, 0x40, 0x5f, 0xc9, 0xae, 0x96, 0x32, 0x18, 0x3f, 0x70, 0xff, 0xca, - 0x81, 0x95, 0x47, 0x61, 0x90, 0x7e, 0xe0, 0x8f, 0x46, 0x3c, 0x55, 0x73, 0xba, 0x05, 0xcb, 0xe7, - 0x04, 0xd0, 0x9c, 0xce, 0xa3, 0x78, 0x20, 0x67, 0xb4, 0x24, 0xe0, 0x43, 0x89, 0x5e, 0x38, 0xb2, - 0xca, 0x85, 0x23, 0x2b, 0x5d, 0xae, 0xb9, 0x0b, 0x96, 0xeb, 0x16, 0x2c, 0xc7, 0xbc, 0x1f, 0x9d, - 0xf1, 0x78, 0xd6, 0x3b, 0x0f, 0xc2, 0x41, 0x74, 0xde, 0xa9, 0xde, 0x74, 0x6e, 0xd7, 0xbc, 0x25, - 0x05, 0x7f, 0x40, 0xa8, 0xbb, 0x06, 0xcc, 0x9c, 0x85, 0x58, 0x37, 0x77, 0x08, 0xab, 0xef, 0x87, - 0xa3, 0xa8, 0xff, 0xec, 0xc7, 0x9c, 0x5d, 0x49, 0xf7, 0x95, 0xd2, 0xee, 0x37, 0x60, 0xcd, 0xee, - 0x48, 0x0e, 0x80, 0xc3, 0xfa, 0xce, 0xa9, 0x1f, 0x0e, 0xb9, 0x6a, 0x52, 0x0d, 0xe1, 0x93, 0xd0, - 0xee, 0x4f, 0xe3, 0x98, 0x87, 0x85, 0x31, 0x2c, 0x4b, 0x5c, 0x0f, 0xe2, 0x55, 0x68, 0x85, 0xfc, - 0x3c, 0x23, 0x93, 0x2c, 0x13, 0xf2, 0x73, 0x45, 0xe2, 0x76, 0x60, 0x23, 0xdf, 0x8d, 0x1c, 0xc0, - 0x77, 0x2a, 0xd0, 0x7c, 0x1a, 0xfb, 0x61, 0xe2, 0xf7, 0x91, 0x8b, 0x59, 0x07, 0x16, 0xd2, 0x0f, - 0x7b, 0xa7, 0x7e, 0x72, 0x4a, 0xdd, 0x35, 0x3c, 0x55, 0x64, 0x1b, 0x30, 0xef, 0x8f, 0xa3, 0x69, - 0x98, 0x52, 0x07, 0x73, 0x9e, 0x2c, 0xb1, 0x37, 0x60, 0x25, 0x9c, 0x8e, 0x7b, 0xfd, 0x28, 0x3c, - 0x09, 0xe2, 0xb1, 0x90, 0x05, 0xda, 0xaf, 0x9a, 0x57, 0xac, 0x60, 0x37, 0x00, 0x8e, 0x71, 0x1d, - 0x44, 0x17, 0x55, 0xea, 0xc2, 0x40, 0x98, 0x0b, 0x2d, 0x59, 0xe2, 0xc1, 0xf0, 0x34, 0xed, 0xd4, - 0xa8, 0x21, 0x0b, 0xc3, 0x36, 0xd2, 0x60, 0xcc, 0x7b, 0x49, 0xea, 0x8f, 0x27, 0x9d, 0x79, 0x1a, - 0x8d, 0x81, 0x50, 0x7d, 0x94, 0xfa, 0xa3, 0xde, 0x09, 0xe7, 0x49, 0x67, 0x41, 0xd6, 0x6b, 0x84, - 0xbd, 0x0e, 0x4b, 0x03, 0x9e, 0xa4, 0x3d, 0x7f, 0x30, 0x88, 0x79, 0x92, 0xf0, 0xa4, 0x53, 0x27, - 0x6e, 0xcc, 0xa1, 0xb8, 0x6a, 0x0f, 0x79, 0x6a, 0xac, 0x4e, 0x22, 0x77, 0xc7, 0x3d, 0x00, 0x66, - 0xc0, 0xbb, 0x3c, 0xf5, 0x83, 0x51, 0xc2, 0xde, 0x82, 0x56, 0x6a, 0x10, 0x93, 0xf4, 0x35, 0xb7, - 0xd8, 0x1d, 0x52, 0x1b, 0x77, 0x8c, 0x0f, 0x3c, 0x8b, 0xce, 0x7d, 0x08, 0xf5, 0x07, 0x9c, 0x1f, - 0x04, 0xe3, 0x20, 0x65, 0x1b, 0x50, 0x3b, 0x09, 0x3e, 0xe4, 0x62, 0xb3, 0xe7, 0xf6, 0xaf, 0x78, - 0xa2, 0xc8, 0xba, 0xb0, 0x30, 0xe1, 0x71, 0x9f, 0xab, 0xe5, 0xdf, 0xbf, 0xe2, 0x29, 0xe0, 0xfe, - 0x02, 0xd4, 0x46, 0xf8, 0xb1, 0xfb, 0xbd, 0x0a, 0x34, 0x8f, 0x78, 0xa8, 0x99, 0x88, 0x41, 0x15, - 0xa7, 0x24, 0x19, 0x87, 0x7e, 0xb3, 0x57, 0xa0, 0x49, 0xd3, 0x4c, 0xd2, 0x38, 0x08, 0x87, 0xd4, - 0x58, 0xc3, 0x03, 0x84, 0x8e, 0x08, 0x61, 0x6d, 0x98, 0xf3, 0xc7, 0x29, 0xed, 0xe0, 0x9c, 0x87, - 0x3f, 0x91, 0xc1, 0x26, 0xfe, 0x6c, 0x8c, 0xbc, 0xa8, 0x77, 0xad, 0xe5, 0x35, 0x25, 0xb6, 0x8f, - 0xdb, 0x76, 0x07, 0x56, 0x4d, 0x12, 0xd5, 0x7a, 0x8d, 0x5a, 0x5f, 0x31, 0x28, 0x65, 0x27, 0xb7, - 0x60, 0x59, 0xd1, 0xc7, 0x62, 0xb0, 0xb4, 0x8f, 0x0d, 0x6f, 0x49, 0xc2, 0x6a, 0x0a, 0xb7, 0xa1, - 0x7d, 0x12, 0x84, 0xfe, 0xa8, 0xd7, 0x1f, 0xa5, 0x67, 0xbd, 0x01, 0x1f, 0xa5, 0x3e, 0xed, 0x68, - 0xcd, 0x5b, 0x22, 0x7c, 0x67, 0x94, 0x9e, 0xed, 0x22, 0xca, 0xde, 0x80, 0xc6, 0x09, 0xe7, 0x3d, - 0x5a, 0x89, 0x4e, 0xfd, 0xa6, 0x73, 0xbb, 0xb9, 0xb5, 0x2c, 0x97, 0x5e, 0xad, 0xae, 0x57, 0x3f, - 0x91, 0xbf, 0xdc, 0x3f, 0x73, 0xa0, 0x25, 0x96, 0x4a, 0xaa, 0xd0, 0xd7, 0x60, 0x51, 0x8d, 0x88, - 0xc7, 0x71, 0x14, 0x4b, 0xf6, 0xb7, 0x41, 0xb6, 0x09, 0x6d, 0x05, 0x4c, 0x62, 0x1e, 0x8c, 0xfd, - 0x21, 0x97, 0xf2, 0x56, 0xc0, 0xd9, 0x56, 0xd6, 0x62, 0x1c, 0x4d, 0x53, 0xa1, 0xc4, 0x9a, 0x5b, - 0x2d, 0x39, 0x28, 0x0f, 0x31, 0xcf, 0x26, 0x41, 0xf6, 0x2f, 0x59, 0x6a, 0x0b, 0x73, 0xbf, 0xe5, - 0x00, 0xc3, 0xa1, 0x3f, 0x8d, 0x44, 0x13, 0x72, 0xa5, 0xf2, 0xbb, 0xe4, 0xbc, 0xf0, 0x2e, 0x55, - 0x2e, 0xda, 0xa5, 0xd7, 0x60, 0x9e, 0x86, 0x85, 0xf2, 0x3c, 0x57, 0x18, 0xba, 0xac, 0x73, 0xbf, - 0xeb, 0x40, 0x0b, 0xb5, 0x4b, 0xc8, 0x47, 0x87, 0x51, 0x10, 0xa6, 0xec, 0x1e, 0xb0, 0x93, 0x69, - 0x38, 0x08, 0xc2, 0x61, 0x2f, 0xfd, 0x30, 0x18, 0xf4, 0x8e, 0x67, 0xd8, 0x04, 0x8d, 0x67, 0xff, - 0x8a, 0x57, 0x52, 0xc7, 0xde, 0x80, 0xb6, 0x85, 0x26, 0x69, 0x2c, 0x46, 0xb5, 0x7f, 0xc5, 0x2b, - 0xd4, 0xe0, 0x22, 0x45, 0xd3, 0x74, 0x32, 0x4d, 0x7b, 0x41, 0x38, 0xe0, 0x1f, 0xd2, 0xba, 0x2e, - 0x7a, 0x16, 0x76, 0x7f, 0x09, 0x5a, 0xe6, 0x77, 0xee, 0xe7, 0xa0, 0x7d, 0x80, 0xca, 0x23, 0x0c, - 0xc2, 0xe1, 0xb6, 0x90, 0x70, 0xd4, 0x68, 0x93, 0xe9, 0xf1, 0x33, 0x3e, 0x93, 0x7b, 0x2d, 0x4b, - 0x28, 0x36, 0xa7, 0x51, 0x92, 0xca, 0x75, 0xa1, 0xdf, 0xee, 0x3f, 0x39, 0xb0, 0x8c, 0x8b, 0xfe, - 0x9e, 0x1f, 0xce, 0xd4, 0x8a, 0x1f, 0x40, 0x0b, 0x9b, 0x7a, 0x1a, 0x6d, 0x0b, 0xbd, 0x28, 0xe4, - 0xfd, 0xb6, 0x5c, 0xa4, 0x1c, 0xf5, 0x1d, 0x93, 0x14, 0x4d, 0xf9, 0xcc, 0xb3, 0xbe, 0x46, 0xc1, - 0x4c, 0xfd, 0x78, 0xc8, 0x53, 0xd2, 0x98, 0x52, 0x83, 0x82, 0x80, 0x76, 0xa2, 0xf0, 0x84, 0xdd, - 0x84, 0x56, 0xe2, 0xa7, 0xbd, 0x09, 0x8f, 0x69, 0xd5, 0x48, 0xb8, 0xe6, 0x3c, 0x48, 0xfc, 0xf4, - 0x90, 0xc7, 0xf7, 0x67, 0x29, 0xef, 0x7e, 0x1e, 0x56, 0x0a, 0xbd, 0xa0, 0x3c, 0x67, 0x53, 0xc4, - 0x9f, 0x6c, 0x0d, 0x6a, 0x67, 0xfe, 0x68, 0xca, 0xa5, 0x22, 0x17, 0x85, 0x77, 0x2a, 0x6f, 0x3b, - 0xee, 0xeb, 0xd0, 0xce, 0x86, 0x2d, 0x05, 0x83, 0x41, 0x15, 0x57, 0x50, 0x36, 0x40, 0xbf, 0xdd, - 0x5f, 0x76, 0x04, 0xe1, 0x4e, 0x14, 0x68, 0xa5, 0x88, 0x84, 0xa8, 0x3b, 0x15, 0x21, 0xfe, 0xbe, - 0xd0, 0x68, 0xfc, 0xe4, 0x93, 0x75, 0x6f, 0xc1, 0x8a, 0x31, 0x84, 0xe7, 0x0c, 0xf6, 0x5b, 0x0e, - 0xac, 0x3c, 0xe6, 0xe7, 0x72, 0xd7, 0xd5, 0x68, 0xdf, 0x86, 0x6a, 0x3a, 0x9b, 0x08, 0x47, 0x6c, - 0x69, 0xeb, 0x35, 0xb9, 0x69, 0x05, 0xba, 0x3b, 0xb2, 0xf8, 0x74, 0x36, 0xe1, 0x1e, 0x7d, 0xe1, - 0x7e, 0x0e, 0x9a, 0x06, 0xc8, 0xae, 0xc2, 0xea, 0x07, 0x8f, 0x9e, 0x3e, 0xde, 0x3b, 0x3a, 0xea, - 0x1d, 0xbe, 0x7f, 0xff, 0x0b, 0x7b, 0x5f, 0xee, 0xed, 0x6f, 0x1f, 0xed, 0xb7, 0xaf, 0xb0, 0x0d, - 0x60, 0x8f, 0xf7, 0x8e, 0x9e, 0xee, 0xed, 0x5a, 0xb8, 0xe3, 0xde, 0x01, 0x66, 0x76, 0x23, 0x47, - 0xde, 0x81, 0x05, 0x69, 0x79, 0x94, 0xe1, 0x95, 0x45, 0xf7, 0x75, 0x60, 0x47, 0xc1, 0x30, 0x7c, - 0x8f, 0x27, 0x89, 0x3f, 0xd4, 0xe2, 0xde, 0x86, 0xb9, 0x71, 0x32, 0x94, 0x52, 0x8e, 0x3f, 0xdd, - 0x4f, 0xc1, 0xaa, 0x45, 0x27, 0x1b, 0xbe, 0x0e, 0x8d, 0x24, 0x18, 0x86, 0x7e, 0x3a, 0x8d, 0xb9, - 0x6c, 0x3a, 0x03, 0xdc, 0x07, 0xb0, 0xf6, 0x25, 0x1e, 0x07, 0x27, 0xb3, 0xcb, 0x9a, 0xb7, 0xdb, - 0xa9, 0xe4, 0xdb, 0xd9, 0x83, 0xf5, 0x5c, 0x3b, 0xb2, 0x7b, 0xc1, 0x6c, 0x72, 0x4b, 0xea, 0x9e, - 0x28, 0x18, 0xa2, 0x57, 0x31, 0x45, 0xcf, 0x7d, 0x1f, 0xd8, 0x4e, 0x14, 0x86, 0xbc, 0x9f, 0x1e, - 0x72, 0x1e, 0x67, 0x1e, 0x74, 0xc6, 0x59, 0xcd, 0xad, 0xab, 0x72, 0xaf, 0xf2, 0xf2, 0x2c, 0x59, - 0x8e, 0x41, 0x75, 0xc2, 0xe3, 0x31, 0x35, 0x5c, 0xf7, 0xe8, 0xb7, 0xbb, 0x0e, 0xab, 0x56, 0xb3, - 0xd2, 0xf9, 0x79, 0x13, 0xd6, 0x77, 0x83, 0xa4, 0x5f, 0xec, 0xb0, 0x03, 0x0b, 0x93, 0xe9, 0x71, - 0x2f, 0x93, 0x1b, 0x55, 0x44, 0x9f, 0x20, 0xff, 0x89, 0x6c, 0xec, 0xd7, 0x1d, 0xa8, 0xee, 0x3f, - 0x3d, 0xd8, 0x61, 0x5d, 0xa8, 0x07, 0x61, 0x3f, 0x1a, 0xa3, 0x6a, 0x15, 0x93, 0xd6, 0xe5, 0x0b, - 0xe5, 0xe1, 0x3a, 0x34, 0x48, 0x23, 0xa3, 0x9b, 0x23, 0x9d, 0xdd, 0x0c, 0x40, 0x17, 0x8b, 0x7f, - 0x38, 0x09, 0x62, 0xf2, 0xa1, 0x94, 0x67, 0x54, 0x25, 0xad, 0x57, 0xac, 0x70, 0xff, 0xab, 0x0a, - 0x0b, 0x52, 0x1f, 0x53, 0x7f, 0xfd, 0x34, 0x38, 0xe3, 0x72, 0x24, 0xb2, 0x84, 0xd6, 0x2e, 0xe6, - 0xe3, 0x28, 0xe5, 0x3d, 0x6b, 0x1b, 0x6c, 0x10, 0xa9, 0xfa, 0xa2, 0xa1, 0xde, 0x04, 0x35, 0x3b, - 0x8d, 0xac, 0xe1, 0xd9, 0x20, 0x2e, 0x16, 0x02, 0xbd, 0x60, 0x40, 0x63, 0xaa, 0x7a, 0xaa, 0x88, - 0x2b, 0xd1, 0xf7, 0x27, 0x7e, 0x3f, 0x48, 0x67, 0x52, 0x80, 0x75, 0x19, 0xdb, 0x1e, 0x45, 0x7d, - 0x7f, 0xd4, 0x3b, 0xf6, 0x47, 0x7e, 0xd8, 0xe7, 0xd2, 0x8f, 0xb3, 0x41, 0x74, 0xd5, 0xe4, 0x90, - 0x14, 0x99, 0x70, 0xe7, 0x72, 0x28, 0xba, 0x7c, 0xfd, 0x68, 0x3c, 0x0e, 0x52, 0xf4, 0xf0, 0xc8, - 0xfa, 0xcf, 0x79, 0x06, 0x42, 0x33, 0x11, 0xa5, 0x73, 0xb1, 0x7a, 0x0d, 0xd1, 0x9b, 0x05, 0x62, - 0x2b, 0xe8, 0x42, 0xa0, 0xd2, 0x79, 0x76, 0xde, 0x01, 0xd1, 0x4a, 0x86, 0xe0, 0x3e, 0x4c, 0xc3, - 0x84, 0xa7, 0xe9, 0x88, 0x0f, 0xf4, 0x80, 0x9a, 0x44, 0x56, 0xac, 0x60, 0xf7, 0x60, 0x55, 0x38, - 0x9d, 0x89, 0x9f, 0x46, 0xc9, 0x69, 0x90, 0xf4, 0x12, 0x74, 0xdf, 0x5a, 0x44, 0x5f, 0x56, 0xc5, - 0xde, 0x86, 0xab, 0x39, 0x38, 0xe6, 0x7d, 0x1e, 0x9c, 0xf1, 0x41, 0x67, 0x91, 0xbe, 0xba, 0xa8, - 0x9a, 0xdd, 0x84, 0x26, 0xfa, 0xda, 0xd3, 0xc9, 0xc0, 0x47, 0x5b, 0xbb, 0x44, 0xfb, 0x60, 0x42, - 0xec, 0x4d, 0x58, 0x9c, 0x70, 0x61, 0x10, 0x4f, 0xd3, 0x51, 0x3f, 0xe9, 0x2c, 0x93, 0xb5, 0x6a, - 0x4a, 0x61, 0x42, 0xce, 0xf5, 0x6c, 0x0a, 0x64, 0xca, 0x7e, 0x42, 0x4e, 0x97, 0x3f, 0xeb, 0xb4, - 0x89, 0xdd, 0x32, 0x80, 0x64, 0x24, 0x0e, 0xce, 0xfc, 0x94, 0x77, 0x56, 0x88, 0xb7, 0x54, 0xd1, - 0xfd, 0x43, 0x07, 0x56, 0x0f, 0x82, 0x24, 0x95, 0x4c, 0xa8, 0x55, 0xee, 0x2b, 0xd0, 0x14, 0xec, - 0xd7, 0x8b, 0xc2, 0xd1, 0x4c, 0x72, 0x24, 0x08, 0xe8, 0x49, 0x38, 0x9a, 0xb1, 0x4f, 0xc0, 0x62, - 0x10, 0x9a, 0x24, 0x42, 0x86, 0x5b, 0x0a, 0x24, 0xa2, 0x57, 0xa0, 0x39, 0x99, 0x1e, 0x8f, 0x82, - 0xbe, 0x20, 0x99, 0x13, 0xad, 0x08, 0x88, 0x08, 0xd0, 0x11, 0x12, 0x23, 0x11, 0x14, 0x55, 0xa2, - 0x68, 0x4a, 0x0c, 0x49, 0xdc, 0xfb, 0xb0, 0x66, 0x0f, 0x50, 0x2a, 0xab, 0x4d, 0xa8, 0x4b, 0xde, - 0x4e, 0x3a, 0x4d, 0x5a, 0x9f, 0x25, 0xb9, 0x3e, 0x92, 0xd4, 0xd3, 0xf5, 0xee, 0x0f, 0xaa, 0xb0, - 0x2a, 0xd1, 0x9d, 0x51, 0x94, 0xf0, 0xa3, 0xe9, 0x78, 0xec, 0xc7, 0x25, 0x42, 0xe3, 0x5c, 0x22, - 0x34, 0x15, 0x5b, 0x68, 0x90, 0x95, 0x4f, 0xfd, 0x20, 0x14, 0x5e, 0x9c, 0x90, 0x38, 0x03, 0x61, - 0xb7, 0x61, 0xb9, 0x3f, 0x8a, 0x12, 0xe1, 0xd9, 0x98, 0xc7, 0xa8, 0x3c, 0x5c, 0x14, 0xf2, 0x5a, - 0x99, 0x90, 0x9b, 0x42, 0x3a, 0x9f, 0x13, 0x52, 0x17, 0x5a, 0xd8, 0x28, 0x57, 0x3a, 0x67, 0x41, - 0x78, 0x5a, 0x26, 0x86, 0xe3, 0xc9, 0x8b, 0x84, 0x90, 0xbf, 0xe5, 0x32, 0x81, 0xc0, 0x53, 0x1a, - 0xea, 0x34, 0x83, 0xba, 0x21, 0x05, 0xa2, 0x58, 0xc5, 0x1e, 0x00, 0x88, 0xbe, 0xc8, 0x54, 0x03, - 0x99, 0xea, 0xd7, 0xed, 0x1d, 0x31, 0xd7, 0xfe, 0x0e, 0x16, 0xa6, 0x31, 0x27, 0x63, 0x6d, 0x7c, - 0xe9, 0xfe, 0xa6, 0x03, 0x4d, 0xa3, 0x8e, 0xad, 0xc3, 0xca, 0xce, 0x93, 0x27, 0x87, 0x7b, 0xde, - 0xf6, 0xd3, 0x47, 0x5f, 0xda, 0xeb, 0xed, 0x1c, 0x3c, 0x39, 0xda, 0x6b, 0x5f, 0x41, 0xf8, 0xe0, - 0xc9, 0xce, 0xf6, 0x41, 0xef, 0xc1, 0x13, 0x6f, 0x47, 0xc1, 0x0e, 0x1a, 0x72, 0x6f, 0xef, 0xbd, - 0x27, 0x4f, 0xf7, 0x2c, 0xbc, 0xc2, 0xda, 0xd0, 0xba, 0xef, 0xed, 0x6d, 0xef, 0xec, 0x4b, 0x64, - 0x8e, 0xad, 0x41, 0xfb, 0xc1, 0xfb, 0x8f, 0x77, 0x1f, 0x3d, 0x7e, 0xd8, 0xdb, 0xd9, 0x7e, 0xbc, - 0xb3, 0x77, 0xb0, 0xb7, 0xdb, 0xae, 0xb2, 0x45, 0x68, 0x6c, 0xdf, 0xdf, 0x7e, 0xbc, 0xfb, 0xe4, - 0xf1, 0xde, 0x6e, 0xbb, 0xe6, 0xfe, 0xa3, 0x03, 0xeb, 0x34, 0xea, 0x41, 0x5e, 0x40, 0x6e, 0x42, - 0xb3, 0x1f, 0x45, 0x13, 0x8e, 0xfa, 0x5c, 0xab, 0x6c, 0x13, 0x42, 0xe6, 0x17, 0x0a, 0xf2, 0x24, - 0x8a, 0xfb, 0x5c, 0xca, 0x07, 0x10, 0xf4, 0x00, 0x11, 0x64, 0x7e, 0xb9, 0xbd, 0x82, 0x42, 0x88, - 0x47, 0x53, 0x60, 0x82, 0x64, 0x03, 0xe6, 0x8f, 0x63, 0xee, 0xf7, 0x4f, 0xa5, 0x64, 0xc8, 0x12, - 0xfb, 0x64, 0xe6, 0x84, 0xf7, 0x71, 0xf5, 0x47, 0x7c, 0x40, 0x1c, 0x53, 0xf7, 0x96, 0x25, 0xbe, - 0x23, 0x61, 0xd4, 0x0c, 0xfe, 0xb1, 0x1f, 0x0e, 0xa2, 0x90, 0x0f, 0x88, 0x69, 0xea, 0x5e, 0x06, - 0xb8, 0x87, 0xb0, 0x91, 0x9f, 0x9f, 0x94, 0xaf, 0xb7, 0x0c, 0xf9, 0x12, 0xde, 0x72, 0xf7, 0xe2, - 0xdd, 0x34, 0x64, 0xed, 0x5f, 0x1d, 0xa8, 0xa2, 0xb1, 0xbd, 0xd8, 0x30, 0x9b, 0xfe, 0xd3, 0x9c, - 0xe5, 0x3f, 0x51, 0xc8, 0x01, 0x4f, 0x19, 0x42, 0xfd, 0x0a, 0x13, 0x65, 0x20, 0x59, 0x7d, 0xcc, - 0xfb, 0x67, 0x34, 0x63, 0x5d, 0x8f, 0x08, 0x0a, 0x08, 0xba, 0xa2, 0xf4, 0xb5, 0x14, 0x10, 0x55, - 0x56, 0x75, 0xf4, 0xe5, 0x42, 0x56, 0x47, 0xdf, 0x75, 0x60, 0x21, 0x08, 0x8f, 0xa3, 0x69, 0x38, - 0x20, 0x81, 0xa8, 0x7b, 0xaa, 0x88, 0xcb, 0x37, 0x21, 0x41, 0x0d, 0xc6, 0x8a, 0xfd, 0x33, 0xc0, - 0x65, 0x78, 0x54, 0x49, 0xc8, 0xb9, 0xd0, 0x01, 0x87, 0xb7, 0x60, 0xc5, 0xc0, 0xe4, 0x6a, 0xbe, - 0x0a, 0xb5, 0x09, 0x02, 0x72, 0x29, 0x95, 0x2a, 0x27, 0xaf, 0x44, 0xd4, 0xb8, 0x6d, 0x58, 0x7a, - 0xc8, 0xd3, 0x47, 0xe1, 0x49, 0xa4, 0x5a, 0xfa, 0x76, 0x15, 0x96, 0x35, 0x24, 0x1b, 0xba, 0x0d, - 0xcb, 0xc1, 0x80, 0x87, 0x69, 0x90, 0xce, 0x7a, 0xd6, 0x89, 0x28, 0x0f, 0xa3, 0x37, 0xe7, 0x8f, - 0x02, 0x3f, 0x91, 0xfe, 0x82, 0x28, 0xb0, 0x2d, 0x58, 0x43, 0x53, 0xa3, 0xac, 0x87, 0xde, 0x62, - 0x71, 0x30, 0x2b, 0xad, 0x43, 0x65, 0x80, 0xb8, 0xd4, 0xf6, 0xfa, 0x13, 0xe1, 0xd5, 0x94, 0x55, - 0xe1, 0xaa, 0x89, 0x96, 0x70, 0xca, 0x35, 0x61, 0x8e, 0x34, 0x50, 0x08, 0x1c, 0xcd, 0x0b, 0x55, - 0x95, 0x0f, 0x1c, 0x19, 0xc1, 0xa7, 0x7a, 0x21, 0xf8, 0x84, 0xaa, 0x6c, 0x16, 0xf6, 0xf9, 0xa0, - 0x97, 0x46, 0x3d, 0x52, 0xb9, 0xb4, 0x3b, 0x75, 0x2f, 0x0f, 0x53, 0x98, 0x8c, 0x27, 0x69, 0xc8, - 0x53, 0xd2, 0x4a, 0x75, 0x4f, 0x15, 0x51, 0xba, 0x88, 0x44, 0x18, 0x90, 0x86, 0x27, 0x4b, 0xe8, - 0x96, 0x4e, 0xe3, 0x20, 0xe9, 0xb4, 0x08, 0xa5, 0xdf, 0xec, 0xd3, 0xb0, 0x7e, 0xcc, 0x93, 0xb4, - 0x77, 0xca, 0xfd, 0x01, 0x8f, 0x69, 0xf7, 0x45, 0x4c, 0x4b, 0x58, 0xfb, 0xf2, 0x4a, 0xec, 0xfb, - 0x8c, 0xc7, 0x49, 0x10, 0x85, 0x64, 0xe7, 0x1b, 0x9e, 0x2a, 0x62, 0x7b, 0xb8, 0x20, 0xda, 0x86, - 0xea, 0x55, 0x5d, 0xa6, 0xc5, 0x28, 0xaf, 0x74, 0xbf, 0x49, 0x3e, 0xb7, 0x8e, 0xd1, 0xbd, 0x4f, - 0x0e, 0x03, 0x7b, 0x09, 0x1a, 0x62, 0x65, 0x92, 0x53, 0x5f, 0x1e, 0x03, 0xea, 0x04, 0x1c, 0x9d, - 0xfa, 0xa8, 0x65, 0xac, 0xc5, 0x16, 0x41, 0xcf, 0x26, 0x61, 0xfb, 0x62, 0xad, 0x5f, 0x83, 0x25, - 0x15, 0xfd, 0x4b, 0x7a, 0x23, 0x7e, 0x92, 0xaa, 0x63, 0x7a, 0x38, 0x1d, 0x63, 0x77, 0xc9, 0x01, - 0x3f, 0x49, 0xdd, 0xc7, 0xb0, 0x22, 0x25, 0xff, 0xc9, 0x84, 0xab, 0xae, 0x3f, 0x5b, 0x66, 0x41, - 0x9b, 0x5b, 0xab, 0xb6, 0xaa, 0xa0, 0x58, 0x43, 0xce, 0xac, 0xba, 0x1e, 0x30, 0x53, 0x93, 0xc8, - 0x06, 0xa5, 0x19, 0x53, 0xc1, 0x00, 0x39, 0x1d, 0x0b, 0xc3, 0x55, 0x4d, 0xa6, 0xfd, 0x3e, 0xea, - 0x0f, 0xa1, 0x55, 0x55, 0xd1, 0xfd, 0x9e, 0x03, 0xab, 0xd4, 0x9a, 0xf2, 0x01, 0xf4, 0x09, 0xf2, - 0xc5, 0x87, 0xd9, 0xea, 0x9b, 0x01, 0x92, 0x35, 0xa8, 0x99, 0xfa, 0x5b, 0x14, 0x7e, 0xf4, 0x33, - 0x71, 0xb5, 0x70, 0x26, 0xfe, 0x7b, 0x07, 0x56, 0x84, 0x0a, 0x4d, 0xfd, 0x74, 0x9a, 0xc8, 0xe9, - 0xff, 0x3f, 0x58, 0x14, 0xb6, 0x50, 0x0a, 0xa1, 0x1c, 0xe8, 0x9a, 0xd6, 0x17, 0x84, 0x0a, 0xe2, - 0xfd, 0x2b, 0x9e, 0x4d, 0xcc, 0x3e, 0x0f, 0x2d, 0x33, 0x84, 0x4b, 0x63, 0x6e, 0x6e, 0x5d, 0x53, - 0xb3, 0x2c, 0x70, 0xce, 0xfe, 0x15, 0xcf, 0xfa, 0x80, 0xbd, 0x4b, 0x0e, 0x4d, 0xd8, 0xa3, 0x66, - 0x65, 0x10, 0xec, 0x5a, 0x89, 0xda, 0xd7, 0x9f, 0x1b, 0xe4, 0xf7, 0xeb, 0x30, 0x2f, 0x3c, 0x58, - 0xf7, 0x21, 0x2c, 0x5a, 0x23, 0xb5, 0xce, 0xfa, 0x2d, 0x71, 0xd6, 0x2f, 0x84, 0x86, 0x2a, 0xc5, - 0xd0, 0x90, 0xfb, 0x27, 0x73, 0xc0, 0x90, 0xdb, 0x72, 0xdb, 0x89, 0x2e, 0x74, 0x34, 0xb0, 0x0e, - 0x44, 0x2d, 0xcf, 0x84, 0xd8, 0x1d, 0x60, 0x46, 0x51, 0x45, 0xcf, 0x84, 0xb5, 0x29, 0xa9, 0x41, - 0xb5, 0x28, 0x8d, 0xb5, 0x34, 0xab, 0xf2, 0xe8, 0x27, 0xf6, 0xad, 0xb4, 0x0e, 0x0d, 0xca, 0x64, - 0x9a, 0x9c, 0xa2, 0x8b, 0xaf, 0x8e, 0x4c, 0xaa, 0x9c, 0x67, 0x90, 0xf9, 0x4b, 0x19, 0x64, 0x21, - 0xcf, 0x20, 0xa6, 0xd3, 0x5e, 0xb7, 0x9c, 0x76, 0x74, 0x16, 0xc7, 0xe8, 0x62, 0xa6, 0xa3, 0x7e, - 0x6f, 0x8c, 0xbd, 0xcb, 0x13, 0x92, 0x05, 0xb2, 0x4d, 0x68, 0x4b, 0xf7, 0x22, 0x3b, 0x19, 0x00, - 0xad, 0x71, 0x01, 0x47, 0x7d, 0x8d, 0x1f, 0x93, 0x06, 0xa0, 0x53, 0x52, 0xcd, 0xcb, 0x00, 0x3c, - 0x4b, 0x25, 0xc8, 0x62, 0xbd, 0x69, 0x28, 0xb9, 0x85, 0x0f, 0xe8, 0x6c, 0x54, 0xf7, 0x8a, 0x15, - 0xee, 0x0f, 0x1d, 0x68, 0xe3, 0x9e, 0x59, 0x7c, 0xfd, 0x0e, 0x90, 0x58, 0xbd, 0x20, 0x5b, 0x5b, - 0xb4, 0x3f, 0x39, 0x57, 0xbf, 0x0d, 0x0d, 0x6a, 0x30, 0x9a, 0xf0, 0x50, 0x32, 0x75, 0xc7, 0x66, - 0xea, 0x4c, 0xa3, 0xed, 0x5f, 0xf1, 0x32, 0x62, 0x83, 0xa5, 0xff, 0xce, 0x81, 0xa6, 0x1c, 0xe6, - 0x8f, 0x1d, 0x39, 0xe8, 0x42, 0x1d, 0xb9, 0xdb, 0x38, 0x9e, 0xeb, 0x32, 0xda, 0xb3, 0xb1, 0x9f, - 0x4e, 0x63, 0x34, 0xe0, 0x56, 0xd4, 0x20, 0x0f, 0xa3, 0x35, 0x26, 0xe5, 0x9d, 0xf4, 0xd2, 0x60, - 0xd4, 0x53, 0xb5, 0xf2, 0xf6, 0xa5, 0xac, 0x0a, 0x75, 0x58, 0x92, 0xfa, 0x43, 0x2e, 0x0d, 0xad, - 0x28, 0xb8, 0x1d, 0xd8, 0x90, 0x13, 0xca, 0xf9, 0xb6, 0xee, 0x5f, 0xb6, 0xe0, 0x6a, 0xa1, 0x4a, - 0x5f, 0x5f, 0xca, 0xe3, 0xf0, 0x28, 0x18, 0x1f, 0x47, 0xfa, 0x60, 0xe0, 0x98, 0x27, 0x65, 0xab, - 0x8a, 0x0d, 0x61, 0x5d, 0x79, 0x14, 0xb8, 0xa6, 0x99, 0xa5, 0xab, 0x90, 0x2b, 0xf4, 0xa6, 0xcd, - 0x03, 0xf9, 0x0e, 0x15, 0x6e, 0x6a, 0x81, 0xf2, 0xf6, 0xd8, 0x29, 0x74, 0xb4, 0xeb, 0x22, 0xcd, - 0x85, 0xe1, 0xde, 0x60, 0x5f, 0x6f, 0x5c, 0xd2, 0x97, 0xe5, 0x0a, 0x7b, 0x17, 0xb6, 0xc6, 0x66, - 0x70, 0x43, 0xd5, 0x91, 0x3d, 0x28, 0xf6, 0x57, 0x7d, 0xa1, 0xb9, 0x91, 0x93, 0x6f, 0x77, 0x7a, - 0x49, 0xc3, 0xec, 0xeb, 0xb0, 0x71, 0xee, 0x07, 0xa9, 0x1a, 0x96, 0xe1, 0x38, 0xd4, 0xa8, 0xcb, - 0xad, 0x4b, 0xba, 0xfc, 0x40, 0x7c, 0x6c, 0x19, 0xc9, 0x0b, 0x5a, 0xec, 0xfe, 0x8d, 0x03, 0x4b, - 0x76, 0x3b, 0xc8, 0xa6, 0x52, 0x79, 0x28, 0x25, 0xaa, 0xdc, 0xcf, 0x1c, 0x5c, 0x3c, 0x5b, 0x57, - 0xca, 0xce, 0xd6, 0xe6, 0x89, 0x76, 0xee, 0xb2, 0xb0, 0x53, 0xf5, 0xc5, 0xc2, 0x4e, 0xb5, 0xb2, - 0xb0, 0x53, 0xf7, 0x3f, 0x1c, 0x60, 0x45, 0x5e, 0x62, 0x0f, 0xc5, 0xe1, 0x3e, 0xe4, 0x23, 0xa9, - 0x93, 0xfe, 0xef, 0x8b, 0xf1, 0xa3, 0x5a, 0x3b, 0xf5, 0x35, 0x0a, 0x86, 0xa9, 0x74, 0x4c, 0x77, - 0x6b, 0xd1, 0x2b, 0xab, 0xca, 0x05, 0xc2, 0xaa, 0x97, 0x07, 0xc2, 0x6a, 0x97, 0x07, 0xc2, 0xe6, - 0xf3, 0x81, 0xb0, 0xee, 0xaf, 0x39, 0xb0, 0x5a, 0xb2, 0xe9, 0x3f, 0xbd, 0x89, 0xe3, 0x36, 0x59, - 0xba, 0xa0, 0x22, 0xb7, 0xc9, 0x04, 0xbb, 0xbf, 0x08, 0x8b, 0x16, 0xa3, 0xff, 0xf4, 0xfa, 0xcf, - 0x7b, 0x8c, 0x82, 0xcf, 0x2c, 0xac, 0xfb, 0x6f, 0x15, 0x60, 0x45, 0x61, 0xfb, 0x5f, 0x1d, 0x43, - 0x71, 0x9d, 0xe6, 0x4a, 0xd6, 0xe9, 0x7f, 0xd4, 0x0e, 0xbc, 0x01, 0x2b, 0x32, 0xd7, 0xc1, 0x08, - 0xe9, 0x08, 0x8e, 0x29, 0x56, 0xa0, 0xcf, 0x6c, 0x47, 0x21, 0xeb, 0xd6, 0x1d, 0xb9, 0x61, 0x0c, - 0x73, 0xc1, 0x48, 0x77, 0x03, 0xd6, 0x44, 0xee, 0xc4, 0x7d, 0xd1, 0x94, 0xb2, 0x2b, 0x7f, 0xe0, - 0xc0, 0x7a, 0xae, 0x22, 0xbb, 0xd1, 0x15, 0xa6, 0xc3, 0xb6, 0x27, 0x36, 0x88, 0xe3, 0xd7, 0x6e, - 0x46, 0x8e, 0xdb, 0x8a, 0x15, 0xb8, 0x3e, 0x86, 0x5b, 0x92, 0x5b, 0xf5, 0xb2, 0x2a, 0xf7, 0xaa, - 0xc8, 0xf0, 0x08, 0xf9, 0x28, 0x37, 0xf0, 0x13, 0x91, 0x93, 0x61, 0x56, 0x64, 0x57, 0x41, 0xf6, - 0x90, 0x55, 0x11, 0x3d, 0x4a, 0xcb, 0x4c, 0xd9, 0xe3, 0x2d, 0xad, 0x73, 0x7f, 0xe0, 0x00, 0xfb, - 0xe2, 0x94, 0xc7, 0x33, 0xba, 0xb5, 0xd5, 0xb1, 0xa6, 0xab, 0xf9, 0x48, 0xca, 0xfc, 0x64, 0x7a, - 0xfc, 0x05, 0x3e, 0x53, 0xf7, 0xff, 0x95, 0xec, 0xfe, 0xff, 0x65, 0x00, 0x3c, 0xca, 0xe9, 0xab, - 0x60, 0xf2, 0xe4, 0xc2, 0xe9, 0x58, 0x34, 0x58, 0x7a, 0x45, 0x5f, 0xbd, 0xfc, 0x8a, 0xbe, 0x76, - 0xd9, 0x15, 0xfd, 0xbb, 0xb0, 0x6a, 0x8d, 0x5b, 0x6f, 0xab, 0xba, 0x94, 0x76, 0x9e, 0x73, 0x29, - 0xfd, 0x1b, 0x15, 0x98, 0xdb, 0x8f, 0x26, 0x66, 0x9c, 0xd5, 0xb1, 0xe3, 0xac, 0xd2, 0x96, 0xf4, - 0xb4, 0xa9, 0x90, 0x2a, 0xc6, 0x02, 0xd9, 0x26, 0x2c, 0xf9, 0xe3, 0x14, 0x0f, 0xfe, 0x27, 0x51, - 0x7c, 0xee, 0xc7, 0x03, 0xb1, 0xd7, 0xf7, 0x2b, 0x1d, 0xc7, 0xcb, 0xd5, 0xb0, 0x35, 0x98, 0xd3, - 0x4a, 0x97, 0x08, 0xb0, 0x88, 0x8e, 0x1b, 0xdd, 0xd1, 0xcc, 0x64, 0xcc, 0x42, 0x96, 0x90, 0x95, - 0xec, 0xef, 0x85, 0xdb, 0x2d, 0x44, 0xa7, 0xac, 0x0a, 0xed, 0x1a, 0x2e, 0x1f, 0x91, 0xc9, 0x60, - 0x93, 0x2a, 0x9b, 0x81, 0xb1, 0xba, 0x7d, 0x63, 0xf5, 0x2f, 0x0e, 0xd4, 0x68, 0x6d, 0x50, 0x0d, - 0x08, 0xde, 0xd7, 0xa1, 0x56, 0x5a, 0x93, 0x45, 0x2f, 0x0f, 0x33, 0xd7, 0xca, 0xa0, 0xa9, 0xe8, - 0x09, 0x99, 0x59, 0x34, 0x37, 0xa1, 0x21, 0x4a, 0x3a, 0x5b, 0x84, 0x48, 0x32, 0x90, 0xdd, 0x80, - 0xea, 0x69, 0x34, 0x51, 0x7e, 0x0b, 0xa8, 0x9b, 0x86, 0x68, 0xe2, 0x11, 0x9e, 0x8d, 0x07, 0xdb, - 0x13, 0xd3, 0x12, 0xd6, 0x28, 0x0f, 0xa3, 0x3d, 0xd6, 0xcd, 0x9a, 0xcb, 0x94, 0x43, 0xdd, 0x4d, - 0x58, 0x7e, 0x1c, 0x0d, 0xb8, 0x11, 0xef, 0xba, 0x90, 0xcf, 0xdd, 0x5f, 0x72, 0xa0, 0xae, 0x88, - 0xd9, 0x6d, 0xa8, 0xa2, 0x93, 0x91, 0x3b, 0x42, 0xe8, 0x1b, 0x46, 0xa4, 0xf3, 0x88, 0x02, 0xb5, - 0x32, 0xc5, 0x35, 0x32, 0x87, 0x53, 0x45, 0x35, 0x32, 0x7f, 0x4a, 0x0f, 0x37, 0xe7, 0x86, 0xe4, - 0x50, 0xf7, 0xfb, 0x0e, 0x2c, 0x5a, 0x7d, 0xe0, 0x21, 0x74, 0xe4, 0x27, 0xa9, 0xbc, 0xb5, 0x91, - 0xdb, 0x63, 0x42, 0xe6, 0x46, 0x57, 0xec, 0x08, 0xa8, 0x8e, 0xcd, 0xcd, 0x99, 0xb1, 0xb9, 0x7b, - 0xd0, 0xc8, 0xf2, 0x9c, 0xaa, 0x96, 0xb6, 0xc5, 0x1e, 0xd5, 0xdd, 0x69, 0x46, 0x84, 0xed, 0xf4, - 0xa3, 0x51, 0x14, 0xcb, 0xeb, 0x02, 0x51, 0x70, 0xdf, 0x85, 0xa6, 0x41, 0x8f, 0xc3, 0x08, 0x79, - 0x7a, 0x1e, 0xc5, 0xcf, 0x54, 0x20, 0x56, 0x16, 0x75, 0x1a, 0x40, 0x25, 0x4b, 0x03, 0x70, 0xff, - 0xda, 0x81, 0x45, 0xe4, 0xc1, 0x20, 0x1c, 0x1e, 0x46, 0xa3, 0xa0, 0x3f, 0xa3, 0xbd, 0x57, 0xec, - 0x26, 0x75, 0x86, 0xe2, 0x45, 0x1b, 0x46, 0xae, 0x57, 0x67, 0x50, 0x29, 0xa2, 0xba, 0x8c, 0x32, - 0x8c, 0x12, 0x70, 0xec, 0x27, 0x52, 0x2c, 0xa4, 0xf9, 0xb3, 0x40, 0x94, 0x34, 0x04, 0x62, 0x3f, - 0xe5, 0xbd, 0x71, 0x30, 0x1a, 0x05, 0x82, 0x56, 0x38, 0x47, 0x65, 0x55, 0xd8, 0xe7, 0x20, 0x48, - 0xfc, 0xe3, 0x2c, 0x04, 0xae, 0xcb, 0xee, 0x9f, 0x57, 0xa0, 0x29, 0x15, 0xf7, 0xde, 0x60, 0xc8, - 0xe5, 0x7d, 0x0d, 0xb9, 0x9f, 0x5a, 0xc9, 0x18, 0x88, 0xaa, 0xb7, 0x1c, 0x56, 0x03, 0xc9, 0x6f, - 0xf9, 0x5c, 0x71, 0xcb, 0xaf, 0x43, 0x03, 0x59, 0xef, 0x4d, 0xf2, 0x8c, 0xc5, 0x5d, 0x4f, 0x06, - 0xa8, 0xda, 0x2d, 0xaa, 0xad, 0x65, 0xb5, 0x04, 0x3c, 0xf7, 0x76, 0xe7, 0x6d, 0x68, 0xc9, 0x66, - 0x68, 0x4f, 0x48, 0xa7, 0x64, 0xcc, 0x6f, 0xed, 0x97, 0x67, 0x51, 0xaa, 0x2f, 0xb7, 0xd4, 0x97, - 0xf5, 0xcb, 0xbe, 0x54, 0x94, 0xee, 0x43, 0x7d, 0x69, 0xf6, 0x30, 0xf6, 0x27, 0xa7, 0x4a, 0x4a, - 0xef, 0xc1, 0x6a, 0x10, 0xf6, 0x47, 0xd3, 0x01, 0xef, 0x4d, 0x43, 0x3f, 0x0c, 0xa3, 0x69, 0xd8, - 0xe7, 0x2a, 0x67, 0xa0, 0xac, 0xca, 0x1d, 0xe8, 0xa4, 0x23, 0x6a, 0x88, 0x6d, 0x42, 0x0d, 0x3b, - 0x52, 0x56, 0xa1, 0x5c, 0x84, 0x05, 0x09, 0xbb, 0x0d, 0x35, 0x3e, 0x18, 0x72, 0x75, 0x5a, 0x64, - 0xf6, 0xb9, 0x1d, 0x77, 0xd5, 0x13, 0x04, 0xa8, 0x50, 0x10, 0xcd, 0x29, 0x14, 0xdb, 0xa2, 0xcc, - 0x63, 0xf1, 0xd1, 0xc0, 0x5d, 0x03, 0xf6, 0x58, 0xc8, 0x80, 0x19, 0x6f, 0xff, 0xd5, 0x39, 0x68, - 0x1a, 0x30, 0xea, 0x86, 0x21, 0x0e, 0xb8, 0x37, 0x08, 0xfc, 0x31, 0x4f, 0x79, 0x2c, 0xf9, 0x3e, - 0x87, 0x22, 0x9d, 0x7f, 0x36, 0xec, 0x45, 0xd3, 0xb4, 0x37, 0xe0, 0xc3, 0x98, 0x0b, 0x23, 0x8f, - 0x46, 0xc7, 0x42, 0x91, 0x6e, 0xec, 0x7f, 0x68, 0xd2, 0x09, 0x0e, 0xca, 0xa1, 0x2a, 0x7a, 0x2e, - 0xd6, 0xa8, 0x9a, 0x45, 0xcf, 0xc5, 0x8a, 0xe4, 0xb5, 0x5a, 0xad, 0x44, 0xab, 0xbd, 0x05, 0x1b, - 0x42, 0x7f, 0x49, 0x49, 0xef, 0xe5, 0x18, 0xeb, 0x82, 0x5a, 0xb6, 0x09, 0x6d, 0x1c, 0xb3, 0x12, - 0x89, 0x24, 0xf8, 0xa6, 0x88, 0x4c, 0x39, 0x5e, 0x01, 0x47, 0x5a, 0x0a, 0x11, 0x99, 0xb4, 0xe2, - 0x36, 0xb1, 0x80, 0x13, 0xad, 0xff, 0xa1, 0x4d, 0xdb, 0x90, 0xb4, 0x39, 0xdc, 0x5d, 0x84, 0xe6, - 0x51, 0x1a, 0x4d, 0xd4, 0xa6, 0x2c, 0x41, 0x4b, 0x14, 0x65, 0xee, 0xc6, 0x4b, 0x70, 0x8d, 0xb8, - 0xe8, 0x69, 0x34, 0x89, 0x46, 0xd1, 0x70, 0x76, 0x34, 0x3d, 0x4e, 0xfa, 0x71, 0x30, 0xc1, 0x93, - 0x95, 0xfb, 0xb7, 0x0e, 0xac, 0x5a, 0xb5, 0x32, 0xfc, 0xf4, 0x69, 0x21, 0x04, 0xfa, 0xd2, 0x5d, - 0x30, 0xde, 0x8a, 0xa1, 0x5c, 0x05, 0xa1, 0x08, 0x22, 0xbe, 0x2f, 0xef, 0xe1, 0xb7, 0x61, 0x59, - 0x8d, 0x4c, 0x7d, 0x28, 0xb8, 0xb0, 0x53, 0xe4, 0x42, 0xf9, 0xfd, 0x92, 0xfc, 0x40, 0x35, 0xf1, - 0xff, 0xe5, 0xad, 0xec, 0x80, 0xe6, 0xa8, 0xe2, 0x10, 0xfa, 0x26, 0xcd, 0x3c, 0x8d, 0xa8, 0x11, - 0xf4, 0x35, 0x98, 0xb8, 0xbf, 0xe5, 0x00, 0x64, 0xa3, 0xa3, 0xbb, 0x3c, 0x6d, 0x20, 0x44, 0xc2, - 0xb8, 0x61, 0x0c, 0x5e, 0x85, 0x96, 0xbe, 0x03, 0xca, 0x6c, 0x4e, 0x53, 0x61, 0xe8, 0x30, 0xde, - 0x82, 0xe5, 0xe1, 0x28, 0x3a, 0x26, 0x83, 0x4d, 0xc9, 0x40, 0x89, 0xcc, 0x60, 0x59, 0x12, 0xf0, - 0x03, 0x89, 0x66, 0x06, 0xaa, 0x6a, 0x18, 0x28, 0xf7, 0x5b, 0x15, 0x7d, 0x07, 0x90, 0xcd, 0xf9, - 0x42, 0x29, 0x63, 0x5b, 0x05, 0x75, 0x7a, 0x41, 0xc8, 0x9d, 0x22, 0x6e, 0x87, 0x97, 0x06, 0x04, - 0xde, 0x85, 0xa5, 0x58, 0xe8, 0x2b, 0xa5, 0xcc, 0xaa, 0xcf, 0x51, 0x66, 0x8b, 0xb1, 0x65, 0xc5, - 0x3e, 0x09, 0x6d, 0x7f, 0x70, 0xc6, 0xe3, 0x34, 0xa0, 0x23, 0x19, 0xb9, 0x10, 0x42, 0x05, 0x2f, - 0x1b, 0x38, 0x59, 0xf6, 0x5b, 0xb0, 0x2c, 0xb3, 0x86, 0x34, 0xa5, 0xcc, 0x78, 0xcd, 0x60, 0x24, - 0x74, 0xff, 0x48, 0x5d, 0x37, 0xd8, 0x7b, 0x78, 0xf1, 0x8a, 0x98, 0xb3, 0xab, 0xe4, 0x66, 0xf7, - 0x09, 0x19, 0xfa, 0x1f, 0xa8, 0x73, 0xdf, 0x9c, 0x71, 0x83, 0x3f, 0x90, 0x57, 0x35, 0xf6, 0x92, - 0x56, 0x5f, 0x64, 0x49, 0xdd, 0x1f, 0x3a, 0xb0, 0xb0, 0x1f, 0x4d, 0xf6, 0x65, 0x2e, 0x03, 0x09, - 0x82, 0xce, 0xbb, 0x53, 0xc5, 0xe7, 0x64, 0x39, 0x94, 0x5a, 0xee, 0xc5, 0xbc, 0xe5, 0xfe, 0x19, - 0x78, 0x89, 0xa2, 0x0e, 0x71, 0x34, 0x89, 0x62, 0x14, 0x46, 0x7f, 0x24, 0xcc, 0x74, 0x14, 0xa6, - 0xa7, 0x4a, 0x8d, 0x3d, 0x8f, 0x84, 0x8e, 0x77, 0x78, 0x2c, 0x11, 0x4e, 0xb7, 0xf4, 0x34, 0x84, - 0x76, 0x2b, 0x56, 0xb8, 0x9f, 0x85, 0x06, 0xb9, 0xca, 0x34, 0xad, 0x37, 0xa0, 0x71, 0x1a, 0x4d, - 0x7a, 0xa7, 0x41, 0x98, 0x2a, 0xe1, 0x5e, 0xca, 0x7c, 0xd8, 0x7d, 0x5a, 0x10, 0x4d, 0xe0, 0xfe, - 0x5e, 0x0d, 0x16, 0x1e, 0x85, 0x67, 0x51, 0xd0, 0xa7, 0x9b, 0x89, 0x31, 0x1f, 0x47, 0x2a, 0x0b, - 0x11, 0x7f, 0xe3, 0x52, 0x50, 0xb6, 0xce, 0x24, 0x95, 0x57, 0x0b, 0xaa, 0x88, 0x0e, 0x42, 0x9c, - 0x65, 0x13, 0x0b, 0xd1, 0x31, 0x10, 0x3c, 0x40, 0xc4, 0x66, 0x36, 0xb0, 0x2c, 0x65, 0x69, 0x9c, - 0x35, 0x23, 0x8d, 0x93, 0xee, 0xb1, 0x44, 0xde, 0x85, 0xbc, 0x98, 0x57, 0x45, 0x3a, 0xf0, 0xc4, - 0x5c, 0x44, 0x8b, 0xc8, 0xd5, 0x58, 0x90, 0x07, 0x1e, 0x13, 0x44, 0x77, 0x44, 0x7c, 0x20, 0x68, - 0x84, 0xf2, 0x35, 0x21, 0x74, 0xdd, 0xf2, 0xb9, 0xdb, 0x0d, 0xc1, 0xf3, 0x39, 0x18, 0x35, 0xf4, - 0x80, 0x6b, 0x45, 0x2a, 0xe6, 0x00, 0x22, 0x5b, 0x3a, 0x8f, 0x1b, 0xc7, 0x24, 0x91, 0x50, 0xa5, - 0x8e, 0x49, 0xc8, 0x28, 0xfe, 0x68, 0x74, 0xec, 0xf7, 0x9f, 0x51, 0x6a, 0x3e, 0xdd, 0x11, 0x34, - 0x3c, 0x1b, 0xa4, 0xcc, 0x89, 0x6c, 0x37, 0xe9, 0xfe, 0xb4, 0xea, 0x99, 0x10, 0xdb, 0x82, 0x26, - 0x1d, 0x0d, 0xe5, 0x7e, 0x2e, 0xd1, 0x7e, 0xb6, 0xcd, 0xb3, 0x23, 0xed, 0xa8, 0x49, 0x64, 0xde, - 0x96, 0x2c, 0xdb, 0xb7, 0x25, 0x42, 0x69, 0xca, 0x4b, 0xa6, 0x36, 0xf5, 0x96, 0x01, 0x68, 0x4d, - 0xe5, 0x82, 0x09, 0x82, 0x15, 0x22, 0xb0, 0x30, 0x76, 0x03, 0xea, 0x78, 0x6c, 0x99, 0xf8, 0xc1, - 0xa0, 0xc3, 0xf4, 0xe9, 0x49, 0x63, 0xd8, 0x86, 0xfa, 0x4d, 0x97, 0x41, 0xab, 0xb4, 0x2a, 0x16, - 0x86, 0x6b, 0xa3, 0xcb, 0x24, 0x44, 0x6b, 0x62, 0x47, 0x2d, 0xd0, 0x4d, 0x81, 0x6d, 0x0f, 0x06, - 0x92, 0x37, 0xf5, 0x31, 0x3a, 0xe3, 0x2a, 0xc7, 0xe2, 0xaa, 0x92, 0xdd, 0xad, 0x94, 0xef, 0xee, - 0x73, 0xd7, 0xc0, 0xdd, 0x83, 0xe6, 0xa1, 0x91, 0x7a, 0x4e, 0x4c, 0xae, 0x92, 0xce, 0xa5, 0x60, - 0x18, 0x88, 0x31, 0x9c, 0x8a, 0x39, 0x1c, 0xf7, 0x8f, 0x1d, 0x60, 0x07, 0x41, 0x92, 0xea, 0xe1, - 0x8b, 0xbe, 0x5d, 0x68, 0xe9, 0x60, 0x47, 0x96, 0x4b, 0x66, 0x61, 0x48, 0x43, 0x43, 0xe9, 0x45, - 0x27, 0x27, 0x09, 0x57, 0x99, 0x1f, 0x16, 0x86, 0x1c, 0x8a, 0x3e, 0x0e, 0xfa, 0x0b, 0x81, 0xe8, - 0x21, 0x91, 0x19, 0x20, 0x05, 0x1c, 0xf5, 0x6c, 0xcc, 0xcf, 0x78, 0x9c, 0x68, 0xd1, 0xd2, 0x65, - 0x9d, 0xf2, 0x96, 0x5f, 0xe5, 0x4d, 0xa8, 0xeb, 0x76, 0x6d, 0x15, 0xa2, 0x28, 0x75, 0x3d, 0xaa, - 0x2a, 0xf2, 0xfa, 0xad, 0x41, 0x0b, 0xb5, 0x59, 0xac, 0x60, 0x77, 0x80, 0x9d, 0x04, 0x71, 0x9e, - 0x7c, 0x8e, 0xc8, 0x4b, 0x6a, 0xdc, 0x0f, 0x60, 0x55, 0x76, 0x69, 0x3a, 0x37, 0xf6, 0x26, 0x3a, - 0x97, 0x31, 0x72, 0xa5, 0xc8, 0xc8, 0xee, 0x7f, 0x3a, 0xb0, 0x20, 0x77, 0xba, 0xf0, 0x7c, 0x41, - 0xec, 0xb3, 0x85, 0xb1, 0x8e, 0x95, 0x7d, 0x4e, 0x5c, 0x2f, 0x55, 0x57, 0x41, 0x41, 0xcd, 0x95, - 0x29, 0x28, 0x06, 0xd5, 0x89, 0x9f, 0x9e, 0xd2, 0x59, 0xb6, 0xe1, 0xd1, 0x6f, 0xd6, 0x16, 0x91, - 0x17, 0xa1, 0x08, 0x29, 0xea, 0x52, 0xf6, 0x50, 0x43, 0xd8, 0xdb, 0xe2, 0x43, 0x8d, 0xeb, 0xd0, - 0xa0, 0x01, 0xf4, 0xb2, 0xc0, 0x4a, 0x06, 0x20, 0xe7, 0x8a, 0x02, 0x49, 0x98, 0x4c, 0x2d, 0xcd, - 0x10, 0x77, 0x5d, 0xec, 0xbc, 0x5c, 0x02, 0x7d, 0xdf, 0x25, 0x53, 0x0c, 0x33, 0x38, 0xe3, 0x08, - 0x39, 0x80, 0x3c, 0x47, 0x48, 0x52, 0x4f, 0xd7, 0xbb, 0x5d, 0xe8, 0xec, 0xf2, 0x11, 0x4f, 0xf9, - 0xf6, 0x68, 0x94, 0x6f, 0xff, 0x25, 0xb8, 0x56, 0x52, 0x27, 0xfd, 0xd9, 0x2f, 0xc2, 0xfa, 0xb6, - 0x48, 0xc7, 0xfa, 0x69, 0xe5, 0x2c, 0xb8, 0x1d, 0xd8, 0xc8, 0x37, 0x29, 0x3b, 0x7b, 0x00, 0x2b, - 0xbb, 0xfc, 0x78, 0x3a, 0x3c, 0xe0, 0x67, 0x59, 0x47, 0x0c, 0xaa, 0xc9, 0x69, 0x74, 0x2e, 0x05, - 0x93, 0x7e, 0xb3, 0x97, 0x01, 0x46, 0x48, 0xd3, 0x4b, 0x26, 0xbc, 0xaf, 0x52, 0xc8, 0x09, 0x39, - 0x9a, 0xf0, 0xbe, 0xfb, 0x16, 0x30, 0xb3, 0x1d, 0xb9, 0x5e, 0x68, 0x8f, 0xa6, 0xc7, 0xbd, 0x64, - 0x96, 0xa4, 0x7c, 0xac, 0x72, 0xe3, 0x4d, 0xc8, 0xbd, 0x05, 0xad, 0x43, 0x7f, 0xe6, 0xf1, 0x6f, - 0xc8, 0x57, 0x2b, 0x57, 0x61, 0x61, 0xe2, 0xcf, 0x50, 0x4d, 0xe9, 0x88, 0x0f, 0x55, 0xbb, 0xff, - 0x5e, 0x81, 0x79, 0x41, 0x89, 0xad, 0x0e, 0x78, 0x92, 0x06, 0xa1, 0xb8, 0xfd, 0x95, 0xad, 0x1a, - 0x50, 0x81, 0x95, 0x2b, 0x25, 0xac, 0x2c, 0x4f, 0x4d, 0x2a, 0x1d, 0x57, 0xf2, 0xab, 0x85, 0x21, - 0x73, 0x65, 0x79, 0x3d, 0x22, 0xe4, 0x90, 0x01, 0xb9, 0xe0, 0x60, 0x66, 0xf5, 0xc4, 0xf8, 0x94, - 0x94, 0x4a, 0xce, 0x35, 0xa1, 0x52, 0xdb, 0xba, 0x20, 0x18, 0xbc, 0x60, 0x5b, 0x0b, 0x36, 0xb4, - 0xfe, 0x02, 0x36, 0x54, 0x1c, 0xa5, 0x9e, 0x67, 0x43, 0xe1, 0x05, 0x6c, 0xa8, 0xcb, 0xa0, 0xfd, - 0x80, 0x73, 0x8f, 0xa3, 0x77, 0xa6, 0x78, 0xf7, 0x3b, 0x0e, 0xb4, 0x25, 0x17, 0xe9, 0x3a, 0xf6, - 0xaa, 0xe5, 0x85, 0x96, 0x26, 0xcd, 0xbe, 0x06, 0x8b, 0xe4, 0x1b, 0xea, 0x28, 0xa8, 0x0c, 0xd9, - 0x5a, 0x20, 0xce, 0x43, 0x5d, 0x55, 0x8d, 0x83, 0x91, 0xdc, 0x14, 0x13, 0x52, 0x81, 0xd4, 0xd8, - 0x97, 0x49, 0x34, 0x8e, 0xa7, 0xcb, 0xee, 0x5f, 0x38, 0xb0, 0x62, 0x0c, 0x58, 0x72, 0xe1, 0xbb, - 0xa0, 0xa4, 0x41, 0x84, 0x44, 0x85, 0xe4, 0x5e, 0xb5, 0xc5, 0x26, 0xfb, 0xcc, 0x22, 0xa6, 0xcd, - 0xf4, 0x67, 0x34, 0xc0, 0x64, 0x3a, 0x96, 0x4a, 0xd4, 0x84, 0x90, 0x91, 0xce, 0x39, 0x7f, 0xa6, - 0x49, 0x84, 0x1a, 0xb7, 0x30, 0x4a, 0xd0, 0x40, 0x9f, 0x56, 0x13, 0x09, 0x7b, 0x66, 0x83, 0xee, - 0x3f, 0x38, 0xb0, 0x2a, 0x0e, 0x27, 0xf2, 0xe8, 0xa7, 0x5f, 0x34, 0xcc, 0x8b, 0xd3, 0x98, 0x90, - 0xc8, 0xfd, 0x2b, 0x9e, 0x2c, 0xb3, 0xcf, 0xbc, 0xe0, 0x81, 0x4a, 0x27, 0xe6, 0x5c, 0xb0, 0x17, - 0x73, 0x65, 0x7b, 0xf1, 0x9c, 0x95, 0x2e, 0x0b, 0x01, 0xd6, 0x4a, 0x43, 0x80, 0xf7, 0x17, 0xa0, - 0x96, 0xf4, 0xa3, 0x09, 0x77, 0x37, 0x60, 0xcd, 0x9e, 0x9c, 0x54, 0x41, 0xdf, 0x75, 0xa0, 0xf3, - 0x40, 0x84, 0xca, 0x83, 0x70, 0xb8, 0x1f, 0x24, 0x69, 0x14, 0xeb, 0x67, 0x5a, 0x37, 0x00, 0x92, - 0xd4, 0x8f, 0x53, 0x91, 0x6e, 0x29, 0x03, 0x74, 0x19, 0x82, 0x63, 0xe4, 0xe1, 0x40, 0xd4, 0x8a, - 0xbd, 0xd1, 0xe5, 0x82, 0x0f, 0x21, 0x8f, 0x4f, 0x96, 0x25, 0x7e, 0x5d, 0x64, 0xba, 0xa1, 0xaf, - 0xc0, 0xcf, 0x48, 0xaf, 0x8b, 0x73, 0x49, 0x0e, 0x75, 0xff, 0xd4, 0x81, 0xe5, 0x6c, 0x90, 0x7b, - 0x08, 0xda, 0xda, 0x41, 0x9a, 0xdf, 0x4c, 0x3b, 0xa8, 0xd0, 0x61, 0x80, 0xf6, 0x58, 0x8e, 0xcd, - 0x40, 0x48, 0x62, 0x65, 0x29, 0x9a, 0x2a, 0x07, 0xc7, 0x84, 0x44, 0xd6, 0x08, 0x7a, 0x02, 0xd2, - 0xab, 0x91, 0x25, 0xca, 0x96, 0x1d, 0xa7, 0xf4, 0xd5, 0xbc, 0x38, 0x98, 0xc9, 0xa2, 0x32, 0xa5, - 0x0b, 0x84, 0xe2, 0x4f, 0xf7, 0xdb, 0x0e, 0x5c, 0x2b, 0x59, 0x5c, 0x29, 0x19, 0xbb, 0xb0, 0x72, - 0xa2, 0x2b, 0xd5, 0x02, 0x08, 0xf1, 0xd8, 0x50, 0x77, 0x3b, 0xf6, 0xa4, 0xbd, 0xe2, 0x07, 0xda, - 0xf7, 0x11, 0x4b, 0x6a, 0x25, 0x6f, 0x15, 0x2b, 0xb6, 0x7e, 0x7b, 0x0e, 0x96, 0xc4, 0x9d, 0x9f, - 0x78, 0x54, 0xcd, 0x63, 0xf6, 0x1e, 0x2c, 0xc8, 0x47, 0xf1, 0x6c, 0x5d, 0x76, 0x6b, 0x3f, 0xc3, - 0xef, 0x6e, 0xe4, 0x61, 0xc9, 0x3b, 0xab, 0xbf, 0xf2, 0xc3, 0x7f, 0xfe, 0x9d, 0xca, 0x22, 0x6b, - 0xde, 0x3d, 0x7b, 0xf3, 0xee, 0x90, 0x87, 0x09, 0xb6, 0xf1, 0xf3, 0x00, 0xd9, 0x73, 0x71, 0xd6, - 0xd1, 0x3e, 0x5b, 0xee, 0x1d, 0x7c, 0xf7, 0x5a, 0x49, 0x8d, 0x6c, 0xf7, 0x1a, 0xb5, 0xbb, 0xea, - 0x2e, 0x61, 0xbb, 0x41, 0x18, 0xa4, 0xe2, 0xed, 0xf8, 0x3b, 0xce, 0x26, 0x1b, 0x40, 0xcb, 0x7c, - 0x0d, 0xce, 0x54, 0xe8, 0xa6, 0xe4, 0x2d, 0x7a, 0xf7, 0xa5, 0xd2, 0x3a, 0x15, 0xb7, 0xa2, 0x3e, - 0xd6, 0xdd, 0x36, 0xf6, 0x31, 0x25, 0x8a, 0xac, 0x97, 0x11, 0x2c, 0xd9, 0x8f, 0xbe, 0xd9, 0x75, - 0x43, 0xac, 0x0b, 0x4f, 0xce, 0xbb, 0x2f, 0x5f, 0x50, 0x2b, 0xfb, 0x7a, 0x99, 0xfa, 0xba, 0xea, - 0x32, 0xec, 0xab, 0x4f, 0x34, 0xea, 0xc9, 0xf9, 0x3b, 0xce, 0xe6, 0xd6, 0xef, 0xbe, 0x02, 0x0d, - 0x1d, 0x6c, 0x65, 0x5f, 0x87, 0x45, 0xeb, 0x52, 0x96, 0xa9, 0x69, 0x94, 0xdd, 0xe1, 0x76, 0xaf, - 0x97, 0x57, 0xca, 0x8e, 0x6f, 0x50, 0xc7, 0x1d, 0xb6, 0x81, 0x1d, 0xcb, 0x5b, 0xcd, 0xbb, 0x74, - 0x15, 0x2d, 0x72, 0x71, 0x9f, 0x89, 0x79, 0x66, 0x17, 0xa9, 0xd6, 0x3c, 0x0b, 0x17, 0xaf, 0xd6, - 0x3c, 0x8b, 0xb7, 0xaf, 0xee, 0x75, 0xea, 0x6e, 0x83, 0xad, 0x99, 0xdd, 0xe9, 0x20, 0x28, 0xa7, - 0xec, 0x69, 0xf3, 0x4d, 0x38, 0x7b, 0x59, 0x33, 0x56, 0xd9, 0x5b, 0x71, 0xcd, 0x22, 0xc5, 0x07, - 0xe3, 0x6e, 0x87, 0xba, 0x62, 0x8c, 0xb6, 0xcf, 0x7c, 0x12, 0xce, 0xbe, 0x0a, 0x0d, 0xfd, 0xb8, - 0x91, 0x5d, 0x35, 0x5e, 0x94, 0x9a, 0x2f, 0x2e, 0xbb, 0x9d, 0x62, 0x45, 0x19, 0x63, 0x98, 0x2d, - 0x23, 0x63, 0x1c, 0xc0, 0xba, 0x3c, 0x03, 0x1c, 0xf3, 0x1f, 0x65, 0x26, 0x25, 0x2f, 0xd9, 0xef, - 0x39, 0xec, 0x5d, 0xa8, 0xab, 0x37, 0xa3, 0x6c, 0xa3, 0xfc, 0xed, 0x6b, 0xf7, 0x6a, 0x01, 0x97, - 0xda, 0xe3, 0xcb, 0x00, 0xd9, 0x5b, 0x48, 0x2d, 0x67, 0x85, 0x57, 0x98, 0x7a, 0x11, 0x8b, 0x0f, - 0x27, 0xdd, 0x0d, 0x9a, 0x6a, 0x9b, 0x91, 0x9c, 0x85, 0xfc, 0x5c, 0xa5, 0xfd, 0x7f, 0x0d, 0x9a, - 0xc6, 0x73, 0x48, 0xa6, 0x5a, 0x28, 0x3e, 0xa5, 0xec, 0x76, 0xcb, 0xaa, 0x64, 0xeb, 0x5d, 0x6a, - 0x7d, 0xcd, 0x5d, 0xc6, 0xd6, 0x93, 0x60, 0x18, 0x8e, 0x05, 0x01, 0xae, 0xe3, 0x29, 0x2c, 0x5a, - 0x6f, 0x1e, 0x35, 0x93, 0x97, 0xbd, 0xa8, 0xd4, 0x4c, 0x5e, 0xfa, 0x4c, 0x52, 0x71, 0x9d, 0xbb, - 0x82, 0xfd, 0x9c, 0x11, 0x89, 0xd1, 0xd3, 0x57, 0xa0, 0x69, 0xbc, 0x5f, 0x64, 0x46, 0x9a, 0x62, - 0xee, 0xe5, 0xa2, 0x9e, 0x4b, 0xd9, 0x73, 0xc7, 0x35, 0xea, 0x63, 0xc9, 0x6d, 0x60, 0x1f, 0x94, - 0x35, 0x8f, 0x6d, 0x7f, 0x1d, 0x96, 0xec, 0x17, 0x8d, 0x5a, 0x7c, 0x4a, 0xdf, 0x46, 0x6a, 0xf1, - 0xb9, 0xe0, 0x19, 0xa4, 0xe4, 0xbc, 0xcd, 0x55, 0xdd, 0xc9, 0xdd, 0x8f, 0xe4, 0x0d, 0xe5, 0xc7, - 0xec, 0x8b, 0xa8, 0x23, 0xe4, 0x33, 0x06, 0x96, 0xbd, 0xe3, 0xb4, 0x1f, 0x3b, 0x68, 0xb6, 0x2e, - 0xbc, 0x78, 0x70, 0x57, 0xa8, 0xf1, 0x26, 0xcb, 0x66, 0x20, 0x14, 0x3f, 0x3d, 0x67, 0x30, 0x14, - 0xbf, 0xf9, 0xe2, 0xc1, 0x50, 0xfc, 0xd6, 0xab, 0x87, 0xbc, 0xe2, 0x4f, 0x03, 0x6c, 0x23, 0x84, - 0xe5, 0x5c, 0x9e, 0x8e, 0x96, 0x8a, 0xf2, 0xc4, 0xc6, 0xee, 0x8d, 0xe7, 0xa7, 0xf7, 0xd8, 0xfa, - 0x44, 0xe9, 0x91, 0xbb, 0x2a, 0x0f, 0xf5, 0x17, 0xa0, 0x65, 0xbe, 0x44, 0xd3, 0xa6, 0xa0, 0xe4, - 0xfd, 0x9c, 0x36, 0x05, 0x65, 0x4f, 0xd7, 0xd4, 0xe6, 0xb2, 0x96, 0xd9, 0x0d, 0x6e, 0xae, 0xfd, - 0x14, 0x27, 0xd3, 0x8d, 0x65, 0x2f, 0x90, 0x32, 0xdd, 0x58, 0xfa, 0x7e, 0x47, 0x6d, 0x2e, 0x5b, - 0xb5, 0xe6, 0x22, 0x82, 0xc9, 0xec, 0x2b, 0xb0, 0x6c, 0x24, 0xc1, 0x1d, 0xcd, 0xc2, 0xbe, 0x66, - 0xd4, 0x62, 0xba, 0x75, 0xb7, 0xcc, 0xc5, 0x74, 0xaf, 0x52, 0xfb, 0x2b, 0xae, 0x35, 0x09, 0x64, - 0xd2, 0x1d, 0x68, 0x9a, 0x09, 0x76, 0xcf, 0x69, 0xf7, 0xaa, 0x51, 0x65, 0x66, 0x0b, 0xdf, 0x73, - 0xd8, 0xef, 0x3b, 0xd0, 0xb2, 0xd2, 0xd5, 0xac, 0x2b, 0x93, 0x5c, 0x3b, 0x1d, 0xb3, 0xce, 0x6c, - 0xc8, 0xf5, 0x68, 0x90, 0x07, 0x9b, 0x3f, 0x6b, 0x2d, 0xc2, 0x47, 0xd6, 0x51, 0xe5, 0x4e, 0xfe, - 0x4f, 0x0b, 0x3e, 0xce, 0x13, 0x98, 0x29, 0xe9, 0x1f, 0xdf, 0x73, 0xd8, 0xf7, 0x1d, 0x58, 0xb2, - 0x0f, 0xd8, 0x7a, 0xab, 0x4a, 0x8f, 0xf2, 0x7a, 0xab, 0x2e, 0x38, 0x95, 0x7f, 0x85, 0x46, 0xf9, - 0x74, 0xd3, 0xb3, 0x46, 0x29, 0x1f, 0x69, 0xfd, 0x64, 0xa3, 0x65, 0xef, 0x88, 0xbf, 0x19, 0x51, - 0x51, 0x1f, 0x66, 0x68, 0xf7, 0xfc, 0xf6, 0x9a, 0xff, 0xb1, 0x71, 0xdb, 0xb9, 0xe7, 0xb0, 0xaf, - 0x89, 0xff, 0x51, 0x90, 0xdf, 0x12, 0x97, 0xbc, 0xe8, 0xf7, 0xee, 0x6b, 0x34, 0xa7, 0x1b, 0xee, - 0x35, 0x6b, 0x4e, 0x79, 0xf3, 0xb6, 0x2d, 0x46, 0x27, 0xff, 0x1e, 0x23, 0x53, 0xfc, 0x85, 0xbf, - 0xcc, 0xb8, 0x78, 0x90, 0x63, 0x31, 0x48, 0x49, 0x6e, 0xb1, 0xf2, 0x0b, 0x36, 0xe3, 0x6e, 0xd2, - 0x58, 0x5f, 0x73, 0x5f, 0xb9, 0x70, 0xac, 0x77, 0xe9, 0x98, 0x8c, 0x23, 0x3e, 0x04, 0xc8, 0x22, - 0xb4, 0x2c, 0x17, 0x21, 0xd4, 0xb6, 0xaf, 0x18, 0xc4, 0xb5, 0xe5, 0x45, 0x05, 0x12, 0xb1, 0xc5, - 0xaf, 0x0a, 0xb5, 0xf2, 0x48, 0xc5, 0x16, 0xaf, 0x19, 0xaa, 0xc3, 0x0e, 0xa5, 0x76, 0xbb, 0x65, - 0x55, 0x65, 0x4a, 0x45, 0x07, 0x2a, 0xdf, 0x87, 0xc5, 0x83, 0x28, 0x7a, 0x36, 0x9d, 0xe8, 0xfb, - 0x0e, 0x3b, 0x82, 0xb5, 0xef, 0x27, 0xa7, 0xdd, 0xdc, 0x2c, 0xdc, 0x9b, 0xd4, 0x54, 0x97, 0x75, - 0x8c, 0xa6, 0xee, 0x7e, 0x94, 0x45, 0x80, 0x3f, 0x66, 0x3e, 0xac, 0x68, 0xb7, 0x44, 0x0f, 0xbc, - 0x6b, 0x37, 0x63, 0xc6, 0x2e, 0x0b, 0x5d, 0x58, 0x8e, 0xa2, 0x1a, 0xed, 0xdd, 0x44, 0xb5, 0x79, - 0xcf, 0x61, 0x87, 0xd0, 0xda, 0xe5, 0xfd, 0x68, 0xc0, 0x65, 0x18, 0x68, 0x35, 0x1b, 0xb8, 0x8e, - 0x1f, 0x75, 0x17, 0x2d, 0xd0, 0xd6, 0xdf, 0x13, 0x7f, 0x16, 0xf3, 0x6f, 0xdc, 0xfd, 0x48, 0x06, - 0x98, 0x3e, 0x56, 0xfa, 0x5b, 0x45, 0xe0, 0x2c, 0xfd, 0x9d, 0x0b, 0xd9, 0x59, 0xfa, 0xbb, 0x10, - 0xb2, 0xb3, 0x96, 0x5a, 0x45, 0x00, 0xd9, 0x08, 0x56, 0x0a, 0x51, 0x3e, 0xf6, 0x8a, 0xb2, 0xc0, - 0x17, 0xc4, 0x06, 0xbb, 0x37, 0x2f, 0x26, 0xb0, 0x7b, 0xdb, 0xb4, 0x7b, 0x3b, 0x82, 0xc5, 0x5d, - 0x2e, 0x16, 0x4b, 0x24, 0x55, 0xe4, 0x5e, 0x67, 0x9a, 0x29, 0x1b, 0x79, 0x05, 0x4e, 0x75, 0xb6, - 0x81, 0xa6, 0x8c, 0x06, 0xf6, 0x55, 0x68, 0x3e, 0xe4, 0xa9, 0xca, 0xa2, 0xd0, 0x2e, 0x62, 0x2e, - 0xad, 0xa2, 0x5b, 0x92, 0x84, 0x61, 0xf3, 0x0c, 0xb5, 0x76, 0x97, 0x0f, 0x86, 0x5c, 0x28, 0xa7, - 0x5e, 0x30, 0xf8, 0x98, 0xfd, 0x1c, 0x35, 0xae, 0xd3, 0xb8, 0x36, 0x8c, 0xcb, 0x77, 0xb3, 0xf1, - 0xe5, 0x1c, 0x5e, 0xd6, 0x72, 0x18, 0x0d, 0xb8, 0xe1, 0xaa, 0x84, 0xd0, 0x34, 0xb2, 0x0f, 0xb5, - 0x00, 0x15, 0x33, 0x29, 0xb5, 0x00, 0x95, 0x24, 0x2b, 0xba, 0xb7, 0xa9, 0x1f, 0x97, 0xdd, 0xcc, - 0xfa, 0x11, 0x09, 0x8a, 0x59, 0x4f, 0x77, 0x3f, 0xf2, 0xc7, 0xe9, 0xc7, 0xec, 0x03, 0x7a, 0xa9, - 0x69, 0x66, 0x8a, 0x64, 0x3e, 0x6f, 0x3e, 0xa9, 0x44, 0x2f, 0x96, 0x51, 0x65, 0xfb, 0xc1, 0xa2, - 0x2b, 0xf2, 0x68, 0x3e, 0x03, 0x70, 0x94, 0x46, 0x93, 0x5d, 0x9f, 0x8f, 0xa3, 0x30, 0xd3, 0xb5, - 0x59, 0x36, 0x44, 0xa6, 0xbf, 0x8c, 0x94, 0x08, 0xf6, 0x81, 0x71, 0x48, 0xb0, 0x12, 0x6d, 0x14, - 0x73, 0x5d, 0x98, 0x30, 0xa1, 0x17, 0xa4, 0x24, 0x69, 0xe2, 0x9e, 0xc3, 0xb6, 0x01, 0xb2, 0x30, - 0xaf, 0x76, 0xf9, 0x0b, 0x11, 0x64, 0xad, 0xf6, 0x4a, 0x62, 0xc2, 0x87, 0xd0, 0xc8, 0xe2, 0x86, - 0x57, 0xb3, 0x0c, 0x52, 0x2b, 0xca, 0xa8, 0x2d, 0x78, 0x21, 0x9a, 0xe7, 0xb6, 0x69, 0xa9, 0x80, - 0xd5, 0x71, 0xa9, 0x28, 0x44, 0x17, 0xc0, 0xaa, 0x18, 0xa0, 0x76, 0x47, 0xe8, 0x7e, 0x5f, 0xcd, - 0xa4, 0x24, 0xa2, 0xa6, 0xa5, 0xb9, 0x34, 0x20, 0x65, 0x1d, 0xfe, 0x91, 0x5b, 0x45, 0x6e, 0x01, - 0xaa, 0xe6, 0x31, 0xac, 0x14, 0xa2, 0x29, 0x5a, 0xa4, 0x2f, 0x0a, 0x62, 0x69, 0x91, 0xbe, 0x30, - 0x10, 0xe3, 0xae, 0x53, 0x97, 0xcb, 0x2e, 0xd0, 0x49, 0xe5, 0x3c, 0x48, 0xfb, 0xa7, 0xef, 0x38, - 0x9b, 0xc7, 0xf3, 0xf4, 0xb7, 0x84, 0x9f, 0xfa, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0xa9, - 0x08, 0x13, 0xc8, 0x50, 0x00, 0x00, + // 6620 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7c, 0x4b, 0x6c, 0x1c, 0xd9, + 0x75, 0xb6, 0xaa, 0xd9, 0x24, 0xbb, 0x4f, 0x37, 0xc9, 0xe6, 0xe5, 0xab, 0xd5, 0xa3, 0xd1, 0x68, + 0xca, 0x83, 0x91, 0xcc, 0x7f, 0x7e, 0x49, 0x23, 0xdb, 0x83, 0xf1, 0xcc, 0xff, 0xdb, 0x3f, 0x45, + 0x52, 0xa2, 0x7e, 0x73, 0x24, 0xba, 0x28, 0x59, 0xb1, 0x9d, 0xa0, 0x5d, 0xec, 0xbe, 0x6c, 0x96, + 0xd5, 0x5d, 0xd5, 0xae, 0xaa, 0x26, 0xd5, 0x9e, 0x08, 0xc8, 0x0b, 0x09, 0x10, 0xc4, 0x30, 0x82, + 0x2c, 0x02, 0x07, 0x08, 0x02, 0x38, 0x59, 0xd8, 0xcb, 0x2c, 0x62, 0x04, 0x48, 0xb2, 0xcb, 0x26, + 0x01, 0x82, 0x2c, 0xbc, 0x0a, 0x02, 0x64, 0x93, 0x6c, 0x92, 0x20, 0x59, 0x04, 0xc8, 0x32, 0x41, + 0x70, 0xce, 0x7d, 0xd4, 0xbd, 0x55, 0x45, 0x51, 0x7e, 0x24, 0xbb, 0xbe, 0xdf, 0x3d, 0x75, 0x9f, + 0xe7, 0x75, 0xcf, 0x3d, 0xb7, 0xa1, 0x1e, 0x8f, 0x7b, 0x37, 0xc7, 0x71, 0x94, 0x46, 0x6c, 0x76, + 0x18, 0xc6, 0xe3, 0x5e, 0xe7, 0xca, 0x20, 0x8a, 0x06, 0x43, 0x7e, 0xcb, 0x1f, 0x07, 0xb7, 0xfc, + 0x30, 0x8c, 0x52, 0x3f, 0x0d, 0xa2, 0x30, 0x11, 0x44, 0xee, 0xd7, 0x60, 0xf1, 0x3e, 0x0f, 0x0f, + 0x39, 0xef, 0x7b, 0xfc, 0x1b, 0x13, 0x9e, 0xa4, 0xec, 0x7f, 0xc1, 0xb2, 0xcf, 0xbf, 0xc9, 0x79, + 0xbf, 0x3b, 0xf6, 0x93, 0x64, 0x7c, 0x12, 0xfb, 0x09, 0x6f, 0x3b, 0xd7, 0x9c, 0x1b, 0x4d, 0xaf, + 0x25, 0x2a, 0x0e, 0x34, 0xce, 0xde, 0x84, 0x66, 0x82, 0xa4, 0x3c, 0x4c, 0xe3, 0x68, 0x3c, 0x6d, + 0x57, 0x88, 0xae, 0x81, 0xd8, 0xae, 0x80, 0xdc, 0x21, 0x2c, 0xe9, 0x1e, 0x92, 0x71, 0x14, 0x26, + 0x9c, 0xdd, 0x86, 0xd5, 0x5e, 0x30, 0x3e, 0xe1, 0x71, 0x97, 0x3e, 0x1e, 0x85, 0x7c, 0x14, 0x85, + 0x41, 0xaf, 0xed, 0x5c, 0x9b, 0xb9, 0x51, 0xf7, 0x98, 0xa8, 0xc3, 0x2f, 0x3e, 0x92, 0x35, 0xec, + 0x3a, 0x2c, 0xf1, 0x50, 0xe0, 0xbc, 0x4f, 0x5f, 0xc9, 0xae, 0x16, 0x33, 0x18, 0x3f, 0x70, 0xff, + 0xdc, 0x81, 0xe5, 0x07, 0x61, 0x90, 0x3e, 0xf5, 0x87, 0x43, 0x9e, 0xaa, 0x39, 0x5d, 0x87, 0xa5, + 0x33, 0x02, 0x68, 0x4e, 0x67, 0x51, 0xdc, 0x97, 0x33, 0x5a, 0x14, 0xf0, 0x81, 0x44, 0xcf, 0x1d, + 0x59, 0xe5, 0xdc, 0x91, 0x95, 0x2e, 0xd7, 0xcc, 0x39, 0xcb, 0x75, 0x1d, 0x96, 0x62, 0xde, 0x8b, + 0x4e, 0x79, 0x3c, 0xed, 0x9e, 0x05, 0x61, 0x3f, 0x3a, 0x6b, 0x57, 0xaf, 0x39, 0x37, 0x66, 0xbd, + 0x45, 0x05, 0x3f, 0x25, 0xd4, 0x5d, 0x05, 0x66, 0xce, 0x42, 0xac, 0x9b, 0x3b, 0x80, 0x95, 0x27, + 0xe1, 0x30, 0xea, 0x3d, 0xfb, 0x31, 0x67, 0x57, 0xd2, 0x7d, 0xa5, 0xb4, 0xfb, 0x75, 0x58, 0xb5, + 0x3b, 0x92, 0x03, 0xe0, 0xb0, 0xb6, 0x7d, 0xe2, 0x87, 0x03, 0xae, 0x9a, 0x54, 0x43, 0xf8, 0x24, + 0xb4, 0x7a, 0x93, 0x38, 0xe6, 0x61, 0x61, 0x0c, 0x4b, 0x12, 0xd7, 0x83, 0x78, 0x13, 0x9a, 0x21, + 0x3f, 0xcb, 0xc8, 0x24, 0xcb, 0x84, 0xfc, 0x4c, 0x91, 0xb8, 0x6d, 0x58, 0xcf, 0x77, 0x23, 0x07, + 0xf0, 0x2f, 0x0e, 0x54, 0x9f, 0xa4, 0xcf, 0x23, 0x76, 0x13, 0xaa, 0xe9, 0x74, 0x2c, 0x18, 0x73, + 0xf1, 0x0e, 0xbb, 0x49, 0xbc, 0x7e, 0x73, 0xab, 0xdf, 0x8f, 0x79, 0x92, 0x3c, 0x9e, 0x8e, 0xb9, + 0xd7, 0xf4, 0x45, 0xa1, 0x8b, 0x74, 0xac, 0x0d, 0xf3, 0xb2, 0x4c, 0x1d, 0xd6, 0x3d, 0x55, 0x64, + 0x57, 0x01, 0xfc, 0x51, 0x34, 0x09, 0xd3, 0x6e, 0xe2, 0xa7, 0xb4, 0x73, 0x33, 0x9e, 0x81, 0xb0, + 0xb7, 0x60, 0x21, 0xe9, 0xc5, 0xc1, 0x38, 0xed, 0x8e, 0x27, 0x47, 0xcf, 0xf8, 0x94, 0x76, 0xac, + 0xee, 0xd9, 0x20, 0xbb, 0x05, 0xb5, 0x68, 0x92, 0x8e, 0xa3, 0x20, 0x4c, 0xdb, 0xb3, 0xd7, 0x9c, + 0x1b, 0x8d, 0x3b, 0x2b, 0x72, 0x4c, 0x38, 0x93, 0x90, 0x0f, 0x0f, 0xb0, 0xca, 0xd3, 0x44, 0xd8, + 0x6c, 0x2f, 0x0a, 0x8f, 0x83, 0x78, 0x24, 0xe4, 0xb1, 0x3d, 0x47, 0x3d, 0xdb, 0xa0, 0xfb, 0x9d, + 0x0a, 0x34, 0x1e, 0xc7, 0x7e, 0x98, 0xf8, 0x3d, 0x04, 0x70, 0x1a, 0xe9, 0xf3, 0xee, 0x89, 0x9f, + 0x9c, 0xd0, 0xcc, 0xeb, 0x9e, 0x2a, 0xb2, 0x75, 0x98, 0x13, 0x83, 0xa6, 0xf9, 0xcd, 0x78, 0xb2, + 0xc4, 0xde, 0x81, 0xe5, 0x70, 0x32, 0xea, 0xda, 0x7d, 0xcd, 0xd0, 0xae, 0x17, 0x2b, 0x70, 0x31, + 0x8e, 0x70, 0xdf, 0x45, 0x17, 0x62, 0xa6, 0x06, 0xc2, 0x5c, 0x68, 0xca, 0x12, 0x0f, 0x06, 0x27, + 0x62, 0xaa, 0xb3, 0x9e, 0x85, 0x61, 0x1b, 0x69, 0x30, 0xe2, 0xdd, 0x24, 0xf5, 0x47, 0x63, 0x39, + 0x2d, 0x03, 0xa1, 0xfa, 0x28, 0xf5, 0x87, 0xdd, 0x63, 0xce, 0x93, 0xf6, 0xbc, 0xac, 0xd7, 0x08, + 0x7b, 0x1b, 0x16, 0xfb, 0x3c, 0x49, 0xbb, 0x72, 0x83, 0x78, 0xd2, 0xae, 0x91, 0xf4, 0xe5, 0x50, + 0xe4, 0x92, 0xfb, 0x3c, 0x35, 0x56, 0x27, 0x91, 0xdc, 0xe8, 0xee, 0x03, 0x33, 0xe0, 0x1d, 0x9e, + 0xfa, 0xc1, 0x30, 0x61, 0xef, 0x41, 0x33, 0x35, 0x88, 0x49, 0xdb, 0x34, 0x34, 0xeb, 0x18, 0x1f, + 0x78, 0x16, 0x9d, 0x7b, 0x1f, 0x6a, 0xf7, 0x38, 0xdf, 0x0f, 0x46, 0x41, 0xca, 0xd6, 0x61, 0xf6, + 0x38, 0x78, 0xce, 0x05, 0x73, 0xcf, 0xec, 0x5d, 0xf2, 0x44, 0x91, 0x75, 0x60, 0x7e, 0xcc, 0xe3, + 0x1e, 0x57, 0xcb, 0xbf, 0x77, 0xc9, 0x53, 0xc0, 0xdd, 0x79, 0x98, 0x1d, 0xe2, 0xc7, 0xee, 0xf7, + 0x2a, 0xd0, 0x38, 0xe4, 0xa1, 0x16, 0x1a, 0x06, 0x55, 0x9c, 0x92, 0x14, 0x14, 0xfa, 0xcd, 0xde, + 0x80, 0x06, 0x4d, 0x33, 0x49, 0xe3, 0x20, 0x1c, 0x48, 0x5e, 0x05, 0x84, 0x0e, 0x09, 0x61, 0x2d, + 0x98, 0xf1, 0x47, 0x8a, 0x4f, 0xf1, 0x27, 0x0a, 0xd4, 0xd8, 0x9f, 0x8e, 0x50, 0xf6, 0xf4, 0xae, + 0x35, 0xbd, 0x86, 0xc4, 0xf6, 0x70, 0xdb, 0x6e, 0xc2, 0x8a, 0x49, 0xa2, 0x5a, 0x9f, 0xa5, 0xd6, + 0x97, 0x0d, 0x4a, 0xd9, 0xc9, 0x75, 0x58, 0x52, 0xf4, 0xb1, 0x18, 0x2c, 0xed, 0x63, 0xdd, 0x5b, + 0x94, 0xb0, 0x9a, 0xc2, 0x0d, 0x68, 0x1d, 0x07, 0xa1, 0x3f, 0xec, 0xf6, 0x86, 0xe9, 0x69, 0xb7, + 0xcf, 0x87, 0xa9, 0x4f, 0x3b, 0x3a, 0xeb, 0x2d, 0x12, 0xbe, 0x3d, 0x4c, 0x4f, 0x77, 0x10, 0x65, + 0xef, 0x40, 0xfd, 0x98, 0xf3, 0x2e, 0xad, 0x44, 0xbb, 0x46, 0x12, 0xb2, 0x24, 0x97, 0x5e, 0xad, + 0xae, 0x57, 0x3b, 0x96, 0xbf, 0xdc, 0x3f, 0x76, 0xa0, 0x29, 0x96, 0x4a, 0x9a, 0x8c, 0xb7, 0x60, + 0x41, 0x8d, 0x88, 0xc7, 0x71, 0x14, 0x4b, 0xf6, 0xb7, 0x41, 0xb6, 0x09, 0x2d, 0x05, 0x8c, 0x63, + 0x1e, 0x8c, 0xfc, 0x01, 0x97, 0xfa, 0xa5, 0x80, 0xb3, 0x3b, 0x59, 0x8b, 0x71, 0x34, 0x49, 0x85, + 0xd2, 0x6e, 0xdc, 0x69, 0xca, 0x41, 0x79, 0x88, 0x79, 0x36, 0x09, 0xb2, 0x7f, 0xc9, 0x52, 0x5b, + 0x98, 0xfb, 0x2d, 0x07, 0x18, 0x0e, 0xfd, 0x71, 0x24, 0x9a, 0x90, 0x2b, 0x95, 0xdf, 0x25, 0xe7, + 0x95, 0x77, 0xa9, 0x72, 0xde, 0x2e, 0xbd, 0x05, 0x73, 0x34, 0x2c, 0x94, 0xe7, 0x99, 0xc2, 0xd0, + 0x65, 0x9d, 0xfb, 0x5d, 0x07, 0x9a, 0xa6, 0x0e, 0x62, 0xb7, 0x81, 0x1d, 0x4f, 0xc2, 0x7e, 0x10, + 0x0e, 0xba, 0xe9, 0xf3, 0xa0, 0xdf, 0x3d, 0x9a, 0x62, 0x13, 0x34, 0x9e, 0xbd, 0x4b, 0x5e, 0x49, + 0x1d, 0x7b, 0x07, 0x5a, 0x16, 0x9a, 0xa4, 0xb1, 0x18, 0xd5, 0xde, 0x25, 0xaf, 0x50, 0x83, 0x8b, + 0x84, 0x5a, 0x6e, 0x92, 0x76, 0x83, 0xb0, 0xcf, 0x9f, 0xd3, 0xba, 0x2e, 0x78, 0x16, 0x76, 0x77, + 0x11, 0x9a, 0xe6, 0x77, 0xee, 0xe7, 0xa0, 0xb5, 0x8f, 0xca, 0x23, 0x0c, 0xc2, 0x81, 0x54, 0xe2, + 0xa8, 0xd1, 0xa4, 0xc6, 0x15, 0x7b, 0x2d, 0x4b, 0x28, 0x36, 0x27, 0x51, 0x92, 0xca, 0x75, 0xa1, + 0xdf, 0xee, 0xdf, 0x3b, 0xb0, 0x84, 0x8b, 0xfe, 0x91, 0x1f, 0x4e, 0xd5, 0x8a, 0xef, 0x43, 0x13, + 0x9b, 0x7a, 0x1c, 0x6d, 0x09, 0xbd, 0x28, 0xe4, 0xfd, 0x86, 0x5c, 0xa4, 0x1c, 0xf5, 0x4d, 0x93, + 0x14, 0x5d, 0x97, 0xa9, 0x67, 0x7d, 0x8d, 0x82, 0x99, 0xfa, 0xf1, 0x80, 0xa7, 0xa4, 0x31, 0xa5, + 0x06, 0x05, 0x01, 0x6d, 0x47, 0xe1, 0x31, 0xbb, 0x06, 0xcd, 0xc4, 0x4f, 0xbb, 0x63, 0x1e, 0xd3, + 0xaa, 0x91, 0x70, 0xcd, 0x78, 0x90, 0xf8, 0xe9, 0x01, 0x8f, 0xef, 0x4e, 0x53, 0xde, 0xf9, 0x3c, + 0x2c, 0x17, 0x7a, 0x41, 0x79, 0xce, 0xa6, 0x88, 0x3f, 0xd9, 0x2a, 0xcc, 0x9e, 0xfa, 0xc3, 0x09, + 0x97, 0x8a, 0x5c, 0x14, 0x3e, 0xa8, 0xbc, 0xef, 0xb8, 0x6f, 0x43, 0x2b, 0x1b, 0xb6, 0x14, 0x0c, + 0x06, 0x55, 0x5c, 0x41, 0xd9, 0x00, 0xfd, 0x76, 0x7f, 0xd1, 0x11, 0x84, 0xdb, 0x51, 0xa0, 0x95, + 0x22, 0x12, 0xa2, 0xee, 0x54, 0x84, 0xf8, 0xfb, 0x5c, 0xa3, 0xf1, 0x93, 0x4f, 0xd6, 0xbd, 0x0e, + 0xcb, 0xc6, 0x10, 0x5e, 0x32, 0xd8, 0x87, 0xc0, 0xf6, 0x83, 0x24, 0x7d, 0x12, 0x26, 0x63, 0x43, + 0xb1, 0xbc, 0x06, 0xf5, 0x51, 0x10, 0x52, 0xf7, 0x82, 0x37, 0x67, 0xbd, 0xda, 0x28, 0x08, 0xb1, + 0xf3, 0x84, 0x2a, 0xfd, 0xe7, 0xb2, 0xb2, 0x22, 0x2b, 0xfd, 0xe7, 0x54, 0xe9, 0xbe, 0x0f, 0x2b, + 0x56, 0x7b, 0xb2, 0xeb, 0x37, 0x61, 0x76, 0x92, 0x3e, 0x8f, 0x94, 0xda, 0x6f, 0x48, 0x36, 0x40, + 0x67, 0xc2, 0x13, 0x35, 0xee, 0x87, 0xb0, 0xfc, 0x90, 0x9f, 0x49, 0xf6, 0x53, 0x03, 0x79, 0xfb, + 0x42, 0x47, 0x83, 0xea, 0xdd, 0x9b, 0xc0, 0xcc, 0x8f, 0x65, 0xaf, 0x86, 0xdb, 0xe1, 0x58, 0x6e, + 0x87, 0xfb, 0x36, 0xb0, 0xc3, 0x60, 0x10, 0x7e, 0xc4, 0x93, 0xc4, 0x1f, 0x68, 0x2d, 0xd1, 0x82, + 0x99, 0x51, 0x32, 0x90, 0xca, 0x01, 0x7f, 0xba, 0x9f, 0x82, 0x15, 0x8b, 0x4e, 0x36, 0x7c, 0x05, + 0xea, 0x49, 0x30, 0x08, 0xfd, 0x74, 0x12, 0x73, 0xd9, 0x74, 0x06, 0xb8, 0xf7, 0x60, 0xf5, 0x4b, + 0x3c, 0x0e, 0x8e, 0xa7, 0x17, 0x35, 0x6f, 0xb7, 0x53, 0xc9, 0xb7, 0xb3, 0x0b, 0x6b, 0xb9, 0x76, + 0x64, 0xf7, 0x82, 0x47, 0xe5, 0x4e, 0xd6, 0x3c, 0x51, 0x30, 0x24, 0xb6, 0x62, 0x4a, 0xac, 0xfb, + 0x04, 0xd8, 0x76, 0x14, 0x86, 0xbc, 0x97, 0x1e, 0x70, 0x1e, 0x67, 0x07, 0x8d, 0x8c, 0x21, 0x1b, + 0x77, 0x36, 0xe4, 0xca, 0xe6, 0xd5, 0x80, 0xe4, 0x54, 0x06, 0xd5, 0x31, 0x8f, 0x47, 0xd4, 0x70, + 0xcd, 0xa3, 0xdf, 0xee, 0x1a, 0xac, 0x58, 0xcd, 0x4a, 0x1f, 0xf1, 0x5d, 0x58, 0xdb, 0x09, 0x92, + 0x5e, 0xb1, 0xc3, 0x36, 0xcc, 0x8f, 0x27, 0x47, 0xdd, 0x4c, 0xdc, 0x54, 0x11, 0x5d, 0x89, 0xfc, + 0x27, 0xb2, 0xb1, 0x5f, 0x75, 0xa0, 0xba, 0xf7, 0x78, 0x7f, 0x9b, 0x75, 0xa0, 0x16, 0x84, 0xbd, + 0x68, 0x84, 0x1a, 0x59, 0x4c, 0x5a, 0x97, 0xcf, 0x15, 0xa3, 0x2b, 0x50, 0x27, 0x45, 0x8e, 0xde, + 0x91, 0x3c, 0x13, 0x64, 0x00, 0x7a, 0x66, 0xfc, 0xf9, 0x38, 0x88, 0xc9, 0xf5, 0x52, 0x0e, 0x55, + 0x95, 0x94, 0x65, 0xb1, 0xc2, 0xfd, 0xcf, 0x2a, 0xcc, 0x4b, 0x35, 0x4e, 0xfd, 0xf5, 0xd2, 0xe0, + 0x94, 0xcb, 0x91, 0xc8, 0x12, 0x1a, 0xc9, 0x98, 0x8f, 0xa2, 0x94, 0x77, 0xad, 0x6d, 0xb0, 0x41, + 0xf2, 0x3c, 0x45, 0x43, 0x5d, 0xe1, 0xaf, 0xce, 0x08, 0x2a, 0x0b, 0xc4, 0xc5, 0x42, 0xa0, 0x1b, + 0xf4, 0x69, 0x4c, 0x55, 0x4f, 0x15, 0x71, 0x25, 0x7a, 0xfe, 0xd8, 0xef, 0x05, 0xe9, 0x54, 0xca, + 0xbd, 0x2e, 0x63, 0xdb, 0xc3, 0xa8, 0xe7, 0x0f, 0xbb, 0x47, 0xfe, 0xd0, 0x0f, 0x7b, 0x5c, 0x79, + 0xb5, 0x16, 0x88, 0x1e, 0x9e, 0x1c, 0x92, 0x22, 0x13, 0x5e, 0x60, 0x0e, 0x45, 0x4f, 0xb1, 0x17, + 0x8d, 0x46, 0x41, 0x8a, 0x8e, 0x21, 0x39, 0x0d, 0x33, 0x9e, 0x81, 0x08, 0x1f, 0x9a, 0x4a, 0x67, + 0x62, 0xf5, 0xea, 0xca, 0x87, 0x36, 0x40, 0x6c, 0x05, 0x3d, 0x0f, 0xd4, 0x55, 0xcf, 0xce, 0xda, + 0x20, 0x5a, 0xc9, 0x10, 0xdc, 0x87, 0x49, 0x98, 0xf0, 0x34, 0x1d, 0xf2, 0xbe, 0x1e, 0x50, 0x83, + 0xc8, 0x8a, 0x15, 0xec, 0x36, 0xac, 0x08, 0x5f, 0x35, 0xf1, 0xd3, 0x28, 0x39, 0x09, 0x92, 0x6e, + 0x82, 0x5e, 0x5f, 0x93, 0xe8, 0xcb, 0xaa, 0xd8, 0xfb, 0xb0, 0x91, 0x83, 0x63, 0xde, 0xe3, 0xc1, + 0x29, 0xef, 0xb7, 0x17, 0xe8, 0xab, 0xf3, 0xaa, 0xd9, 0x35, 0x68, 0xa0, 0x8b, 0x3e, 0x19, 0xf7, + 0x7d, 0x34, 0xd1, 0x8b, 0xb4, 0x0f, 0x26, 0xc4, 0xde, 0x85, 0x85, 0x31, 0x17, 0x76, 0xf4, 0x24, + 0x1d, 0xf6, 0x92, 0xf6, 0x92, 0xa5, 0xdd, 0x90, 0x73, 0x3d, 0x9b, 0x02, 0x99, 0xb2, 0x97, 0x90, + 0xaf, 0xe6, 0x4f, 0xdb, 0x2d, 0x62, 0xb7, 0x0c, 0x20, 0x19, 0x89, 0x83, 0x53, 0x3f, 0xe5, 0xed, + 0x65, 0xe2, 0x2d, 0x55, 0x74, 0x7f, 0xcf, 0x11, 0x8a, 0x55, 0x32, 0xa1, 0x56, 0x90, 0x6f, 0x40, + 0x43, 0xb0, 0x5f, 0x37, 0x0a, 0x87, 0x53, 0xc9, 0x91, 0x20, 0xa0, 0x47, 0xe1, 0x70, 0xca, 0x3e, + 0x01, 0x0b, 0x41, 0x68, 0x92, 0x08, 0x19, 0x6e, 0x2a, 0x90, 0x88, 0xde, 0x80, 0xc6, 0x78, 0x72, + 0x34, 0x0c, 0x7a, 0x82, 0x64, 0x46, 0xb4, 0x22, 0x20, 0x22, 0x40, 0xff, 0x49, 0x8c, 0x44, 0x50, + 0x54, 0x89, 0xa2, 0x21, 0x31, 0x24, 0x71, 0xef, 0xc2, 0xaa, 0x3d, 0x40, 0xa9, 0xac, 0x36, 0xa1, + 0x26, 0x79, 0x3b, 0x69, 0x37, 0x68, 0x7d, 0x16, 0xed, 0xb3, 0x99, 0xa7, 0xeb, 0xdd, 0x1f, 0x54, + 0x61, 0x45, 0xa2, 0xdb, 0xc3, 0x28, 0xe1, 0x87, 0x93, 0xd1, 0xc8, 0x8f, 0x4b, 0x84, 0xc6, 0xb9, + 0x40, 0x68, 0x2a, 0xb6, 0xd0, 0x20, 0x2b, 0x9f, 0xf8, 0x41, 0x28, 0x9c, 0x3f, 0x21, 0x71, 0x06, + 0xc2, 0x6e, 0xc0, 0x52, 0x6f, 0x18, 0x25, 0xc2, 0x21, 0x32, 0x4f, 0x5f, 0x79, 0xb8, 0x28, 0xe4, + 0xb3, 0x65, 0x42, 0x6e, 0x0a, 0xe9, 0x5c, 0x4e, 0x48, 0x5d, 0x68, 0x62, 0xa3, 0x5c, 0xe9, 0x9c, + 0x79, 0xe1, 0xa0, 0x99, 0x18, 0x8e, 0x27, 0x2f, 0x12, 0x42, 0xfe, 0x96, 0xca, 0x04, 0x02, 0x0f, + 0x77, 0xa8, 0xd3, 0x0c, 0xea, 0xba, 0x14, 0x88, 0x62, 0x15, 0xbb, 0x07, 0x20, 0xfa, 0x22, 0xc3, + 0x0a, 0x64, 0x58, 0xdf, 0xb6, 0x77, 0xc4, 0x5c, 0xfb, 0x9b, 0x58, 0x98, 0xc4, 0x9c, 0x8c, 0xad, + 0xf1, 0xa5, 0xfb, 0xeb, 0x0e, 0x34, 0x8c, 0x3a, 0xb6, 0x06, 0xcb, 0xdb, 0x8f, 0x1e, 0x1d, 0xec, + 0x7a, 0x5b, 0x8f, 0x1f, 0x7c, 0x69, 0xb7, 0xbb, 0xbd, 0xff, 0xe8, 0x70, 0xb7, 0x75, 0x09, 0xe1, + 0xfd, 0x47, 0xdb, 0x5b, 0xfb, 0xdd, 0x7b, 0x8f, 0xbc, 0x6d, 0x05, 0x3b, 0x6c, 0x1d, 0x98, 0xb7, + 0xfb, 0xd1, 0xa3, 0xc7, 0xbb, 0x16, 0x5e, 0x61, 0x2d, 0x68, 0xde, 0xf5, 0x76, 0xb7, 0xb6, 0xf7, + 0x24, 0x32, 0xc3, 0x56, 0xa1, 0x75, 0xef, 0xc9, 0xc3, 0x9d, 0x07, 0x0f, 0xef, 0x77, 0xb7, 0xb7, + 0x1e, 0x6e, 0xef, 0xee, 0xef, 0xee, 0xb4, 0xaa, 0x6c, 0x01, 0xea, 0x5b, 0x77, 0xb7, 0x1e, 0xee, + 0x3c, 0x7a, 0xb8, 0xbb, 0xd3, 0x9a, 0x75, 0xff, 0xce, 0x81, 0x35, 0x1a, 0x75, 0x3f, 0x2f, 0x20, + 0xd7, 0xa0, 0xd1, 0x8b, 0xa2, 0x31, 0x47, 0x7d, 0xae, 0x55, 0xb6, 0x09, 0x21, 0xf3, 0x0b, 0x05, + 0x79, 0x1c, 0xc5, 0x3d, 0x2e, 0xe5, 0x03, 0x08, 0xba, 0x87, 0x08, 0x32, 0xbf, 0xdc, 0x5e, 0x41, + 0x21, 0xc4, 0xa3, 0x21, 0x30, 0x41, 0xb2, 0x0e, 0x73, 0x47, 0x31, 0xf7, 0x7b, 0x27, 0x52, 0x32, + 0x64, 0x89, 0x7d, 0x32, 0xf3, 0xdd, 0x7b, 0xb8, 0xfa, 0x43, 0xde, 0x27, 0x8e, 0xa9, 0x79, 0x4b, + 0x12, 0xdf, 0x96, 0x30, 0x6a, 0x06, 0xff, 0xc8, 0x0f, 0xfb, 0x51, 0xc8, 0xfb, 0xc4, 0x34, 0x35, + 0x2f, 0x03, 0xdc, 0x03, 0x58, 0xcf, 0xcf, 0x4f, 0xca, 0xd7, 0x7b, 0x86, 0x7c, 0x09, 0xef, 0xaa, + 0x73, 0xfe, 0x6e, 0x1a, 0xb2, 0xf6, 0x4f, 0x0e, 0x54, 0xd1, 0xd8, 0x9e, 0x6f, 0x98, 0x4d, 0xff, + 0x69, 0xa6, 0x10, 0xb6, 0xa1, 0xc3, 0x89, 0x50, 0xbf, 0xc2, 0x44, 0x19, 0x48, 0x56, 0x1f, 0xf3, + 0xde, 0x29, 0xcd, 0x58, 0xd7, 0x23, 0x82, 0x02, 0x82, 0x1e, 0x2c, 0x7d, 0x2d, 0x05, 0x44, 0x95, + 0x55, 0x1d, 0x7d, 0x39, 0x9f, 0xd5, 0xd1, 0x77, 0x6d, 0x98, 0x0f, 0xc2, 0xa3, 0x68, 0x12, 0xf6, + 0x49, 0x20, 0x6a, 0x9e, 0x2a, 0xe2, 0xf2, 0x8d, 0x49, 0x50, 0x83, 0x91, 0x62, 0xff, 0x0c, 0x70, + 0x19, 0x9e, 0x70, 0x12, 0x72, 0x2e, 0x74, 0x9c, 0xe2, 0x3d, 0x58, 0x36, 0xb0, 0xcc, 0x51, 0x1d, + 0x23, 0x90, 0x73, 0x54, 0xc9, 0x2b, 0x11, 0x35, 0x6e, 0x0b, 0x16, 0xef, 0xf3, 0xf4, 0x41, 0x78, + 0x1c, 0xa9, 0x96, 0xbe, 0x5d, 0x85, 0x25, 0x0d, 0xc9, 0x86, 0x6e, 0xc0, 0x52, 0xd0, 0xe7, 0x61, + 0x1a, 0xa4, 0xd3, 0xae, 0x75, 0x90, 0xca, 0xc3, 0xe8, 0xcd, 0xf9, 0xc3, 0xc0, 0x57, 0xa1, 0x31, + 0x51, 0x60, 0x77, 0x60, 0x15, 0x4d, 0x8d, 0xb2, 0x1e, 0x7a, 0x8b, 0xc5, 0x79, 0xae, 0xb4, 0x0e, + 0x95, 0x01, 0xe2, 0x52, 0xdb, 0xeb, 0x4f, 0x84, 0x57, 0x53, 0x56, 0x85, 0xab, 0x26, 0x5a, 0xc2, + 0x29, 0xcf, 0x0a, 0x73, 0xa4, 0x81, 0x42, 0xbc, 0x69, 0x4e, 0xa8, 0xaa, 0x7c, 0xbc, 0xc9, 0x88, + 0x59, 0xd5, 0x0a, 0x31, 0x2b, 0x54, 0x65, 0xd3, 0xb0, 0xc7, 0xfb, 0xdd, 0x34, 0xea, 0x92, 0xca, + 0xa5, 0xdd, 0xa9, 0x79, 0x79, 0x98, 0xa2, 0x6b, 0x3c, 0x49, 0x43, 0x9e, 0x92, 0x56, 0xaa, 0x79, + 0xaa, 0x88, 0xd2, 0x45, 0x24, 0xc2, 0x80, 0xd4, 0x3d, 0x59, 0x42, 0xb7, 0x74, 0x12, 0x07, 0x49, + 0xbb, 0x49, 0x28, 0xfd, 0x66, 0x9f, 0x86, 0xb5, 0x23, 0x9e, 0xa4, 0xdd, 0x13, 0xee, 0xf7, 0x79, + 0x4c, 0xbb, 0x2f, 0x42, 0x61, 0xc2, 0xda, 0x97, 0x57, 0x62, 0xdf, 0xa7, 0x3c, 0x4e, 0x82, 0x28, + 0x24, 0x3b, 0x5f, 0xf7, 0x54, 0x11, 0xdb, 0xc3, 0x05, 0xd1, 0x36, 0x54, 0xaf, 0xea, 0x12, 0x2d, + 0x46, 0x79, 0xa5, 0xfb, 0x4d, 0xf2, 0xb9, 0x75, 0x68, 0xef, 0x09, 0x39, 0x0c, 0x78, 0x72, 0x12, + 0x2b, 0x93, 0x9c, 0xf8, 0xf2, 0x18, 0x50, 0x23, 0xe0, 0xf0, 0xc4, 0x47, 0x2d, 0x63, 0x2d, 0xb6, + 0x38, 0x59, 0x35, 0x08, 0xdb, 0x13, 0x6b, 0xfd, 0x16, 0x2c, 0xaa, 0xa0, 0x61, 0xd2, 0x1d, 0xf2, + 0xe3, 0x54, 0x9d, 0xee, 0xc3, 0xc9, 0x88, 0x8e, 0x5f, 0xfb, 0xfc, 0x38, 0x75, 0x1f, 0xc2, 0xb2, + 0x94, 0xfc, 0x47, 0x63, 0xae, 0xba, 0xfe, 0x6c, 0x99, 0x05, 0x3d, 0x27, 0x4c, 0x6a, 0x53, 0xba, + 0x1e, 0x30, 0x53, 0x93, 0xc8, 0x06, 0xa5, 0x19, 0x53, 0x31, 0x04, 0x39, 0x1d, 0x0b, 0xc3, 0x55, + 0x4d, 0x26, 0xbd, 0x9e, 0x0a, 0xfb, 0xd6, 0x3c, 0x55, 0x74, 0xbf, 0xe7, 0xc0, 0x0a, 0xb5, 0xa6, + 0x7c, 0x00, 0xa9, 0xad, 0xdf, 0xff, 0x11, 0x86, 0xd9, 0xec, 0x99, 0x71, 0x95, 0x55, 0x98, 0x35, + 0xf5, 0xb7, 0x28, 0xfc, 0xe8, 0x47, 0xe9, 0x6a, 0xe1, 0x28, 0xfd, 0x37, 0x0e, 0x2c, 0x0b, 0x15, + 0x9a, 0xfa, 0xe9, 0x24, 0x91, 0xd3, 0xff, 0x3f, 0xb0, 0x20, 0x6c, 0xa1, 0x14, 0x42, 0x39, 0xd0, + 0x55, 0xad, 0x2f, 0x08, 0x15, 0xc4, 0x7b, 0x97, 0x3c, 0x9b, 0x98, 0x7d, 0x1e, 0x9a, 0x66, 0xe4, + 0x97, 0xc6, 0xdc, 0xb8, 0x73, 0x59, 0xcd, 0xb2, 0xc0, 0x39, 0x7b, 0x97, 0x3c, 0xeb, 0x03, 0xf6, + 0x21, 0x39, 0x34, 0x61, 0x97, 0x9a, 0x95, 0xb1, 0xb3, 0xcb, 0x25, 0x6a, 0x5f, 0x7f, 0x6e, 0x90, + 0xdf, 0xad, 0xc1, 0x9c, 0xf0, 0x60, 0xdd, 0xfb, 0xb0, 0x60, 0x8d, 0xd4, 0x0a, 0x11, 0x34, 0x45, + 0x88, 0xa0, 0x10, 0x51, 0xaa, 0x14, 0x23, 0x4a, 0xee, 0x1f, 0xce, 0x00, 0x43, 0x6e, 0xcb, 0x6d, + 0x27, 0xba, 0xd0, 0x51, 0xdf, 0x3a, 0x10, 0x35, 0x3d, 0x13, 0x62, 0x37, 0x81, 0x19, 0x45, 0x15, + 0x74, 0x13, 0xd6, 0xa6, 0xa4, 0x06, 0xd5, 0xa2, 0x34, 0xd6, 0xd2, 0xac, 0xca, 0xa3, 0x9f, 0xd8, + 0xb7, 0xd2, 0x3a, 0x34, 0x28, 0xe3, 0x49, 0x72, 0x42, 0x37, 0x0c, 0xf2, 0xc8, 0xa4, 0xca, 0x79, + 0x06, 0x99, 0xbb, 0x90, 0x41, 0xe6, 0xf3, 0x0c, 0x62, 0x3a, 0xed, 0x35, 0xcb, 0x69, 0x47, 0x67, + 0x71, 0x84, 0x2e, 0x66, 0x3a, 0xec, 0x75, 0x47, 0xd8, 0xbb, 0x3c, 0x21, 0x59, 0x20, 0xdb, 0x84, + 0x96, 0x74, 0x2f, 0xb2, 0x93, 0x01, 0xd0, 0x1a, 0x17, 0x70, 0xd4, 0xd7, 0x59, 0x60, 0xa6, 0x41, + 0x83, 0xcd, 0x00, 0x3c, 0x4b, 0x25, 0xc8, 0x62, 0xdd, 0x49, 0x28, 0xb9, 0x85, 0xf7, 0xe9, 0x6c, + 0x54, 0xf3, 0x8a, 0x15, 0xee, 0x0f, 0x1d, 0x68, 0xe1, 0x9e, 0x59, 0x7c, 0xfd, 0x01, 0x90, 0x58, + 0xbd, 0x22, 0x5b, 0x5b, 0xb4, 0x3f, 0x39, 0x57, 0xbf, 0x0f, 0x75, 0x6a, 0x30, 0x1a, 0xf3, 0x50, + 0x32, 0x75, 0xdb, 0x66, 0xea, 0x4c, 0xa3, 0xed, 0x5d, 0xf2, 0x32, 0x62, 0x83, 0xa5, 0xff, 0xda, + 0x81, 0x86, 0x1c, 0xe6, 0x8f, 0x1d, 0x39, 0xe8, 0x18, 0xd7, 0x49, 0x82, 0x15, 0xb3, 0x9b, 0xa3, + 0x1b, 0xb0, 0x34, 0xf2, 0xd3, 0x49, 0x8c, 0x06, 0xdc, 0x8a, 0x1a, 0xe4, 0x61, 0xb4, 0xc6, 0xa4, + 0xbc, 0x93, 0x6e, 0x1a, 0x0c, 0xbb, 0xaa, 0x56, 0x5e, 0xda, 0x94, 0x55, 0xa1, 0x0e, 0x4b, 0x52, + 0x7f, 0xc0, 0xa5, 0xa1, 0x15, 0x05, 0xb7, 0x0d, 0xeb, 0x72, 0x42, 0x39, 0xdf, 0xd6, 0xfd, 0xb3, + 0x26, 0x6c, 0x14, 0xaa, 0xf4, 0x2d, 0xaf, 0x3c, 0x0e, 0x0f, 0x83, 0xd1, 0x51, 0xa4, 0x0f, 0x06, + 0x8e, 0x79, 0x52, 0xb6, 0xaa, 0xd8, 0x00, 0xd6, 0x94, 0x47, 0x81, 0x6b, 0x9a, 0x59, 0xba, 0x0a, + 0xb9, 0x42, 0xef, 0xda, 0x3c, 0x90, 0xef, 0x50, 0xe1, 0xa6, 0x16, 0x28, 0x6f, 0x8f, 0x9d, 0x40, + 0x5b, 0xbb, 0x2e, 0xd2, 0x5c, 0x18, 0xee, 0x0d, 0xf6, 0xf5, 0xce, 0x05, 0x7d, 0x59, 0xae, 0xb0, + 0x77, 0x6e, 0x6b, 0x6c, 0x0a, 0x57, 0x55, 0x1d, 0xd9, 0x83, 0x62, 0x7f, 0xd5, 0x57, 0x9a, 0x1b, + 0x39, 0xf9, 0x76, 0xa7, 0x17, 0x34, 0xcc, 0xbe, 0x0e, 0xeb, 0x67, 0x7e, 0x90, 0xaa, 0x61, 0x19, + 0x8e, 0xc3, 0x2c, 0x75, 0x79, 0xe7, 0x82, 0x2e, 0x9f, 0x8a, 0x8f, 0x2d, 0x23, 0x79, 0x4e, 0x8b, + 0x9d, 0xbf, 0x74, 0x60, 0xd1, 0x6e, 0x07, 0xd9, 0x54, 0x2a, 0x0f, 0xa5, 0x44, 0x95, 0xfb, 0x99, + 0x83, 0x8b, 0x67, 0xeb, 0x4a, 0xd9, 0xd9, 0xda, 0x3c, 0xd1, 0xce, 0x5c, 0x14, 0x76, 0xaa, 0xbe, + 0x5a, 0xd8, 0x69, 0xb6, 0x2c, 0xec, 0xd4, 0xf9, 0x77, 0x07, 0x58, 0x91, 0x97, 0xd8, 0x7d, 0x71, + 0xb8, 0x0f, 0xf9, 0x50, 0xea, 0xa4, 0xff, 0xfd, 0x6a, 0xfc, 0xa8, 0xd6, 0x4e, 0x7d, 0x8d, 0x82, + 0x61, 0x2a, 0x1d, 0xd3, 0xdd, 0x5a, 0xf0, 0xca, 0xaa, 0x72, 0x81, 0xb0, 0xea, 0xc5, 0x81, 0xb0, + 0xd9, 0x8b, 0x03, 0x61, 0x73, 0xf9, 0x40, 0x58, 0xe7, 0x57, 0x1c, 0x58, 0x29, 0xd9, 0xf4, 0x9f, + 0xde, 0xc4, 0x71, 0x9b, 0x2c, 0x5d, 0x50, 0x91, 0xdb, 0x64, 0x82, 0x9d, 0x9f, 0x87, 0x05, 0x8b, + 0xd1, 0x7f, 0x7a, 0xfd, 0xe7, 0x3d, 0x46, 0xc1, 0x67, 0x16, 0xd6, 0xf9, 0xe7, 0x0a, 0xb0, 0xa2, + 0xb0, 0xfd, 0x8f, 0x8e, 0xa1, 0xb8, 0x4e, 0x33, 0x25, 0xeb, 0xf4, 0xdf, 0x6a, 0x07, 0xde, 0x81, + 0x65, 0x99, 0x12, 0x62, 0x84, 0x74, 0x04, 0xc7, 0x14, 0x2b, 0xd0, 0x67, 0xb6, 0xa3, 0x90, 0x35, + 0xeb, 0x6a, 0xdd, 0x30, 0x86, 0xb9, 0x60, 0xa4, 0xbb, 0x0e, 0xab, 0x22, 0xc5, 0xe4, 0xae, 0x68, + 0x4a, 0xd9, 0x95, 0xdf, 0x75, 0x60, 0x2d, 0x57, 0x91, 0x5d, 0x04, 0x0b, 0xd3, 0x61, 0xdb, 0x13, + 0x1b, 0xc4, 0xf1, 0x6b, 0x37, 0x23, 0xc7, 0x6d, 0xc5, 0x0a, 0x5c, 0x1f, 0xc3, 0x2d, 0xc9, 0xad, + 0x7a, 0x59, 0x95, 0xbb, 0x21, 0x12, 0x61, 0x42, 0x3e, 0xcc, 0x0d, 0xfc, 0x58, 0xa4, 0xae, 0x98, + 0x15, 0xd9, 0x55, 0x90, 0x3d, 0x64, 0x55, 0x44, 0x8f, 0xd2, 0x32, 0x53, 0xf6, 0x78, 0x4b, 0xeb, + 0xdc, 0x1f, 0x38, 0xc0, 0xbe, 0x38, 0xe1, 0xf1, 0x94, 0x2e, 0x7b, 0x75, 0xac, 0x69, 0x23, 0x1f, + 0x49, 0x99, 0x1b, 0x4f, 0x8e, 0xbe, 0xc0, 0xa7, 0x2a, 0x6d, 0xa0, 0x92, 0xa5, 0x0d, 0xbc, 0x0e, + 0x80, 0x47, 0x39, 0x7d, 0x83, 0x4c, 0x9e, 0x5c, 0x38, 0x19, 0x89, 0x06, 0x4b, 0x6f, 0xf6, 0xab, + 0x17, 0xdf, 0xec, 0xcf, 0x5e, 0x74, 0xb3, 0xff, 0x21, 0xac, 0x58, 0xe3, 0xd6, 0xdb, 0xaa, 0xee, + 0xb2, 0x9d, 0x97, 0xdc, 0x65, 0xff, 0x5a, 0x05, 0x66, 0xf6, 0xa2, 0xb1, 0x19, 0x67, 0x75, 0xec, + 0x38, 0xab, 0xb4, 0x25, 0x5d, 0x6d, 0x2a, 0xa4, 0x8a, 0xb1, 0x40, 0xb6, 0x09, 0x8b, 0xfe, 0x28, + 0xc5, 0x83, 0xff, 0x71, 0x14, 0x9f, 0xf9, 0x71, 0x5f, 0xec, 0xf5, 0xdd, 0x4a, 0xdb, 0xf1, 0x72, + 0x35, 0x6c, 0x15, 0x66, 0xb4, 0xd2, 0x25, 0x02, 0x2c, 0xa2, 0xe3, 0x46, 0x77, 0x34, 0x53, 0x19, + 0xb3, 0x90, 0x25, 0x64, 0x25, 0xfb, 0x7b, 0xe1, 0x76, 0x0b, 0xd1, 0x29, 0xab, 0x42, 0xbb, 0x86, + 0xcb, 0x47, 0x64, 0x32, 0xd8, 0xa4, 0xca, 0x66, 0x60, 0xac, 0x66, 0xdf, 0x58, 0xfd, 0xa3, 0x03, + 0xb3, 0xb4, 0x36, 0xa8, 0x06, 0x04, 0xef, 0xeb, 0x50, 0x2b, 0xad, 0xc9, 0x82, 0x97, 0x87, 0x99, + 0x6b, 0x25, 0xde, 0x54, 0xf4, 0x84, 0xcc, 0xe4, 0x9b, 0x6b, 0x50, 0x17, 0x25, 0x9d, 0x64, 0x42, + 0x24, 0x19, 0xc8, 0xae, 0x42, 0xf5, 0x24, 0x1a, 0x2b, 0xbf, 0x05, 0xd4, 0x4d, 0x43, 0x34, 0xf6, + 0x08, 0xcf, 0xc6, 0x83, 0xed, 0x89, 0x69, 0x09, 0x6b, 0x94, 0x87, 0xd1, 0x1e, 0xeb, 0x66, 0xcd, + 0x65, 0xca, 0xa1, 0xee, 0x26, 0x2c, 0x3d, 0x8c, 0xfa, 0xdc, 0x88, 0x77, 0x9d, 0xcb, 0xe7, 0xee, + 0x2f, 0x38, 0x50, 0x53, 0xc4, 0xec, 0x06, 0x54, 0xd1, 0xc9, 0xc8, 0x1d, 0x21, 0xf4, 0x0d, 0x23, + 0xd2, 0x79, 0x44, 0x81, 0x5a, 0x99, 0xe2, 0x1a, 0x99, 0xc3, 0xa9, 0xa2, 0x1a, 0x99, 0x3f, 0xa5, + 0x87, 0x9b, 0x73, 0x43, 0x72, 0xa8, 0xfb, 0x7d, 0x07, 0x16, 0xac, 0x3e, 0xf0, 0x10, 0x3a, 0xf4, + 0x93, 0x54, 0xde, 0xda, 0xc8, 0xed, 0x31, 0x21, 0x73, 0xa3, 0x2b, 0x76, 0x04, 0x54, 0xc7, 0xe6, + 0x66, 0xcc, 0xd8, 0xdc, 0x6d, 0xa8, 0x67, 0xe9, 0x51, 0x55, 0x4b, 0xdb, 0x62, 0x8f, 0xea, 0xee, + 0x34, 0x23, 0xc2, 0x76, 0x7a, 0xd1, 0x30, 0x8a, 0xe5, 0x75, 0x81, 0x28, 0xb8, 0x1f, 0x42, 0xc3, + 0xa0, 0xc7, 0x61, 0x84, 0x3c, 0x3d, 0x8b, 0xe2, 0x67, 0x2a, 0x10, 0x2b, 0x8b, 0x3a, 0x7b, 0xa0, + 0x92, 0x65, 0x0f, 0xb8, 0x7f, 0xe1, 0xc0, 0x02, 0xf2, 0x60, 0x10, 0x0e, 0x0e, 0xa2, 0x61, 0xd0, + 0x9b, 0xd2, 0xde, 0x2b, 0x76, 0x93, 0x3a, 0x43, 0xf1, 0xa2, 0x0d, 0x23, 0xd7, 0xab, 0x33, 0xa8, + 0x14, 0x51, 0x5d, 0x46, 0x19, 0x46, 0x09, 0x38, 0xf2, 0x13, 0x29, 0x16, 0xd2, 0xfc, 0x59, 0x20, + 0x4a, 0x1a, 0x02, 0xb1, 0x9f, 0xf2, 0xee, 0x28, 0x18, 0x0e, 0x03, 0x41, 0x2b, 0x9c, 0xa3, 0xb2, + 0x2a, 0xec, 0xb3, 0x1f, 0x24, 0xfe, 0x51, 0x16, 0x02, 0xd7, 0x65, 0xf7, 0x4f, 0x2a, 0xd0, 0x90, + 0x8a, 0x7b, 0xb7, 0x3f, 0xe0, 0xf2, 0xbe, 0x86, 0xdc, 0x4f, 0xad, 0x64, 0x0c, 0x44, 0xd5, 0x5b, + 0x0e, 0xab, 0x81, 0xe4, 0xb7, 0x7c, 0xa6, 0xb8, 0xe5, 0x57, 0xa0, 0x8e, 0xac, 0xf7, 0x2e, 0x79, + 0xc6, 0xe2, 0xae, 0x27, 0x03, 0x54, 0xed, 0x1d, 0xaa, 0x9d, 0xcd, 0x6a, 0x09, 0x78, 0xe9, 0xed, + 0xce, 0xfb, 0xd0, 0x94, 0xcd, 0xd0, 0x9e, 0x90, 0x4e, 0xc9, 0x98, 0xdf, 0xda, 0x2f, 0xcf, 0xa2, + 0x54, 0x5f, 0xde, 0x51, 0x5f, 0xd6, 0x2e, 0xfa, 0x52, 0x51, 0xba, 0xf7, 0xf5, 0xa5, 0xd9, 0xfd, + 0xd8, 0x1f, 0x9f, 0x28, 0x29, 0xbd, 0x0d, 0x2b, 0x41, 0xd8, 0x1b, 0x4e, 0xfa, 0xbc, 0x3b, 0x09, + 0xfd, 0x30, 0x8c, 0x26, 0x61, 0x8f, 0xab, 0x9c, 0x81, 0xb2, 0x2a, 0xb7, 0xaf, 0x73, 0x95, 0xa8, + 0x21, 0xb6, 0x09, 0xb3, 0xd8, 0x91, 0xb2, 0x0a, 0xe5, 0x22, 0x2c, 0x48, 0xd8, 0x0d, 0x98, 0xe5, + 0xfd, 0x01, 0x57, 0xa7, 0x45, 0x66, 0x9f, 0xdb, 0x71, 0x57, 0x3d, 0x41, 0x80, 0x0a, 0x05, 0xd1, + 0x9c, 0x42, 0xb1, 0x2d, 0xca, 0x1c, 0x16, 0x1f, 0xf4, 0xdd, 0x55, 0x60, 0x0f, 0x85, 0x0c, 0x98, + 0xf1, 0xf6, 0x5f, 0x9e, 0x81, 0x86, 0x01, 0xa3, 0x6e, 0x18, 0xe0, 0x80, 0xbb, 0xfd, 0xc0, 0x1f, + 0xf1, 0x94, 0xc7, 0x92, 0xef, 0x73, 0x28, 0xd2, 0xf9, 0xa7, 0x83, 0x6e, 0x34, 0x49, 0xbb, 0x7d, + 0x3e, 0x88, 0xb9, 0x30, 0xf2, 0x68, 0x74, 0x2c, 0x14, 0xe9, 0x46, 0xfe, 0x73, 0x93, 0x4e, 0x70, + 0x50, 0x0e, 0x55, 0xd1, 0x73, 0xb1, 0x46, 0xd5, 0x2c, 0x7a, 0x2e, 0x56, 0x24, 0xaf, 0xd5, 0x66, + 0x4b, 0xb4, 0xda, 0x7b, 0xb0, 0x2e, 0xf4, 0x97, 0x94, 0xf4, 0x6e, 0x8e, 0xb1, 0xce, 0xa9, 0x65, + 0x9b, 0xd0, 0xc2, 0x31, 0x2b, 0x91, 0x48, 0x82, 0x6f, 0x8a, 0xc8, 0x94, 0xe3, 0x15, 0x70, 0xa4, + 0xa5, 0x10, 0x91, 0x49, 0x2b, 0x6e, 0x13, 0x0b, 0x38, 0xd1, 0xfa, 0xcf, 0x6d, 0xda, 0xba, 0xa4, + 0xcd, 0xe1, 0xee, 0x02, 0x34, 0x0e, 0xd3, 0x68, 0xac, 0x36, 0x65, 0x11, 0x9a, 0xa2, 0x28, 0x73, + 0x37, 0x5e, 0x83, 0xcb, 0xc4, 0x45, 0x8f, 0xa3, 0x71, 0x34, 0x8c, 0x06, 0xd3, 0xc3, 0xc9, 0x91, + 0x48, 0xda, 0x0d, 0xa2, 0xd0, 0xfd, 0x2b, 0x07, 0x56, 0xac, 0x5a, 0x19, 0x7e, 0xfa, 0xb4, 0x10, + 0x02, 0x7d, 0xe9, 0x2e, 0x18, 0x6f, 0xd9, 0x50, 0xae, 0x82, 0x50, 0x04, 0x11, 0x9f, 0xc8, 0x7b, + 0xf8, 0x2d, 0x58, 0x52, 0x23, 0x53, 0x1f, 0x0a, 0x2e, 0x6c, 0x17, 0xb9, 0x50, 0x7e, 0xbf, 0x28, + 0x3f, 0x50, 0x4d, 0xfc, 0x5f, 0x79, 0x2b, 0xdb, 0xa7, 0x39, 0xaa, 0x38, 0x84, 0xbe, 0x49, 0x33, + 0x4f, 0x23, 0x6a, 0x04, 0x3d, 0x0d, 0x26, 0xee, 0x6f, 0x38, 0x00, 0xd9, 0xe8, 0xe8, 0x2e, 0x4f, + 0x1b, 0x08, 0x91, 0x57, 0x6f, 0x18, 0x83, 0x37, 0xa1, 0xa9, 0xef, 0x80, 0x32, 0x9b, 0xd3, 0x50, + 0x18, 0x3a, 0x8c, 0xd7, 0x61, 0x69, 0x30, 0x8c, 0x8e, 0xc8, 0x60, 0x53, 0x32, 0x50, 0x22, 0x33, + 0x58, 0x16, 0x05, 0x7c, 0x4f, 0xa2, 0x99, 0x81, 0xaa, 0x1a, 0x06, 0xca, 0xfd, 0x56, 0x45, 0xdf, + 0x01, 0x64, 0x73, 0x3e, 0x57, 0xca, 0xd8, 0x9d, 0x82, 0x3a, 0x3d, 0x27, 0xe4, 0x4e, 0x11, 0xb7, + 0x83, 0x0b, 0x03, 0x02, 0x1f, 0xc2, 0x62, 0x2c, 0xf4, 0x95, 0x52, 0x66, 0xd5, 0x97, 0x28, 0xb3, + 0x85, 0xd8, 0xb2, 0x62, 0x9f, 0x84, 0x96, 0xdf, 0x3f, 0xe5, 0x71, 0x1a, 0xd0, 0x91, 0x8c, 0x5c, + 0x08, 0xa1, 0x82, 0x97, 0x0c, 0x9c, 0x2c, 0xfb, 0x75, 0x58, 0x92, 0x59, 0x43, 0x9a, 0x52, 0x26, + 0xca, 0x66, 0x30, 0x12, 0xba, 0xbf, 0xaf, 0xae, 0x1b, 0xec, 0x3d, 0x3c, 0x7f, 0x45, 0xcc, 0xd9, + 0x55, 0x72, 0xb3, 0xfb, 0x84, 0x0c, 0xfd, 0xf7, 0xd5, 0xb9, 0x6f, 0xc6, 0xb8, 0xc1, 0xef, 0xcb, + 0xab, 0x1a, 0x7b, 0x49, 0xab, 0xaf, 0xb2, 0xa4, 0xee, 0x0f, 0x1d, 0x98, 0xdf, 0x8b, 0xc6, 0x7b, + 0x32, 0x97, 0x81, 0x04, 0x41, 0xa7, 0xeb, 0xa9, 0xe2, 0x4b, 0xb2, 0x1c, 0x4a, 0x2d, 0xf7, 0x42, + 0xde, 0x72, 0xff, 0x3f, 0x78, 0x8d, 0xa2, 0x0e, 0x71, 0x34, 0x8e, 0x62, 0x14, 0x46, 0x7f, 0x28, + 0xcc, 0x74, 0x14, 0xa6, 0x27, 0x4a, 0x8d, 0xbd, 0x8c, 0x84, 0x8e, 0x77, 0x78, 0x2c, 0x11, 0x4e, + 0xb7, 0xf4, 0x34, 0x84, 0x76, 0x2b, 0x56, 0xb8, 0x9f, 0x85, 0x3a, 0xb9, 0xca, 0x34, 0xad, 0x77, + 0xa0, 0x7e, 0x12, 0x8d, 0xbb, 0x27, 0x41, 0x98, 0x2a, 0xe1, 0x5e, 0xcc, 0x7c, 0xd8, 0x3d, 0x5a, + 0x10, 0x4d, 0xe0, 0xfe, 0xf6, 0x2c, 0xcc, 0x3f, 0x08, 0x4f, 0xa3, 0xa0, 0x47, 0x37, 0x13, 0x23, + 0x3e, 0x8a, 0x54, 0xf2, 0x22, 0xfe, 0xc6, 0xa5, 0xa0, 0x6c, 0x9d, 0x71, 0x2a, 0xaf, 0x16, 0x54, + 0x11, 0x1d, 0x84, 0x38, 0x4b, 0x42, 0x16, 0xa2, 0x63, 0x20, 0x78, 0x80, 0x88, 0xcd, 0x24, 0x62, + 0x59, 0xca, 0xb2, 0x3f, 0x67, 0x8d, 0xec, 0x4f, 0xba, 0xc7, 0x12, 0x79, 0x17, 0xf2, 0x62, 0x5e, + 0x15, 0xe9, 0xc0, 0x13, 0x73, 0x11, 0x2d, 0x22, 0x57, 0x63, 0x5e, 0x1e, 0x78, 0x4c, 0x10, 0xdd, + 0x11, 0xf1, 0x81, 0xa0, 0x11, 0xca, 0xd7, 0x84, 0xd0, 0x75, 0xcb, 0xa7, 0x7c, 0xd7, 0x05, 0xcf, + 0xe7, 0x60, 0xd4, 0xd0, 0x7d, 0xae, 0x15, 0xa9, 0x98, 0x03, 0x88, 0x24, 0xeb, 0x3c, 0x6e, 0x1c, + 0x93, 0x44, 0x42, 0x95, 0x3a, 0x26, 0x21, 0xa3, 0xf8, 0xc3, 0xe1, 0x91, 0xdf, 0x7b, 0x46, 0x19, + 0xfd, 0x74, 0x47, 0x50, 0xf7, 0x6c, 0x90, 0x32, 0x27, 0xb2, 0xdd, 0xa4, 0xfb, 0xd3, 0xaa, 0x67, + 0x42, 0xec, 0x0e, 0x34, 0xe8, 0x68, 0x28, 0xf7, 0x73, 0x91, 0xf6, 0xb3, 0x65, 0x9e, 0x1d, 0x69, + 0x47, 0x4d, 0x22, 0xf3, 0xb6, 0x64, 0xc9, 0xbe, 0x2d, 0x11, 0x4a, 0x53, 0x5e, 0x32, 0xb5, 0xa8, + 0xb7, 0x0c, 0x40, 0x6b, 0x2a, 0x17, 0x4c, 0x10, 0x2c, 0x13, 0x81, 0x85, 0xb1, 0xab, 0x50, 0xc3, + 0x63, 0xcb, 0xd8, 0x0f, 0xfa, 0x6d, 0xa6, 0x4f, 0x4f, 0x1a, 0xc3, 0x36, 0xd4, 0x6f, 0xba, 0x0c, + 0x5a, 0xa1, 0x55, 0xb1, 0x30, 0x5c, 0x1b, 0x5d, 0x26, 0x21, 0x5a, 0x15, 0x3b, 0x6a, 0x81, 0x6e, + 0x0a, 0x6c, 0xab, 0xdf, 0x97, 0xbc, 0xa9, 0x8f, 0xd1, 0x19, 0x57, 0x39, 0x16, 0x57, 0x95, 0xec, + 0x6e, 0xa5, 0x7c, 0x77, 0x5f, 0xba, 0x06, 0xee, 0x2e, 0x34, 0x0e, 0x8c, 0x8c, 0x75, 0x62, 0x72, + 0x95, 0xab, 0x2e, 0x05, 0xc3, 0x40, 0x8c, 0xe1, 0x54, 0xcc, 0xe1, 0xb8, 0x7f, 0xe0, 0x88, 0xa4, + 0x5f, 0x3d, 0x7c, 0xd1, 0xb7, 0x0b, 0x4d, 0x1d, 0xec, 0xc8, 0x72, 0xc9, 0x2c, 0x0c, 0x69, 0x68, + 0x28, 0xdd, 0xe8, 0xf8, 0x38, 0xe1, 0x2a, 0xf3, 0xc3, 0xc2, 0x90, 0x43, 0xd1, 0xc7, 0x41, 0x7f, + 0x21, 0x10, 0x3d, 0x24, 0x32, 0x03, 0xa4, 0x80, 0xa3, 0x9e, 0x8d, 0xf9, 0x29, 0x8f, 0x13, 0x2d, + 0x5a, 0xba, 0xac, 0x53, 0xde, 0xf2, 0xab, 0xbc, 0x09, 0x35, 0xdd, 0xae, 0xad, 0x42, 0x14, 0xa5, + 0xae, 0x47, 0x55, 0x45, 0x5e, 0xbf, 0x35, 0x68, 0xa1, 0x36, 0x8b, 0x15, 0xec, 0x26, 0xb0, 0xe3, + 0x20, 0xce, 0x93, 0xcf, 0x10, 0x79, 0x49, 0x8d, 0xfb, 0x14, 0x56, 0x64, 0x97, 0xa6, 0x73, 0x63, + 0x6f, 0xa2, 0x73, 0x11, 0x23, 0x57, 0x8a, 0x8c, 0xec, 0xfe, 0x87, 0x03, 0xf3, 0x72, 0xa7, 0x0b, + 0xaf, 0x1e, 0xc4, 0x3e, 0x5b, 0x18, 0x6b, 0x5b, 0x49, 0xeb, 0xc4, 0xf5, 0x52, 0x75, 0x15, 0x14, + 0xd4, 0x4c, 0x99, 0x82, 0x62, 0x50, 0x1d, 0xfb, 0xe9, 0x09, 0x9d, 0x65, 0xeb, 0x1e, 0xfd, 0x66, + 0x2d, 0x11, 0x79, 0x11, 0x8a, 0x90, 0xa2, 0x2e, 0x65, 0xef, 0x3b, 0x84, 0xbd, 0x2d, 0xbe, 0xef, + 0xb8, 0x02, 0x75, 0x1a, 0x40, 0x37, 0x0b, 0xac, 0x64, 0x00, 0x72, 0xae, 0x28, 0x90, 0x84, 0xc9, + 0xd4, 0xd2, 0x0c, 0x71, 0xd7, 0xc4, 0xce, 0xcb, 0x25, 0xd0, 0xf7, 0x5d, 0x32, 0xc5, 0x30, 0x83, + 0x33, 0x8e, 0x90, 0x03, 0xc8, 0x73, 0x84, 0x24, 0xf5, 0x74, 0xbd, 0xdb, 0x81, 0xf6, 0x0e, 0x1f, + 0xf2, 0x94, 0x6f, 0x0d, 0x87, 0xf9, 0xf6, 0x5f, 0x83, 0xcb, 0x25, 0x75, 0xd2, 0x9f, 0xfd, 0x22, + 0xac, 0x6d, 0x89, 0x74, 0xac, 0x9f, 0x56, 0xce, 0x82, 0xdb, 0x86, 0xf5, 0x7c, 0x93, 0xb2, 0xb3, + 0x7b, 0xb0, 0xbc, 0xc3, 0x8f, 0x26, 0x83, 0x7d, 0x7e, 0x9a, 0x75, 0xc4, 0xa0, 0x9a, 0x9c, 0x44, + 0x67, 0x52, 0x30, 0xe9, 0x37, 0x7b, 0x1d, 0x60, 0x88, 0x34, 0xdd, 0x64, 0xcc, 0x7b, 0x2a, 0x85, + 0x9c, 0x90, 0xc3, 0x31, 0xef, 0xb9, 0xef, 0x01, 0x33, 0xdb, 0x91, 0xeb, 0x85, 0xf6, 0x68, 0x72, + 0xd4, 0x4d, 0xa6, 0x49, 0xca, 0x47, 0x2a, 0x37, 0xde, 0x84, 0xdc, 0xeb, 0xd0, 0x3c, 0xf0, 0xa7, + 0x1e, 0xff, 0x86, 0x7c, 0xec, 0xb2, 0x01, 0xf3, 0x63, 0x7f, 0x8a, 0x6a, 0x4a, 0x47, 0x7c, 0xa8, + 0xda, 0xfd, 0xb7, 0x0a, 0xcc, 0x09, 0x4a, 0x6c, 0xb5, 0xcf, 0x93, 0x34, 0x08, 0xc5, 0xed, 0xaf, + 0x6c, 0xd5, 0x80, 0x0a, 0xac, 0x5c, 0x29, 0x61, 0x65, 0x79, 0x6a, 0x52, 0xe9, 0xb8, 0x92, 0x5f, + 0x2d, 0x0c, 0x99, 0x2b, 0xcb, 0xeb, 0x11, 0x21, 0x87, 0x0c, 0xc8, 0x05, 0x07, 0x33, 0xab, 0x27, + 0xc6, 0xa7, 0xa4, 0x54, 0x72, 0xae, 0x09, 0x95, 0xda, 0xd6, 0x79, 0xc1, 0xe0, 0x05, 0xdb, 0x5a, + 0xb0, 0xa1, 0xb5, 0x57, 0xb0, 0xa1, 0xe2, 0x28, 0xf5, 0x32, 0x1b, 0x0a, 0xaf, 0x60, 0x43, 0x5d, + 0x06, 0xad, 0x7b, 0x9c, 0x7b, 0x1c, 0xbd, 0x33, 0xc5, 0xbb, 0xdf, 0x71, 0xa0, 0x25, 0xb9, 0x48, + 0xd7, 0xb1, 0x37, 0x2d, 0x2f, 0xb4, 0x34, 0x69, 0xf6, 0x2d, 0x58, 0x20, 0xdf, 0x50, 0x47, 0x41, + 0x65, 0xc8, 0xd6, 0x02, 0x71, 0x1e, 0xea, 0xaa, 0x6a, 0x14, 0x0c, 0xe5, 0xa6, 0x98, 0x90, 0x0a, + 0xa4, 0xc6, 0xbe, 0x4c, 0xa2, 0x71, 0x3c, 0x5d, 0x76, 0xff, 0xd4, 0x81, 0x65, 0x63, 0xc0, 0x92, + 0x0b, 0x3f, 0x04, 0x25, 0x0d, 0x22, 0x24, 0x2a, 0x24, 0x77, 0xc3, 0x16, 0x9b, 0xec, 0x33, 0x8b, + 0x98, 0x36, 0xd3, 0x9f, 0xd2, 0x00, 0x93, 0xc9, 0x48, 0x2a, 0x51, 0x13, 0x42, 0x46, 0x3a, 0xe3, + 0xfc, 0x99, 0x26, 0x11, 0x6a, 0xdc, 0xc2, 0x28, 0x41, 0x03, 0x7d, 0x5a, 0x4d, 0x24, 0xec, 0x99, + 0x0d, 0xba, 0x7f, 0xeb, 0xc0, 0x8a, 0x38, 0x9c, 0xc8, 0xa3, 0x9f, 0x7e, 0xd1, 0x30, 0x27, 0x4e, + 0x63, 0x42, 0x22, 0xf7, 0x2e, 0x79, 0xb2, 0xcc, 0x3e, 0xf3, 0x8a, 0x07, 0x2a, 0x9d, 0x98, 0x73, + 0xce, 0x5e, 0xcc, 0x94, 0xed, 0xc5, 0x4b, 0x56, 0xba, 0x2c, 0x04, 0x38, 0x5b, 0x1a, 0x02, 0xbc, + 0x3b, 0x0f, 0xb3, 0x49, 0x2f, 0x1a, 0x73, 0x77, 0x1d, 0x56, 0xed, 0xc9, 0x49, 0x15, 0xf4, 0x5d, + 0x07, 0xda, 0xf7, 0x44, 0xa8, 0x3c, 0x08, 0x07, 0x7b, 0x41, 0x92, 0x46, 0xb1, 0x7e, 0xdd, 0x75, + 0x15, 0x20, 0x49, 0xfd, 0x38, 0x15, 0xe9, 0x96, 0x32, 0x40, 0x97, 0x21, 0x38, 0x46, 0x1e, 0xf6, + 0x45, 0xad, 0xd8, 0x1b, 0x5d, 0x2e, 0xf8, 0x10, 0xf2, 0xf8, 0x64, 0x59, 0xe2, 0xb7, 0x45, 0xa6, + 0x1b, 0xfa, 0x0a, 0xfc, 0x94, 0xf4, 0xba, 0x38, 0x97, 0xe4, 0x50, 0xf7, 0x8f, 0x1c, 0x58, 0xca, + 0x06, 0xb9, 0x8b, 0xa0, 0xad, 0x1d, 0xa4, 0xf9, 0xcd, 0xb4, 0x83, 0x0a, 0x1d, 0x06, 0x68, 0x8f, + 0xe5, 0xd8, 0x0c, 0x84, 0x24, 0x56, 0x96, 0xa2, 0x89, 0x72, 0x70, 0x4c, 0x48, 0x64, 0x8d, 0xa0, + 0x27, 0x20, 0xbd, 0x1a, 0x59, 0xa2, 0x6c, 0xd9, 0x51, 0x4a, 0x5f, 0xcd, 0x89, 0x83, 0x99, 0x2c, + 0x2a, 0x53, 0x3a, 0x4f, 0x28, 0xfe, 0x74, 0xbf, 0xed, 0xc0, 0xe5, 0x92, 0xc5, 0x95, 0x92, 0xb1, + 0x03, 0xcb, 0xc7, 0xba, 0x52, 0x2d, 0x80, 0x10, 0x8f, 0x75, 0x75, 0xb7, 0x63, 0x4f, 0xda, 0x2b, + 0x7e, 0xa0, 0x7d, 0x1f, 0xb1, 0xa4, 0x56, 0xf2, 0x56, 0xb1, 0x62, 0xf3, 0x73, 0xd0, 0x30, 0x9e, + 0x55, 0xb1, 0x0d, 0x58, 0x79, 0xfa, 0xe0, 0xf1, 0xc3, 0xdd, 0xc3, 0xc3, 0xee, 0xc1, 0x93, 0xbb, + 0x5f, 0xd8, 0xfd, 0x72, 0x77, 0x6f, 0xeb, 0x70, 0xaf, 0x75, 0x89, 0xad, 0x03, 0x7b, 0xb8, 0x7b, + 0xf8, 0x78, 0x77, 0xc7, 0xc2, 0x9d, 0x3b, 0xbf, 0x39, 0x03, 0x8b, 0xe2, 0xce, 0x50, 0xbc, 0x5d, + 0xe7, 0x31, 0xfb, 0x08, 0xe6, 0xe5, 0x7f, 0x0f, 0xb0, 0x35, 0x39, 0x6c, 0xfb, 0xdf, 0x0e, 0x3a, + 0xeb, 0x79, 0x58, 0xf2, 0xde, 0xca, 0x2f, 0xfd, 0xf0, 0x1f, 0x7e, 0xab, 0xb2, 0xc0, 0x1a, 0xb7, + 0x4e, 0xdf, 0xbd, 0x35, 0xe0, 0x61, 0x82, 0x6d, 0xfc, 0x2c, 0x40, 0xf6, 0x2a, 0x9f, 0xb5, 0xb5, + 0xcf, 0x97, 0xfb, 0xbb, 0x81, 0xce, 0xe5, 0x92, 0x1a, 0xd9, 0xee, 0x65, 0x6a, 0x77, 0xc5, 0x5d, + 0xc4, 0x76, 0x83, 0x30, 0x48, 0xc5, 0x13, 0xfd, 0x0f, 0x9c, 0x4d, 0xd6, 0x87, 0xa6, 0xf9, 0xe8, + 0x9e, 0xa9, 0xd0, 0x4f, 0xc9, 0x93, 0xff, 0xce, 0x6b, 0xa5, 0x75, 0x2a, 0xee, 0x45, 0x7d, 0xac, + 0xb9, 0x2d, 0xec, 0x63, 0x42, 0x14, 0x59, 0x2f, 0x43, 0x58, 0xb4, 0xdf, 0xd6, 0xb3, 0x2b, 0x86, + 0x5a, 0x28, 0xbc, 0xec, 0xef, 0xbc, 0x7e, 0x4e, 0xad, 0xec, 0xeb, 0x75, 0xea, 0x6b, 0xc3, 0x65, + 0xd8, 0x57, 0x8f, 0x68, 0xd4, 0xcb, 0xfe, 0x0f, 0x9c, 0xcd, 0x3b, 0xff, 0xfa, 0x06, 0xd4, 0x75, + 0xb0, 0x96, 0x7d, 0x1d, 0x16, 0xac, 0x4b, 0x5d, 0xa6, 0xa6, 0x51, 0x76, 0x07, 0xdc, 0xb9, 0x52, + 0x5e, 0x29, 0x3b, 0xbe, 0x4a, 0x1d, 0xb7, 0xd9, 0x3a, 0x76, 0x2c, 0x6f, 0x45, 0x6f, 0xd1, 0x55, + 0xb6, 0xc8, 0xe5, 0x7d, 0x26, 0xe6, 0x99, 0x5d, 0xc4, 0x5a, 0xf3, 0x2c, 0x5c, 0xdc, 0x5a, 0xf3, + 0x2c, 0xde, 0xde, 0xba, 0x57, 0xa8, 0xbb, 0x75, 0xb6, 0x6a, 0x76, 0xa7, 0x83, 0xa8, 0x9c, 0xb2, + 0xaf, 0xcd, 0xa7, 0xe8, 0xec, 0x75, 0xcd, 0x58, 0x65, 0x4f, 0xd4, 0x35, 0x8b, 0x14, 0xdf, 0xa9, + 0xbb, 0x6d, 0xea, 0x8a, 0x31, 0xda, 0x3e, 0xf3, 0x25, 0x3a, 0xfb, 0x2a, 0xd4, 0xf5, 0x9b, 0x4a, + 0xb6, 0x61, 0x3c, 0x64, 0x35, 0x1f, 0x7a, 0x76, 0xda, 0xc5, 0x8a, 0x32, 0xc6, 0x30, 0x5b, 0x46, + 0xc6, 0x78, 0x0a, 0x0d, 0xe3, 0xdd, 0x24, 0xbb, 0xac, 0x43, 0xed, 0xf9, 0xb7, 0x99, 0x9d, 0x4e, + 0x59, 0x95, 0xec, 0x62, 0x99, 0xba, 0x68, 0xb0, 0x3a, 0xf1, 0x5e, 0xfa, 0x3c, 0x4a, 0xd8, 0x3e, + 0xac, 0xc9, 0xc3, 0xc9, 0x11, 0xff, 0x51, 0x96, 0xa8, 0xe4, 0x65, 0xfe, 0x6d, 0x87, 0x7d, 0x08, + 0x35, 0xf5, 0x06, 0x96, 0xad, 0x97, 0xbf, 0xe5, 0xed, 0x6c, 0x14, 0x70, 0xa9, 0xd6, 0xbe, 0x0c, + 0x90, 0x3d, 0xd2, 0xd4, 0x02, 0x5c, 0x78, 0xf4, 0xa9, 0x77, 0xa7, 0xf8, 0xa2, 0xd3, 0x5d, 0xa7, + 0x09, 0xb6, 0x18, 0x09, 0x70, 0xc8, 0xcf, 0xd4, 0x7b, 0x84, 0xaf, 0x41, 0xc3, 0x78, 0xa7, 0xa9, + 0x97, 0xaf, 0xf8, 0xc6, 0x53, 0x2f, 0x5f, 0xc9, 0xb3, 0x4e, 0xb7, 0x43, 0xad, 0xaf, 0xba, 0x4b, + 0xd8, 0x7a, 0x12, 0x0c, 0xc2, 0x91, 0x20, 0xc0, 0x0d, 0x3a, 0x81, 0x05, 0xeb, 0x31, 0xa6, 0x96, + 0x9e, 0xb2, 0xa7, 0x9e, 0x5a, 0x7a, 0x4a, 0xdf, 0x6f, 0x2a, 0x76, 0x76, 0x97, 0xb1, 0x9f, 0x53, + 0x22, 0x31, 0x7a, 0xfa, 0x0a, 0x34, 0x8c, 0x87, 0x95, 0xcc, 0xc8, 0x9f, 0xcc, 0x3d, 0xa9, 0xd4, + 0x73, 0x29, 0x7b, 0x87, 0xb9, 0x4a, 0x7d, 0x2c, 0xba, 0xc4, 0x0a, 0x94, 0xce, 0x8f, 0x6d, 0x7f, + 0x1d, 0x16, 0xed, 0xa7, 0x96, 0x5a, 0x2e, 0x4b, 0x1f, 0x6d, 0x6a, 0xb9, 0x3c, 0xe7, 0x7d, 0xa6, + 0x64, 0xe9, 0xcd, 0x15, 0xdd, 0xc9, 0xad, 0x8f, 0xe5, 0xd5, 0xe9, 0x0b, 0xf6, 0x45, 0x54, 0x3e, + 0xf2, 0x7d, 0x05, 0xdb, 0x30, 0xb8, 0xd6, 0x7c, 0x85, 0xa1, 0xe5, 0xa5, 0xf0, 0x14, 0xc3, 0x66, + 0x66, 0xf1, 0x20, 0x81, 0x2c, 0x0a, 0xbd, 0xb3, 0x30, 0x2c, 0x8a, 0xf9, 0x14, 0xc3, 0xb0, 0x28, + 0xd6, 0x73, 0x8c, 0xbc, 0x45, 0x49, 0x03, 0x6c, 0x23, 0x84, 0xa5, 0x5c, 0x02, 0x91, 0x96, 0x8a, + 0xf2, 0x8c, 0xcb, 0xce, 0xd5, 0x97, 0xe7, 0x1d, 0xd9, 0x8a, 0x4a, 0x29, 0xa8, 0x5b, 0x2a, 0x41, + 0xf6, 0xe7, 0xa0, 0x69, 0x3e, 0x91, 0x63, 0xa6, 0x28, 0xe7, 0x7b, 0x7a, 0xad, 0xb4, 0xce, 0xde, + 0x5c, 0xd6, 0x34, 0xbb, 0xc1, 0xcd, 0xb5, 0xdf, 0x08, 0x65, 0x4a, 0xb7, 0xec, 0x69, 0x54, 0xa6, + 0x74, 0x4b, 0x1f, 0x16, 0xa9, 0xcd, 0x65, 0x2b, 0xd6, 0x5c, 0x44, 0x94, 0x9b, 0x7d, 0x05, 0x96, + 0x8c, 0xec, 0xbc, 0xc3, 0x69, 0xd8, 0xd3, 0x8c, 0x5a, 0xcc, 0x03, 0xef, 0x94, 0xf9, 0xbe, 0xee, + 0x06, 0xb5, 0xbf, 0xec, 0x5a, 0x93, 0x40, 0x26, 0xdd, 0x86, 0x86, 0x99, 0xf9, 0xf7, 0x92, 0x76, + 0x37, 0x8c, 0x2a, 0x33, 0x8d, 0xf9, 0xb6, 0xc3, 0x7e, 0xc7, 0x81, 0xa6, 0x95, 0x47, 0x67, 0xdd, + 0xe5, 0xe4, 0xda, 0x69, 0x9b, 0x75, 0x66, 0x43, 0xae, 0x47, 0x83, 0xdc, 0xdf, 0xfc, 0xff, 0xd6, + 0x22, 0x7c, 0x6c, 0x9d, 0xa1, 0x6e, 0xe6, 0xff, 0x84, 0xe1, 0x45, 0x9e, 0xc0, 0xcc, 0x95, 0x7f, + 0x71, 0xdb, 0x61, 0xdf, 0x77, 0x60, 0xd1, 0x3e, 0xf9, 0xeb, 0xad, 0x2a, 0x8d, 0x31, 0xe8, 0xad, + 0x3a, 0x27, 0x5c, 0xf0, 0x15, 0x1a, 0xe5, 0xe3, 0x4d, 0xcf, 0x1a, 0xa5, 0x7c, 0x3d, 0xf6, 0x93, + 0x8d, 0x96, 0x7d, 0x20, 0xfe, 0x36, 0x45, 0x85, 0xa3, 0x98, 0xa1, 0xdd, 0xf3, 0xdb, 0x6b, 0xfe, + 0x67, 0xc8, 0x0d, 0xe7, 0xb6, 0xc3, 0xbe, 0x26, 0xfe, 0x17, 0x42, 0x7e, 0x4b, 0x5c, 0xf2, 0xaa, + 0xdf, 0xbb, 0x6f, 0xd1, 0x9c, 0xae, 0xba, 0x97, 0xad, 0x39, 0xe5, 0xed, 0xe6, 0x96, 0x18, 0x9d, + 0xfc, 0xbb, 0x8f, 0x4c, 0xf1, 0x17, 0xfe, 0x02, 0xe4, 0xfc, 0x41, 0x8e, 0xc4, 0x20, 0x25, 0xb9, + 0xc5, 0xca, 0xaf, 0xd8, 0x8c, 0xbb, 0x49, 0x63, 0x7d, 0xcb, 0x7d, 0xe3, 0xdc, 0xb1, 0xde, 0xa2, + 0xf3, 0x3b, 0x8e, 0xf8, 0x00, 0x20, 0x0b, 0x1d, 0xb3, 0x5c, 0xe8, 0x52, 0xdb, 0xbe, 0x62, 0x74, + 0xd9, 0x96, 0x17, 0x15, 0xe1, 0xc4, 0x16, 0xbf, 0x2a, 0xd4, 0xca, 0x03, 0x15, 0xf4, 0x34, 0x9d, + 0x07, 0x3b, 0xc6, 0x6b, 0x39, 0x0f, 0xf9, 0xf6, 0x2d, 0xa5, 0xa2, 0x23, 0xa8, 0x4f, 0x60, 0x61, + 0x3f, 0x8a, 0x9e, 0x4d, 0xc6, 0xfa, 0x22, 0xc6, 0x0e, 0xad, 0xed, 0xf9, 0xc9, 0x49, 0x27, 0x37, + 0x0b, 0xf7, 0x1a, 0x35, 0xd5, 0x61, 0x6d, 0xa3, 0xa9, 0x5b, 0x1f, 0x67, 0xa1, 0xe9, 0x17, 0xcc, + 0x87, 0x65, 0xed, 0x96, 0xe8, 0x81, 0x77, 0xec, 0x66, 0xcc, 0xa0, 0x6a, 0xa1, 0x0b, 0xcb, 0x03, + 0x55, 0xa3, 0xbd, 0x95, 0xa8, 0x36, 0x6f, 0x3b, 0xec, 0x00, 0x9a, 0x3b, 0xbc, 0x17, 0xf5, 0xb9, + 0x8c, 0x4f, 0xad, 0x64, 0x03, 0xd7, 0x81, 0xad, 0xce, 0x82, 0x05, 0xda, 0xfa, 0x7b, 0xec, 0x4f, + 0x63, 0xfe, 0x8d, 0x5b, 0x1f, 0xcb, 0xc8, 0xd7, 0x0b, 0xa5, 0xbf, 0x55, 0x68, 0xd0, 0xd2, 0xdf, + 0xb9, 0x58, 0xa2, 0xa5, 0xbf, 0x0b, 0xb1, 0x44, 0x6b, 0xa9, 0x55, 0x68, 0x92, 0x0d, 0x61, 0xb9, + 0x10, 0x7e, 0x64, 0x6f, 0x28, 0x0b, 0x7c, 0x4e, 0xd0, 0xb2, 0x73, 0xed, 0x7c, 0x02, 0xbb, 0xb7, + 0x4d, 0xbb, 0xb7, 0x43, 0x58, 0xd8, 0xe1, 0x62, 0xb1, 0x44, 0xb6, 0x47, 0xee, 0xd9, 0xa8, 0x99, + 0x4b, 0x92, 0x57, 0xe0, 0x54, 0x67, 0x1b, 0x68, 0x4a, 0xb5, 0x60, 0x5f, 0x85, 0xc6, 0x7d, 0x9e, + 0xaa, 0xf4, 0x0e, 0xed, 0x22, 0xe6, 0xf2, 0x3d, 0x3a, 0x25, 0xd9, 0x21, 0x36, 0xcf, 0x50, 0x6b, + 0xb7, 0x78, 0x7f, 0xc0, 0x85, 0x72, 0xea, 0x06, 0xfd, 0x17, 0xec, 0x67, 0xa8, 0x71, 0x9d, 0x5f, + 0xb6, 0x6e, 0x64, 0x05, 0x98, 0x8d, 0x2f, 0xe5, 0xf0, 0xb2, 0x96, 0xc3, 0xa8, 0xcf, 0x0d, 0x57, + 0x25, 0x84, 0x86, 0x91, 0x16, 0xa9, 0x05, 0xa8, 0x98, 0xe2, 0xa9, 0x05, 0xa8, 0x24, 0x8b, 0xd2, + 0xbd, 0x41, 0xfd, 0xb8, 0xec, 0x5a, 0xd6, 0x8f, 0xc8, 0x9c, 0xcc, 0x7a, 0xba, 0xf5, 0xb1, 0x3f, + 0x4a, 0x5f, 0xb0, 0xa7, 0xf4, 0x84, 0xd4, 0x4c, 0x61, 0xc9, 0x7c, 0xde, 0x7c, 0xb6, 0x8b, 0x5e, + 0x2c, 0xa3, 0xca, 0xf6, 0x83, 0x45, 0x57, 0xe4, 0xd1, 0x7c, 0x06, 0xe0, 0x30, 0x8d, 0xc6, 0x3b, + 0x3e, 0x1f, 0x45, 0x61, 0xa6, 0x6b, 0xb3, 0x34, 0x8d, 0x4c, 0x7f, 0x19, 0xb9, 0x1a, 0xec, 0xa9, + 0x71, 0x48, 0xb0, 0x32, 0x80, 0x14, 0x73, 0x9d, 0x9b, 0xc9, 0xa1, 0x17, 0xa4, 0x24, 0x9b, 0xe3, + 0xb6, 0xc3, 0xb6, 0x00, 0xb2, 0xf8, 0xb3, 0x76, 0xf9, 0x0b, 0xa1, 0x6d, 0xad, 0xf6, 0x4a, 0x82, + 0xd5, 0x07, 0x50, 0xcf, 0x02, 0x9a, 0x1b, 0x59, 0x6a, 0xab, 0x15, 0xfe, 0xd4, 0x16, 0xbc, 0x10, + 0x66, 0x74, 0x5b, 0xb4, 0x54, 0xc0, 0x6a, 0xb8, 0x54, 0x14, 0x3b, 0x0c, 0x60, 0x45, 0x0c, 0x50, + 0xbb, 0x23, 0x94, 0x78, 0xa0, 0x66, 0x52, 0x12, 0xea, 0xd3, 0xd2, 0x5c, 0x1a, 0x29, 0xb3, 0xa2, + 0x0a, 0xc8, 0xad, 0x22, 0xe9, 0x01, 0x55, 0xf3, 0x08, 0x96, 0x0b, 0x61, 0x1e, 0x2d, 0xd2, 0xe7, + 0x45, 0xd7, 0xb4, 0x48, 0x9f, 0x1b, 0x21, 0x72, 0xd7, 0xa8, 0xcb, 0x25, 0x17, 0xe8, 0xa4, 0x72, + 0x16, 0xa4, 0xbd, 0x93, 0x0f, 0x9c, 0xcd, 0xa3, 0x39, 0xfa, 0x5b, 0xc9, 0x4f, 0xfd, 0x57, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x4f, 0xaa, 0x41, 0x44, 0x88, 0x52, 0x00, 0x00, } diff --git a/lnrpc/rpc.pb.gw.go b/lnrpc/rpc.pb.gw.go index b65363159..c1a1b219b 100644 --- a/lnrpc/rpc.pb.gw.go +++ b/lnrpc/rpc.pb.gw.go @@ -124,6 +124,23 @@ func request_Lightning_SendCoins_0(ctx context.Context, marshaler runtime.Marsha } +var ( + filter_Lightning_ListUnspent_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Lightning_ListUnspent_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListUnspentRequest + var metadata runtime.ServerMetadata + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_ListUnspent_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ListUnspent(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + var ( filter_Lightning_NewAddress_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -1018,6 +1035,35 @@ func RegisterLightningHandler(ctx context.Context, mux *runtime.ServeMux, conn * }) + mux.Handle("GET", pattern_Lightning_ListUnspent_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Lightning_ListUnspent_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_ListUnspent_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_Lightning_NewAddress_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(ctx) defer cancel() @@ -1900,6 +1946,8 @@ var ( pattern_Lightning_SendCoins_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "transactions"}, "")) + pattern_Lightning_ListUnspent_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "utxos"}, "")) + pattern_Lightning_NewAddress_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "newaddress"}, "")) pattern_Lightning_SignMessage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "signmessage"}, "")) @@ -1970,6 +2018,8 @@ var ( forward_Lightning_SendCoins_0 = runtime.ForwardResponseMessage + forward_Lightning_ListUnspent_0 = runtime.ForwardResponseMessage + forward_Lightning_NewAddress_0 = runtime.ForwardResponseMessage forward_Lightning_SignMessage_0 = runtime.ForwardResponseMessage diff --git a/lnrpc/rpc.proto b/lnrpc/rpc.proto index f1ebe9b9c..822df25c1 100644 --- a/lnrpc/rpc.proto +++ b/lnrpc/rpc.proto @@ -231,6 +231,16 @@ service Lightning { }; } + /** lncli: `listunspent` + ListUnspent returns a list of all utxos spendable by the wallet with a + number of confirmations between the specified minimum and maximum. + */ + rpc ListUnspent (ListUnspentRequest) returns (ListUnspentResponse) { + option (google.api.http) = { + get: "/v1/utxos" + }; + } + /** SubscribeTransactions creates a uni-directional stream from the server to the client in which any newly discovered transactions relevant to the @@ -657,6 +667,28 @@ service Lightning { }; } +message Utxo { + /// The type of address + AddressType type = 1 [json_name = "address_type"]; + + /// The address + string address = 2 [json_name = "address"]; + + /// The value of the unspent coin in satoshis + int64 amount_sat = 3 [json_name = "amount_sat"]; + + /// The scriptpubkey in hex + string script_pubkey = 4 [json_name = "script_pubkey"]; + + /// The outpoint in format txid:n + /// Note that this reuses the `ChannelPoint` message but + /// is not actually a channel related outpoint, of course + ChannelPoint outpoint = 5 [json_name = "outpoint"]; + + /// The number of confirmations for the Utxo + int64 confirmations = 6 [json_name = "confirmations"]; +} + message Transaction { /// The transaction hash string tx_hash = 1 [ json_name = "tx_hash" ]; @@ -808,18 +840,31 @@ message SendCoinsResponse { string txid = 1 [json_name = "txid"]; } +message ListUnspentRequest { + /// The minimum number of confirmations to be included. + int32 min_confs = 1; + + /// The maximum number of confirmations to be included. + int32 max_confs = 2; +} +message ListUnspentResponse { + /// A list of utxos + repeated Utxo utxos = 1 [json_name = "utxos"]; + +} + /** `AddressType` has to be one of: - `p2wkh`: Pay to witness key hash (`WITNESS_PUBKEY_HASH` = 0) - `np2wkh`: Pay to nested witness key hash (`NESTED_PUBKEY_HASH` = 1) */ -message NewAddressRequest { - enum AddressType { +enum AddressType { WITNESS_PUBKEY_HASH = 0; NESTED_PUBKEY_HASH = 1; - } +} +message NewAddressRequest { /// The address type AddressType type = 1; } diff --git a/lnrpc/rpc.swagger.json b/lnrpc/rpc.swagger.json index 2a223f053..918bd078f 100644 --- a/lnrpc/rpc.swagger.json +++ b/lnrpc/rpc.swagger.json @@ -1051,6 +1051,41 @@ ] } }, + "/v1/utxos": { + "get": { + "summary": "* lncli: `listunspent`\nListUnspent returns a list of all utxos spendable by the wallet with a\nnumber of confirmations between the specified minimum and maximum.", + "operationId": "ListUnspent", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/lnrpcListUnspentResponse" + } + } + }, + "parameters": [ + { + "name": "min_confs", + "description": "/ The minimum number of confirmations to be included.", + "in": "query", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "max_confs", + "description": "/ The maximum number of confirmations to be included.", + "in": "query", + "required": false, + "type": "integer", + "format": "int32" + } + ], + "tags": [ + "Lightning" + ] + } + }, "/v1/verifymessage": { "post": { "summary": "* lncli: `verifymessage`\nVerifyMessage verifies a signature over a msg. The signature must be\nzbase32 encoded and signed by an active node in the resident node's\nchannel database. In addition to returning the validity of the signature,\nVerifyMessage also returns the recovered pubkey from the signature.", @@ -1231,6 +1266,16 @@ } } }, + "lnrpcAddressType": { + "type": "string", + "enum": [ + "WITNESS_PUBKEY_HASH", + "NESTED_PUBKEY_HASH" + ], + "default": "WITNESS_PUBKEY_HASH", + "description": "- `p2wkh`: Pay to witness key hash (`WITNESS_PUBKEY_HASH` = 0)\n- `np2wkh`: Pay to nested witness key hash (`NESTED_PUBKEY_HASH` = 1)", + "title": "* \n`AddressType` has to be one of:" + }, "lnrpcChangePasswordRequest": { "type": "object", "properties": { @@ -2194,6 +2239,18 @@ } } }, + "lnrpcListUnspentResponse": { + "type": "object", + "properties": { + "utxos": { + "type": "array", + "items": { + "$ref": "#/definitions/lnrpcUtxo" + }, + "title": "/ A list of utxos" + } + } + }, "lnrpcNetworkInfo": { "type": "object", "properties": { @@ -2919,6 +2976,37 @@ "lnrpcUnlockWalletResponse": { "type": "object" }, + "lnrpcUtxo": { + "type": "object", + "properties": { + "type": { + "$ref": "#/definitions/lnrpcAddressType", + "title": "/ The type of address" + }, + "address": { + "type": "string", + "title": "/ The address" + }, + "amount_sat": { + "type": "string", + "format": "int64", + "title": "/ The value of the unspent coin in satoshis" + }, + "script_pubkey": { + "type": "string", + "title": "/ The scriptpubkey in hex" + }, + "outpoint": { + "$ref": "#/definitions/lnrpcChannelPoint", + "title": "/ The outpoint in format txid:n\n/ Note that this reuses the `ChannelPoint` message but\n/ is not actually a channel related outpoint, of course" + }, + "confirmations": { + "type": "string", + "format": "int64", + "title": "/ The number of confirmations for the Utxo" + } + } + }, "lnrpcVerifyMessageRequest": { "type": "object", "properties": { diff --git a/lntest/harness.go b/lntest/harness.go index 9c527d6ac..030bbb0a0 100644 --- a/lntest/harness.go +++ b/lntest/harness.go @@ -173,7 +173,7 @@ func (n *NetworkHarness) SetUp(lndArgs []string) error { // each. ctxb := context.Background() addrReq := &lnrpc.NewAddressRequest{ - Type: lnrpc.NewAddressRequest_WITNESS_PUBKEY_HASH, + Type: lnrpc.AddressType_WITNESS_PUBKEY_HASH, } clients := []lnrpc.LightningClient{n.Alice, n.Bob} for _, client := range clients { @@ -1200,7 +1200,7 @@ func (n *NetworkHarness) SendCoins(ctx context.Context, amt btcutil.Amount, target *HarnessNode) error { return n.sendCoins( - ctx, amt, target, lnrpc.NewAddressRequest_WITNESS_PUBKEY_HASH, + ctx, amt, target, lnrpc.AddressType_WITNESS_PUBKEY_HASH, true, ) } @@ -1212,7 +1212,7 @@ func (n *NetworkHarness) SendCoinsUnconfirmed(ctx context.Context, amt btcutil.Amount, target *HarnessNode) error { return n.sendCoins( - ctx, amt, target, lnrpc.NewAddressRequest_WITNESS_PUBKEY_HASH, + ctx, amt, target, lnrpc.AddressType_WITNESS_PUBKEY_HASH, false, ) } @@ -1223,7 +1223,7 @@ func (n *NetworkHarness) SendCoinsNP2WKH(ctx context.Context, amt btcutil.Amount, target *HarnessNode) error { return n.sendCoins( - ctx, amt, target, lnrpc.NewAddressRequest_NESTED_PUBKEY_HASH, + ctx, amt, target, lnrpc.AddressType_NESTED_PUBKEY_HASH, true, ) } @@ -1232,7 +1232,7 @@ func (n *NetworkHarness) SendCoinsNP2WKH(ctx context.Context, // targeted lightning node. The confirmed boolean indicates whether the // transaction that pays to the target should confirm. func (n *NetworkHarness) sendCoins(ctx context.Context, amt btcutil.Amount, - target *HarnessNode, addrType lnrpc.NewAddressRequest_AddressType, + target *HarnessNode, addrType lnrpc.AddressType, confirmed bool) error { balReq := &lnrpc.WalletBalanceRequest{} diff --git a/lnwallet/btcwallet/btcwallet.go b/lnwallet/btcwallet/btcwallet.go index ded8fb2f2..2449d968b 100644 --- a/lnwallet/btcwallet/btcwallet.go +++ b/lnwallet/btcwallet/btcwallet.go @@ -349,6 +349,7 @@ func (b *BtcWallet) ListUnspentWitness(minConfs, maxConfs int32) ( Hash: *txid, Index: output.Vout, }, + Confirmations: output.Confirmations, } witnessOutputs = append(witnessOutputs, utxo) } diff --git a/lnwallet/interface.go b/lnwallet/interface.go index bd566e048..62cd0fa39 100644 --- a/lnwallet/interface.go +++ b/lnwallet/interface.go @@ -52,6 +52,7 @@ var ( type Utxo struct { AddressType AddressType Value btcutil.Amount + Confirmations int64 PkScript []byte RedeemScript []byte WitnessScript []byte diff --git a/rpcserver.go b/rpcserver.go index 3456789a4..6572dd380 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -163,6 +163,10 @@ var ( Entity: "onchain", Action: "write", }}, + "/lnrpc.Lightning/ListUnspent": {{ + Entity: "onchain", + Action: "read", + }}, "/lnrpc.Lightning/SendMany": {{ Entity: "onchain", Action: "write", @@ -680,6 +684,87 @@ func determineFeePerKw(feeEstimator lnwallet.FeeEstimator, targetConf int32, } } +// ListUnspent returns useful information about each unspent output +// owned by the wallet, as reported by the underlying `ListUnspentWitness`; +// the information returned is: outpoint, amount in satoshis, address, +// address type, scriptPubKey in hex and number of confirmations. +// The result is filtered to contain outputs whose number of confirmations +// is between a minimum and maximum number of confirmations specified by the +// user, with 0 meaning unconfirmed. +func (r *rpcServer) ListUnspent(ctx context.Context, + in *lnrpc.ListUnspentRequest) (*lnrpc.ListUnspentResponse, error) { + minConfs := in.MinConfs + maxConfs := in.MaxConfs + + if minConfs < 0 { + return nil, fmt.Errorf("min confirmations must be >= 0") + } + if minConfs > maxConfs { + return nil, fmt.Errorf("max confirmations must be >= min " + + "confirmations") + } + + utxos, err := r.server.cc.wallet.ListUnspentWitness(minConfs, maxConfs) + if err != nil { + return nil, err + } + + resp := &lnrpc.ListUnspentResponse{Utxos: []*lnrpc.Utxo{}} + for _, utxo := range utxos { + // Translate lnwallet address type to gRPC proto address type: + var addrType lnrpc.AddressType + switch utxo.AddressType { + case lnwallet.WitnessPubKey: + addrType = lnrpc.AddressType_WITNESS_PUBKEY_HASH + case lnwallet.NestedWitnessPubKey: + addrType = lnrpc.AddressType_NESTED_PUBKEY_HASH + case lnwallet.UnknownAddressType: + rpcsLog.Warnf("[listunspent] utxo with address of unknown "+ + "type ignored: %v", utxo.OutPoint.String()) + continue + default: + return nil, fmt.Errorf("invalid utxo address type") + } + + outpoint := &lnrpc.ChannelPoint{ + FundingTxid: &lnrpc.ChannelPoint_FundingTxidStr{ + FundingTxidStr: utxo.OutPoint.Hash.String(), + }, + OutputIndex: utxo.OutPoint.Index, + } + + utxoResp := lnrpc.Utxo{ + Type: addrType, + AmountSat: int64(utxo.Value), + ScriptPubkey: hex.EncodeToString(utxo.PkScript), + Outpoint: outpoint, + Confirmations: utxo.Confirmations, + } + + _, outAddresses, _, err := txscript.ExtractPkScriptAddrs( + utxo.PkScript, activeNetParams.Params) + if err != nil { + return nil, err + } + + if len(outAddresses) != 1 { + return nil, fmt.Errorf("an output was unexpectedly multisig") + } + + utxoResp.Address = outAddresses[0].String() + resp.Utxos = append(resp.Utxos, &utxoResp) + } + + maxStr := "" + if maxConfs != math.MaxInt32 { + maxStr = " max=" + fmt.Sprintf("%d", maxConfs) + } + rpcsLog.Debugf("[listunspent] min=%v%v, generated utxos: %v", + minConfs, maxStr, utxos) + + return resp, nil +} + // SendCoins executes a request to send coins to a particular address. Unlike // SendMany, this RPC call only allows creating a single output at a time. func (r *rpcServer) SendCoins(ctx context.Context, @@ -743,9 +828,9 @@ func (r *rpcServer) NewAddress(ctx context.Context, // available address types. var addrType lnwallet.AddressType switch in.Type { - case lnrpc.NewAddressRequest_WITNESS_PUBKEY_HASH: + case lnrpc.AddressType_WITNESS_PUBKEY_HASH: addrType = lnwallet.WitnessPubKey - case lnrpc.NewAddressRequest_NESTED_PUBKEY_HASH: + case lnrpc.AddressType_NESTED_PUBKEY_HASH: addrType = lnwallet.NestedWitnessPubKey }